diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..818433ecc --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 000000000..e6491c8fe --- /dev/null +++ b/Doxyfile @@ -0,0 +1,1679 @@ +# Doxyfile 1.7.3 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "GNSS-SDR" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 0.1 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description for a project that appears at the top of each page and should give viewer a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "An Open Source GNSS Software Defined Receiver" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./docs + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even if there is only one candidate or it is obvious which candidate to choose by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [0,1..20]) +# that doxygen will group on one line in the generated HTML documentation. +# Note that a value of 0 will completely suppress the enum values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the mathjax.org site, so you can quickly see the result without installing +# MathJax, but it is strongly recommended to install a local copy of MathJax +# before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called Helvetica to the output +# directory and reference it in all dot files that doxygen generates. +# When you want a differently looking font you can specify the font name +# using DOT_FONTNAME. You need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = YES + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, svg, gif or svg. +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = YES + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/README b/README new file mode 100644 index 000000000..7931e90df --- /dev/null +++ b/README @@ -0,0 +1,65 @@ +How to set up the compilation environment for Ubuntu 9.10 and 10.04 + +- Download GNU Radio 3.3.0 from ftp://ftp.gnu.org/gnu/gnuradio +- Compile and install following the instructions at http://gnuradio.org/redmine/wiki/1/UbuntuInstall +- Install bjam with the command 'sudo apt-get install bjam' +- Install Boost.Build with the command 'sudo apt-get install boost-build' +- Add the system variable GNURADIO_330_ROOT with the location of the sources of gnuradio-3.3.0 +- Download gtest-1.4.0.tar.gz from http://code.google.com/p/googletest. +- Unpack gtest-1.4.0.tar.gz into some folder. +- From the folder containing gtest build the libraries and install them: + - GTEST$ ./configure + - GTEST$ make + - GTEST$ make check + - GTEST$ sudo make install +- Add the following line to your .bashrc: + - export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib +- Download glog-0.3.0.tar.gz from http://code.google.com/p/google-glog. +- Unpack glog-0.3.0.tar.gz into some folder. +- From the folder containing glog, build and install the libraries: + - GLOG$ ./configure + - GLOG$ make + - GLOG$ sudo make install + NOTE: THE LOG FILES ARE STORED BY DEFAULT /TMP/ +- Download gflags-1.3.tar.gz from http://code.google.com/p/google-gflags. +- Unpack gflags-1.3.tar.gz into some folder. +- From the folder containing gflags, build the libraries and install them: + - GFLAGS$ ./configure + - GFLAGS$ make + - GFLAGS$ sudo make install + +(11/12/2010) GSL AND CBLAS ARITHMETIC + +In order to compile the arithmetic tests, the GNU Scientific Library (GSL) library package is needed. +Install the ubuntu package with: + +sudo apt-get install libgsl0ldbl + + +To build the project type call bjam from the project root folder. + +PROFILING + +In order to do profiling, you'll have to install google-perftools library. +- Download google-perftools-1.5.tar.gz from http://code.google.com/p/google-perftools. +- Unpack google-perftools-1.5.tar.gz into some folder. +- From the folder containing google-perftools, build and install the libraries: + - PERFTOOLS$ ./configure + - PERFTOOLS$ make + - PERFTOOLS$ sudo make install + +Once google-perftools is installed, you can use the script "profiler" which is placed +in the root folder of MERCURIO sources. The script must be run as root since it makes use +of "nice". The result of the profiling are two files, mercurio.cpu.prof and mercurio.head.prof.0001.heap, +that contain the results for CPU and HEAP profiling. You can use google-perftools' script pprof +to analyze the recorded data. + +(Sample of .bashrc configuration) + +export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib +export GNURADIO_330_ROOT=/home/gnss/sdr/gnuradio-3.3.0 + + + + + diff --git a/conf/mercurio.conf b/conf/mercurio.conf new file mode 100644 index 000000000..1144a9d11 --- /dev/null +++ b/conf/mercurio.conf @@ -0,0 +1,94 @@ +; Sample for a configuration file for MERCURIO + +[mercurio] + +;######### CONTROL_THREAD CONFIG ############ +ControlThread.wait_for_flowgraph=false + +;######### SIGNAL_SOURCE CONFIG ############ +SignalSource.implementation=File_Signal_Source +;SignalSource.filename=/media/My Passport/spirent scenario 2/data/sc2_d8.dat +;SignalSource.filename=/home/luis/Project/signals/GPS_cap1.dat +SignalSource.filename=/media/My Passport/KINGSTON (G)/Project Luis/GPSL1_Fs_8MHz_ID_1_CN0_60.dat +SignalSource.item_type=gr_complex +SignalSource.sampling_frequency=8000000 +SignalSource.samples=0 +SignalSource.repeat=false +SignalSource.dump=false +SignalSource.enable_throttle_control=true + +;######### SIGNAL_CONDITIONER CONFIG ############ +SignalConditioner.implementation=Pass_Through +SignalConditioner.item_type=gr_complex +SignalConditioner.sample_freq_in=8000000 +SignalConditioner.sample_freq_out=8000000 +SignalConditioner.dump=false + +;######### CHANNELS CONFIGURATION CONFIG ############ +Channels.count=1 + +;######### ACQUISITION CONFIG ############ + +Acquisition.dump=false +Acquisition.dump_filename=./acq_dump.dat +Acquisition.item_type=gr_complex +Acquisition.fs_in=8000000 +Acquisition.if=0 +Acquisition.sampled_ms=1 + +;######### ACQUISITION 0 CONFIG ############ +Acquisition0.implementation=GPS_L1_CA_PCPS_Acquisition +Acquisition0.threshold=0.006 +Acquisition0.doppler_max=10000 +Acquisition0.doppler_step=250 +Acquisition0.satellite=1 +Acquisition0.repeat_satellite=true + +;######### ACQUISITION 1 CONFIG ############ +Acquisition1.implementation=GPS_L1_CA_GPS_SDR_Acquisition +Acquisition1.threshold=30 +Acquisition1.doppler_max=10000 +Acquisition1.doppler_step=250 +Acquisition1.satellite=16 +Acquisition1.repeat_satellite=true + +;######### ACQUISITION 2 CONFIG ############ +Acquisition2.implementation=GPS_L1_CA_TONG_PCPS_Acquisition +Acquisition2.threshold= +Acquisition2.doppler_max=10000 +Acquisition2.doppler_step=250 +Acquisition2.satellite=21 +Acquisition2.repeat_satellite=true + + +;######### ACQUISITION 3 CONFIG ############ +Acquisition3.implementation=GPS_L1_CA_PCPS_Acquisition +Acquisition3.threshold=105000 + + + +;######### TRACKING CONFIG ############ +Tracking.implementation=GPS_L1_CA_DLL_PLL_Tracking +Tracking.item_type=gr_complex +Tracking.vector_length=8000 +Tracking.fs_in=8000000 +Tracking.if=0 +Tracking.dump=true +Tracking.dump_filename=./trk_dump.dat + +;######### TELEMETRY DECODER CONFIG ############ +TelemetryDecoder.implementation=GPS_L1_CA_Telemetry_Decoder +TelemetryDecoder.item_type=gr_complex + +;######### OBSERVABLES CONFIG ############ +Observables.implementation=GPS_L1_CA_Observables +Observables.fs_in=8000000; + +;######### PVT CONFIG ############ +PVT.implementation=Pass_Through +PVT.item_type=gr_complex + +;######### OUTPUT_FILTER CONFIG ############ +OutputFilter.implementation=Null_Sink_Output_Filter +OutputFilter.filename=data/mercurio.dat +OutputFilter.item_type=gr_complex diff --git a/docs/gnss_sdr_eclipse_style.xml b/docs/gnss_sdr_eclipse_style.xml new file mode 100644 index 000000000..f20d9f88b --- /dev/null +++ b/docs/gnss_sdr_eclipse_style.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jamroot.jam b/jamroot.jam new file mode 100644 index 000000000..dcad194b7 --- /dev/null +++ b/jamroot.jam @@ -0,0 +1,50 @@ +import testing ; + +lib gtest ; +lib glog ; +lib gflags ; +lib gnuradio-core ; +lib gnuradio-usrp ; +lib profiler ; +lib gsl ; +lib gslcblas ; + +project : requirements +OMNITHREAD_POSIX +"-std=c++0x" +# src/utils +# src/utils/INIReader +src/algorithms/acquisition/adapters +src/algorithms/acquisition/gnuradio_blocks +src/algorithms/channel/adapters +src/algorithms/channel/gnuradio_blocks +src/algorithms/channel/libs +src/algorithms/conditioner/adapters +src/algorithms/conditioner/gnuradio_blocks +src/algorithms/libs +src/algorithms/observables/adapters +src/algorithms/observables/gnuradio_blocks +src/algorithms/observables/libs +src/algorithms/output_filter/adapters +src/algorithms/output_filter/gnuradio_blocks +src/algorithms/PVT/adapters +src/algorithms/PVT/gnuradio_blocks +src/algorithms/signal_source/adapters +src/algorithms/signal_source/gnuradio_blocks +src/algorithms/telemetry_decoder/adapters +src/algorithms/telemetry_decoder/gnuradio_blocks +src/algorithms/telemetry_decoder/libs +src/algorithms/tracking/adapters +src/algorithms/tracking/gnuradio_blocks +src/core/interfaces +src/core/libs +src/core/receiver +src/core/system_parameters +$GNURADIO_330_ROOT/gr-usrp/src +$GNURADIO_330_ROOT/gnuradio-core/src/lib/runtime +$GNURADIO_330_ROOT/gnuradio-core/src/lib/filter +$GNURADIO_330_ROOT/gnuradio-core/src/lib/io +$GNURADIO_330_ROOT/gnuradio-core/src/lib/general +$GNURADIO_330_ROOT/gnuradio-core/src/lib/gengen ; + +build-project src ; \ No newline at end of file diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_gps_sdr_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_gps_sdr_acquisition.cc new file mode 100644 index 000000000..ffd2aadb8 --- /dev/null +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_gps_sdr_acquisition.cc @@ -0,0 +1,307 @@ +/*! + * \file gps_l1_ca_gps_sdr_acquisition.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "gps_l1_ca_gps_sdr_acquisition.h" + +#include "configuration_interface.h" + +#include +#include +#include +#include +#include + +#include +#include + +using google::LogMessage; + +//! Constructor +GpsL1CaGpsSdrAcquisition::GpsL1CaGpsSdrAcquisition( + ConfigurationInterface* configuration, std::string role, + unsigned int in_streams, unsigned int out_streams, + gr_msg_queue_sptr queue) : + role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_( + queue) +{ + + std::string default_item_type = "gr_complex"; + std::string default_dump_filename = "./data/acquisition_"; + + DLOG(INFO) << "role " << role; + + item_type_ = configuration->property(role + ".item_type", + default_item_type); + //vector_length_ = configuration->property(role + ".vector_length", 2048); + + satellite_ = 0; + fs_in_ = configuration->property(role + ".fs_in", 2048000); + if_ = configuration->property(role + ".ifreq", 0); + dump_ = configuration->property(role + ".dump", false); + doppler_max_ = 0; + acquisition_ms_ = configuration->property(role + ".sampled_ms", 1); + dump_filename_ = configuration->property(role + ".dump_filename", + default_dump_filename); + + //vector_length_=ceil((float)fs_in_*((float)acquisition_ms_/1000)); + + //--- Find number of samples per spreading code ---------------------------- + const int32 _codeFreqBasis = 1023000; //Hz + const int32 _codeLength = 1023; + vector_length_ = round(fs_in_ / (_codeFreqBasis / _codeLength)); + + printf("vector_length_ %i\n\r", vector_length_); + + if (item_type_.compare("short") == 0) + { + item_size_ = sizeof(short); + acquisition_ss_ = gps_l1_ca_gps_sdr_make_acquisition_ss( + acquisition_ms_, if_, fs_in_, vector_length_, queue_, dump_, + dump_filename_); + stream_to_vector_ = gr_make_stream_to_vector(item_size_, 2 + * vector_length_); + + } + else if (item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + acquisition_cc_ = gps_l1_ca_gps_sdr_make_acquisition_cc( + acquisition_ms_, if_, fs_in_, vector_length_, queue_, dump_, + dump_filename_); + stream_to_vector_ = gr_make_stream_to_vector(item_size_, + vector_length_); + + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ << " unknown item type."; + } + + DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() + << ")"; + +} + +//! Destructor +GpsL1CaGpsSdrAcquisition::~GpsL1CaGpsSdrAcquisition() +{} + +//! Set satellite +void GpsL1CaGpsSdrAcquisition::set_satellite(unsigned int satellite) +{ + satellite_ = satellite; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_satellite(satellite_); + } + else + { + acquisition_ss_->set_satellite(satellite_); + } +} + + +//! Set channel +void GpsL1CaGpsSdrAcquisition::set_channel(unsigned int channel) +{ + channel_ = channel; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_channel(channel_); + } + else + { + acquisition_ss_->set_channel(channel_); + } +} + +//! Set acquisition threshold +void GpsL1CaGpsSdrAcquisition::set_threshold(float threshold) +{ + threshold_ = threshold; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_threshold(threshold_); + } + else + { + acquisition_ss_->set_threshold(threshold_); + } +} + +//! Set maximum Doppler shift +void GpsL1CaGpsSdrAcquisition::set_doppler_max(unsigned int doppler_max) +{ + doppler_max_ = doppler_max; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_doppler_max(doppler_max_); + } + else + { + acquisition_ss_->set_doppler_max(doppler_max_); + } +} + +//! Set Channel Queue +void GpsL1CaGpsSdrAcquisition::set_channel_queue( + concurrent_queue *channel_internal_queue) +{ + channel_internal_queue_ = channel_internal_queue; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_channel_queue(channel_internal_queue_); + } + else + { + acquisition_ss_->set_channel_queue(channel_internal_queue_); + } +} + +signed int GpsL1CaGpsSdrAcquisition::prn_code_phase() +{ + + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->prn_code_phase(); + } + else + { + return acquisition_ss_->prn_code_phase(); + } +} + +float GpsL1CaGpsSdrAcquisition::doppler_freq_shift() +{ + + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->doppler_freq_phase(); + } + else + { + return acquisition_ss_->doppler_freq_phase(); + } +} + +signed int GpsL1CaGpsSdrAcquisition::mag() +{ + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->mag(); + } + else + { + return acquisition_ss_->mag(); + } +} + +void GpsL1CaGpsSdrAcquisition::reset() +{ + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_active(true); + } + else + { + acquisition_ss_->set_active(true); + } +} + +unsigned long int GpsL1CaGpsSdrAcquisition::get_sample_stamp() +{ + + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->get_sample_stamp(); + } + else + { + return acquisition_ss_->get_sample_stamp(); + } +} + +void GpsL1CaGpsSdrAcquisition::connect(gr_top_block_sptr top_block) +{ + + if (item_type_.compare("gr_complex") == 0) + { + //top_block->connect(stream_to_vector_, 0, vector_to_stream_,0); + + top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); + //top_block->connect(acquisition_cc_, 0, vector_to_stream_, 0); + } + else + { + top_block->connect(stream_to_vector_, 0, acquisition_ss_, 0); + //top_block->connect(acquisition_ss_, 0, vector_to_stream_, 0); + } + +} + +void GpsL1CaGpsSdrAcquisition::disconnect(gr_top_block_sptr top_block) +{ + + if (item_type_.compare("gr_complex") == 0) + { + top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); + //top_block->disconnect(acquisition_cc_, 0, vector_to_stream_, 0); + } + else + { + top_block->disconnect(stream_to_vector_, 0, acquisition_ss_, 0); + //top_block->disconnect(acquisition_ss_, 0, vector_to_stream_, 0); + } +} + +gr_basic_block_sptr GpsL1CaGpsSdrAcquisition::get_left_block() +{ + return stream_to_vector_; +} + +gr_basic_block_sptr GpsL1CaGpsSdrAcquisition::get_right_block() +{ + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_; + } + else + { + return acquisition_ss_; + } + +} + diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_gps_sdr_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_gps_sdr_acquisition.h new file mode 100644 index 000000000..ddb2d5ba6 --- /dev/null +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_gps_sdr_acquisition.h @@ -0,0 +1,123 @@ +/*! + * \file gps_l1_ca_gps_sdr_acquisition.h + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_ACQUISITION_H_ +#define GNSS_SDR_ACQUISITION_H_ + +#include "acquisition_interface.h" + +#include "gps_l1_ca_gps_sdr_acquisition_cc.h" +#include "gps_l1_ca_gps_sdr_acquisition_ss.h" + +#include + +class ConfigurationInterface; + +/*! + * \brief Adapts the GPS-SDR acquisition implementation to + * an Acquisition Interface + * + * Derived from AcquisitionInterface, this class wraps the implementation + * of the acquisition algorithm proposed by Gregory Heckler at https://github.com/gps-sdr/gps-sdr + * + */ +class GpsL1CaGpsSdrAcquisition: public AcquisitionInterface +{ + +public: + + GpsL1CaGpsSdrAcquisition(ConfigurationInterface* configuration, + std::string role, unsigned int in_streams, + unsigned int out_streams, gr_msg_queue_sptr queue); + + virtual ~GpsL1CaGpsSdrAcquisition(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "Acquisition"; + } + size_t item_size() + { + return item_size_; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + + void set_satellite(unsigned int satellite); + void set_channel(unsigned int channel); + void set_threshold(float threshold); + void set_doppler_max(unsigned int doppler_max); + void set_channel_queue(concurrent_queue *channel_internal_queue); + signed int prn_code_phase(); + float doppler_freq_shift(); + signed int mag(); + void reset(); + unsigned long int get_sample_stamp(); + + //Not used in this implementation + void set_doppler_step(unsigned int doppler_step) + {}; + +private: + + gps_l1_ca_gps_sdr_acquisition_cc_sptr acquisition_cc_; + gps_l1_ca_gps_sdr_acquisition_ss_sptr acquisition_ss_; + gr_block_sptr stream_to_vector_; + gr_block_sptr complex_to_short_; + gr_block_sptr short_to_complex_; + size_t item_size_; + std::string item_type_; + unsigned int vector_length_; + unsigned int satellite_; + unsigned int channel_; + float threshold_; + unsigned int doppler_max_; + unsigned int acquisition_ms_; + long fs_in_; + long if_; + bool dump_; + std::string dump_filename_; + + std::string role_; + unsigned int in_streams_; + unsigned int out_streams_; + gr_msg_queue_sptr queue_; + concurrent_queue *channel_internal_queue_; +}; + +#endif diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc new file mode 100644 index 000000000..3c5bb6cc4 --- /dev/null +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc @@ -0,0 +1,254 @@ +/*! + * \file gps_l1_ca_pcps_acquisition.cc + * \brief Brief description of the file here + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "gps_l1_ca_pcps_acquisition.h" + +#include "configuration_interface.h" +#include +#include +#include +#include +#include +#include + +#include +#include + +using google::LogMessage; + +GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( + ConfigurationInterface* configuration, std::string role, + unsigned int in_streams, unsigned int out_streams, + gr_msg_queue_sptr queue) : + role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_( + queue) +{ + + std::string default_item_type = "gr_complex"; + std::string default_dump_filename = "./data/acquisition.dat"; + + DLOG(INFO) << "role " << role; + + item_type_ = configuration->property(role + ".item_type", + default_item_type); + + satellite_ = 0; + fs_in_ = configuration->property(role + ".fs_in", 2048000); + if_ = configuration->property(role + ".ifreq", 0); + dump_ = configuration->property(role + ".dump", false); + shift_resolution_ = configuration->property(role + ".doppler_max", 15); + sampled_ms_ = configuration->property(role + ".sampled_ms", 1); + dump_filename_ = configuration->property(role + ".dump_filename", + default_dump_filename); + + //--- Find number of samples per spreading code ---------------------------- + const signed int _codeFreqBasis = 1023000; //Hz + const signed int _codeLength = 1023; + std::cout << fs_in_ << " " << role << std::endl; + vector_length_ = round(fs_in_ / (_codeFreqBasis / _codeLength)); + + printf("vector_length_ %i\n\r", vector_length_); + + if (item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + acquisition_cc_ = gps_l1_ca_pcps_make_acquisition_cc(sampled_ms_, + shift_resolution_, if_, fs_in_, vector_length_, queue_, + dump_, dump_filename_); + stream_to_vector_ = gr_make_stream_to_vector(item_size_, + vector_length_); + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ + << " unknown acquisition item type"; + } + + DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() + << ")"; +} + +GpsL1CaPcpsAcquisition::~GpsL1CaPcpsAcquisition() +{ +} + +void GpsL1CaPcpsAcquisition::set_satellite(unsigned int satellite) +{ + satellite_ = satellite; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_satellite(satellite_); + } +} + +void GpsL1CaPcpsAcquisition::set_channel(unsigned int channel) +{ + channel_ = channel; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_channel(channel_); + } +} + +void GpsL1CaPcpsAcquisition::set_threshold(float threshold) +{ + threshold_ = threshold; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_threshold(threshold_); + } +} + +void GpsL1CaPcpsAcquisition::set_doppler_max(unsigned int doppler_max) +{ + doppler_max_ = doppler_max; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_doppler_max(doppler_max_); + } + +} + +void GpsL1CaPcpsAcquisition::set_doppler_step(unsigned int doppler_step) +{ + doppler_step_ = doppler_step; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_doppler_step(doppler_step_); + } + +} + +void GpsL1CaPcpsAcquisition::set_channel_queue( + concurrent_queue *channel_internal_queue) +{ + channel_internal_queue_ = channel_internal_queue; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_channel_queue(channel_internal_queue_); + } +} + +signed int GpsL1CaPcpsAcquisition::prn_code_phase() +{ + + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->prn_code_phase(); + } + else + { + return 0; + } +} + +unsigned long int GpsL1CaPcpsAcquisition::get_sample_stamp() +{ + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->get_sample_stamp(); + } + else + { + return 0; + } +} +float GpsL1CaPcpsAcquisition::doppler_freq_shift() +{ + + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->doppler_freq(); + } + else + { + return 0; + } +} + +signed int GpsL1CaPcpsAcquisition::mag() +{ + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->mag(); + } + else + { + return 0; + } +} + +void GpsL1CaPcpsAcquisition::reset() +{ + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_active(true); + } +} + +void GpsL1CaPcpsAcquisition::connect(gr_top_block_sptr top_block) +{ + + if (item_type_.compare("gr_complex") == 0) + { + top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); + } + +} + +void GpsL1CaPcpsAcquisition::disconnect(gr_top_block_sptr top_block) +{ + + if (item_type_.compare("gr_complex") == 0) + { + top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); + } +} + +gr_basic_block_sptr GpsL1CaPcpsAcquisition::get_left_block() +{ + return stream_to_vector_; +} + +gr_basic_block_sptr GpsL1CaPcpsAcquisition::get_right_block() +{ + return acquisition_cc_; +} + diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h new file mode 100644 index 000000000..3681b18de --- /dev/null +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h @@ -0,0 +1,117 @@ +/*! + * \file gps_l1_ca_pcps_acquisition.h + * \brief Brief description of the file here + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GPS_L1_CA_PCPS_ACQUISITION_H_ +#define GPS_L1_CA_PCPS_ACQUISITION_H_ + +#include "acquisition_interface.h" + +#include "gps_l1_ca_pcps_acquisition_cc.h" + +#include + +class ConfigurationInterface; + +class GpsL1CaPcpsAcquisition: public AcquisitionInterface +{ + +public: + + GpsL1CaPcpsAcquisition(ConfigurationInterface* configuration, + std::string role, unsigned int in_streams, + unsigned int out_streams, gr_msg_queue_sptr queue); + + virtual ~GpsL1CaPcpsAcquisition(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "Acquisition"; + } + size_t item_size() + { + return item_size_; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + + void set_satellite(unsigned int satellite); + void set_channel(unsigned int channel); + void set_threshold(float threshold); + void set_doppler_max(unsigned int doppler_max); + void set_doppler_step(unsigned int doppler_step); + void set_channel_queue(concurrent_queue *channel_internal_queue); + signed int prn_code_phase(); + float doppler_freq_shift(); + + unsigned long int get_sample_stamp(); + + signed int mag(); + void reset(); + +private: + + gps_l1_ca_pcps_acquisition_cc_sptr acquisition_cc_; + gr_block_sptr stream_to_vector_; + gr_block_sptr complex_to_short_; + gr_block_sptr short_to_complex_; + size_t item_size_; + std::string item_type_; + unsigned int vector_length_; + unsigned int satellite_; + unsigned int channel_; + float threshold_; + unsigned int doppler_max_; + unsigned int doppler_step_; + unsigned int shift_resolution_; + unsigned int sampled_ms_; + long fs_in_; + long if_; + bool dump_; + std::string dump_filename_; + + std::string role_; + unsigned int in_streams_; + unsigned int out_streams_; + gr_msg_queue_sptr queue_; + concurrent_queue *channel_internal_queue_; + +}; + +#endif /* GPS_L1_CA_PCPS_ACQUISITION_H_ */ diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_tong_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_tong_pcps_acquisition.cc new file mode 100644 index 000000000..997424046 --- /dev/null +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_tong_pcps_acquisition.cc @@ -0,0 +1,245 @@ +/*! + * \file gps_l1_ca_tong_pcps_acquisition.cc + * \brief Brief description of the file here + * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "gps_l1_ca_tong_pcps_acquisition.h" + +#include "configuration_interface.h" + +#include +#include +#include +#include +#include + +#include +#include + +using google::LogMessage; + +GpsL1CaTongPcpsAcquisition::GpsL1CaTongPcpsAcquisition( + ConfigurationInterface* configuration, std::string role, + unsigned int in_streams, unsigned int out_streams, + gr_msg_queue_sptr queue) : + role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_( + queue) +{ + + std::string default_item_type = "gr_complex"; + std::string default_dump_filename = "./data/acquisition.dat"; + + DLOG(INFO) << "role " << role; + + item_type_ = configuration->property(role + ".item_type", + default_item_type); + + std::cout << "item type " << item_type_ << std::endl; + + satellite_ = 0; + fs_in_ = configuration->property(role + ".fs_in", 2048000); + if_ = configuration->property(role + ".ifreq", 0); + dump_ = configuration->property(role + ".dump", false); + doppler_max_ = configuration->property(role + ".doppler_max", 10); + sampled_ms_ = configuration->property(role + ".sampled_ms", 1); + dump_filename_ = configuration->property(role + ".dump_filename", + default_dump_filename); + + //--- Find number of samples per spreading code ---------------------------- + const signed int _codeFreqBasis = 1023000; //Hz + const signed int _codeLength = 1023; + vector_length_ = round(fs_in_ / (_codeFreqBasis / _codeLength)); + + printf("vector_length_ %i\n\r", vector_length_); + + if (item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + acquisition_cc_ = gps_l1_ca_tong_pcps_make_acquisition_cc( + sampled_ms_, doppler_max_, if_, fs_in_, vector_length_, + queue_, dump_, dump_filename_); + stream_to_vector_ = gr_make_stream_to_vector(item_size_, + vector_length_); + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ + << " unknown acquisition item type"; + } + + DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() + << ")"; +} + +GpsL1CaTongPcpsAcquisition::~GpsL1CaTongPcpsAcquisition() +{ +} + +void GpsL1CaTongPcpsAcquisition::set_satellite(unsigned int satellite) +{ + satellite_ = satellite; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_satellite(satellite_); + } +} + +void GpsL1CaTongPcpsAcquisition::set_channel(unsigned int channel) +{ + channel_ = channel; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_channel(channel_); + } +} + +void GpsL1CaTongPcpsAcquisition::set_doppler_max(unsigned int doppler_max) +{ + doppler_max_ = doppler_max; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_doppler_max(doppler_max_); + } + +} + +void GpsL1CaTongPcpsAcquisition::set_doppler_step(unsigned int doppler_step) +{ + doppler_step_ = doppler_step; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_doppler_step(doppler_step_); + } + +} + +void GpsL1CaTongPcpsAcquisition::set_channel_queue( + concurrent_queue *channel_internal_queue) +{ + channel_internal_queue_ = channel_internal_queue; + + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_channel_queue(channel_internal_queue_); + } +} + +signed int GpsL1CaTongPcpsAcquisition::prn_code_phase() +{ + + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->prn_code_phase(); + } + else + { + return 0; + } +} + +unsigned long int GpsL1CaTongPcpsAcquisition::get_sample_stamp() +{ + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->get_sample_stamp(); + } + else + { + return 0; + } +} +float GpsL1CaTongPcpsAcquisition::doppler_freq_shift() +{ + + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->doppler_freq(); + } + else + { + return 0; + } +} + +signed int GpsL1CaTongPcpsAcquisition::mag() +{ + if (item_type_.compare("gr_complex") == 0) + { + return acquisition_cc_->mag(); + } + else + { + return 0; + } +} + +void GpsL1CaTongPcpsAcquisition::reset() +{ + if (item_type_.compare("gr_complex") == 0) + { + acquisition_cc_->set_active(true); + acquisition_cc_->set_dwells(0); + acquisition_cc_->set_doppler(0); + } +} + +void GpsL1CaTongPcpsAcquisition::connect(gr_top_block_sptr top_block) +{ + + if (item_type_.compare("gr_complex") == 0) + { + top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); + } + +} + +void GpsL1CaTongPcpsAcquisition::disconnect(gr_top_block_sptr top_block) +{ + + if (item_type_.compare("gr_complex") == 0) + { + top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); + } +} + +gr_basic_block_sptr GpsL1CaTongPcpsAcquisition::get_left_block() +{ + return stream_to_vector_; +} + +gr_basic_block_sptr GpsL1CaTongPcpsAcquisition::get_right_block() +{ + return acquisition_cc_; +} + diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_tong_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_tong_pcps_acquisition.h new file mode 100644 index 000000000..e0919175d --- /dev/null +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_tong_pcps_acquisition.h @@ -0,0 +1,119 @@ +/*! + * \file gps_l1_ca_tong_pcps_acquisition.h + * \brief Brief description of the file here + * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GPS_L1_CA_TONG_PCPS_ACQUISITION_H_ +#define GPS_L1_CA_TONG_PCPS_ACQUISITION_H_ + +#include "acquisition_interface.h" + +#include "gps_l1_ca_tong_pcps_acquisition_cc.h" + +#include + +class ConfigurationInterface; + +class GpsL1CaTongPcpsAcquisition: public AcquisitionInterface +{ + +public: + + GpsL1CaTongPcpsAcquisition(ConfigurationInterface* configuration, + std::string role, unsigned int in_streams, + unsigned int out_streams, gr_msg_queue_sptr queue); + + virtual ~GpsL1CaTongPcpsAcquisition(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "Acquisition"; + } + size_t item_size() + { + return item_size_; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + + void set_satellite(unsigned int satellite); + void set_channel(unsigned int channel); + void set_threshold(float threshold) + { + } + ; + void set_doppler_max(unsigned int doppler_max); + void set_doppler_step(unsigned int doppler_step); + void set_channel_queue(concurrent_queue *channel_internal_queue); + signed int prn_code_phase(); + float doppler_freq_shift(); + + unsigned long int get_sample_stamp(); + + signed int mag(); + void reset(); + +private: + + gps_l1_ca_tong_pcps_acquisition_cc_sptr acquisition_cc_; + gr_block_sptr stream_to_vector_; + gr_block_sptr complex_to_short_; + gr_block_sptr short_to_complex_; + size_t item_size_; + std::string item_type_; + unsigned int vector_length_; + unsigned int satellite_; + unsigned int channel_; + float threshold_; + unsigned int doppler_max_; + unsigned int doppler_step_; + unsigned int shift_resolution_; + unsigned int sampled_ms_; + long fs_in_; + long if_; + bool dump_; + std::string dump_filename_; + + std::string role_; + unsigned int in_streams_; + unsigned int out_streams_; + gr_msg_queue_sptr queue_; + concurrent_queue *channel_internal_queue_; + +}; + +#endif /* GPS_L1_CA_TONG_PCPS_ACQUISITION_H_ */ diff --git a/src/algorithms/acquisition/adapters/jamfile.jam b/src/algorithms/acquisition/adapters/jamfile.jam new file mode 100644 index 000000000..7f5ce5159 --- /dev/null +++ b/src/algorithms/acquisition/adapters/jamfile.jam @@ -0,0 +1,5 @@ +project : build-dir ../../../../build ; + +obj gps_l1_ca_gps_sdr_acquisition : gps_l1_ca_gps_sdr_acquisition.cc ; +obj gps_l1_ca_pcps_acquisition : gps_l1_ca_pcps_acquisition.cc ; +obj gps_l1_ca_tong_pcps_acquisition : gps_l1_ca_tong_pcps_acquisition.cc ; \ No newline at end of file diff --git a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_cc.cc new file mode 100644 index 000000000..a441f763c --- /dev/null +++ b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_cc.cc @@ -0,0 +1,330 @@ +/*! + * \file gps_l1_ca_gps_sdr_acquisition_cc.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gps_l1_ca_gps_sdr_acquisition_cc.h" +#include "control_message_factory.h" +#include "gps_sdr_x86.h" +#include +#include +#include +#include +#include + +using google::LogMessage; + +gps_l1_ca_gps_sdr_acquisition_cc_sptr gps_l1_ca_gps_sdr_make_acquisition_cc( + unsigned int sampled_ms, long freq, long fs_in, int samples_per_ms, + gr_msg_queue_sptr queue, bool dump, std::string dump_filename) +{ + + return gps_l1_ca_gps_sdr_acquisition_cc_sptr( + new gps_l1_ca_gps_sdr_acquisition_cc(sampled_ms, freq, fs_in, + samples_per_ms, queue, dump, dump_filename)); +} + +gps_l1_ca_gps_sdr_acquisition_cc::gps_l1_ca_gps_sdr_acquisition_cc( + unsigned int sampled_ms, long freq, long fs_in, int samples_per_ms, + gr_msg_queue_sptr queue, bool dump, std::string dump_filename) : + gr_block("gps_l1_ca_gps_sdr_acquisition_cc", gr_make_io_signature(1, 1, + sizeof(gr_complex) * samples_per_ms), gr_make_io_signature(0, 0, + sizeof(gr_complex) * samples_per_ms)) +{ + + // SAMPLE COUNTER + d_sample_counter = 0; + + d_active = false; + d_dump = dump; + d_queue = queue; + d_dump_filename = dump_filename; + + d_freq = freq; + d_fs_in = fs_in; + + d_samples_per_ms = samples_per_ms; + d_sampled_ms = sampled_ms; + + d_doppler_max = 0; + + d_satellite = 0; + + d_fft_size = d_sampled_ms * d_samples_per_ms; + + d_doppler_freq_phase = 0.0; + d_prn_code_phase = 0; + d_mag = 0; + d_mean = 0.0; + + d_count = 0; + + d_sine_if = new gr_complex[d_fft_size]; + d_sine_250 = new gr_complex[d_fft_size]; + d_sine_500 = new gr_complex[d_fft_size]; + d_sine_750 = new gr_complex[d_fft_size]; + + d_fft_codes = (gr_complex*)malloc(sizeof(gr_complex) * d_samples_per_ms); + + // Direct FFT + d_fft_if = new gri_fft_complex(d_fft_size, true); + d_fft_250 = new gri_fft_complex(d_fft_size, true); + d_fft_500 = new gri_fft_complex(d_fft_size, true); + d_fft_750 = new gri_fft_complex(d_fft_size, true); + + // Inverse FFT + d_ifft = new gri_fft_complex(d_fft_size, false); + + d_best_magnitudes = new float[d_fft_size]; + + sine_gen_complex(d_sine_if, -d_freq, d_fs_in, d_fft_size); + sine_gen_complex(d_sine_250, -d_freq - 250, d_fs_in, d_fft_size); + sine_gen_complex(d_sine_500, -d_freq - 500, d_fs_in, d_fft_size); + sine_gen_complex(d_sine_750, -d_freq - 750, d_fs_in, d_fft_size); + + DLOG(INFO) << "fs in " << d_fs_in; + DLOG(INFO) << "Doppler max " << d_doppler_max; + DLOG(INFO) << "IF " << d_freq; + DLOG(INFO) << "Satellite " << d_satellite; + DLOG(INFO) << "Sampled_ms " << d_sampled_ms; + DLOG(INFO) << "FFT_size " << d_fft_size; + DLOG(INFO) << "dump filename " << d_dump_filename; + DLOG(INFO) << "dump " << d_dump; +} + +gps_l1_ca_gps_sdr_acquisition_cc::~gps_l1_ca_gps_sdr_acquisition_cc() +{ + delete d_sine_if; + delete d_sine_250; + delete d_sine_500; + delete d_sine_750; + delete d_fft_codes; + delete d_fft_if; + delete d_fft_250; + delete d_fft_500; + delete d_fft_750; + + if (d_dump) + { + d_dump_file.close(); + } +} + +void gps_l1_ca_gps_sdr_acquisition_cc::set_satellite(unsigned int satellite) +{ + d_satellite = satellite; + d_prn_code_phase = 0; + d_doppler_freq_phase = 0; + d_mag = 0; + // Now the GPS codes are generated on the fly using a custom version of the GPS code generator + code_gen_complex_sampled(d_fft_if->get_inbuf(), satellite, d_fs_in, 0); + d_fft_if->execute(); // We need the FFT of GPS C/A code + memcpy(d_fft_codes, d_fft_if->get_outbuf(), sizeof(gr_complex) + * d_samples_per_ms); +} + +signed int gps_l1_ca_gps_sdr_acquisition_cc::prn_code_phase() +{ + return d_prn_code_phase; +} + +int gps_l1_ca_gps_sdr_acquisition_cc::general_work(int noutput_items, + gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + if (!d_active) + { + d_sample_counter += d_fft_size * noutput_items; // sample counter + consume_each(noutput_items); + return 0; + } + + d_sample_counter += d_fft_size; // sample counter + bool positive_acquisition = false; + int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL + + LOG_AT_LEVEL(INFO) << "Channel: " << d_channel + << " , doing acquisition of satellite: " << d_satellite + << " ,at sample stamp: " << d_sample_counter; + + const gr_complex *in = (const gr_complex *)input_items[0]; + + //Perform the carrier wipe-off + for (unsigned int j = 0; j < d_fft_size; j++) + { + d_fft_if->get_inbuf()[j] = in[j] * d_sine_if[j]; + d_fft_250->get_inbuf()[j] = in[j] * d_sine_250[j]; + d_fft_500->get_inbuf()[j] = in[j] * d_sine_500[j]; + d_fft_750->get_inbuf()[j] = in[j] * d_sine_750[j]; + } + // Perform the FFT of the resulting signal + d_fft_if->execute(); + d_fft_250->execute(); + d_fft_500->execute(); + d_fft_750->execute(); + + //---------------------------------------------------------------------- + + //---Calculate cross-correlation magnitudes using: + //----> the circular convolution property of FFT: + //----> the frequency-shift property of the FFT: y(t)=exp(jw0t)x(t) -> Y(w)=X(w-w0) + for (int j = (int)-(d_doppler_max / 1000); j < (int)d_doppler_max / 1000; j++) + { // doppler search steps + calculate_magnitudes(d_fft_if->get_outbuf(), j, 0); + calculate_magnitudes(d_fft_250->get_outbuf(), j, 1); + calculate_magnitudes(d_fft_500->get_outbuf(), j, 2); + calculate_magnitudes(d_fft_750->get_outbuf(), j, 3); + } + + if (d_dump) + { + std::stringstream ss; + ss << "./data/acquisition_" << d_channel << "_" << d_satellite << "_" + << d_count << ".dat"; + d_dump_file.open(ss.str().c_str(), std::ios::out | std::ios::binary); + std::streamsize n = sizeof(float) * (d_fft_size); + d_dump_file.write((char*)d_best_magnitudes, n); + d_dump_file.close(); + } + + if (d_test_statistics > d_threshold) + { //TODO: Include in configuration parameters and check value!! + + positive_acquisition = true; + d_acq_sample_stamp = d_sample_counter; + + LOG_AT_LEVEL(INFO) << "POSITIVE ACQUISITION of channel " << d_channel; + LOG_AT_LEVEL(INFO) << "Satellite " << d_satellite; + LOG_AT_LEVEL(INFO) << "Code Phase " << d_prn_code_phase; + LOG_AT_LEVEL(INFO) << "Doppler " << d_doppler_freq_phase; + LOG_AT_LEVEL(INFO) << "Magnitude " << d_mag; + LOG_AT_LEVEL(INFO) << "Mean " << d_mean; + LOG_AT_LEVEL(INFO) << "Test statistics value " << d_test_statistics; + LOG_AT_LEVEL(INFO) << "Test statistics threshold " << d_threshold; + LOG_AT_LEVEL(INFO) << "Acq sample stamp " << d_acq_sample_stamp; + } + else + { + LOG_AT_LEVEL(INFO) << "NEGATIVE ACQUISITION of channel " << d_channel; + LOG_AT_LEVEL(INFO) << "Satellite " << d_satellite; + LOG_AT_LEVEL(INFO) << "Test statistics value " << d_test_statistics; + LOG_AT_LEVEL(INFO) << "Test statistics threshold " << d_threshold; + LOG_AT_LEVEL(INFO) << "Acq sample stamp " << d_acq_sample_stamp; + } + d_active = false; + + LOG_AT_LEVEL(INFO) << "d_count " << d_count; + + if (positive_acquisition) + { + acquisition_message = 1; + } + else + { + acquisition_message = 2; + } + + d_channel_internal_queue->push(acquisition_message); + + return 0; +} + +void gps_l1_ca_gps_sdr_acquisition_cc::calculate_magnitudes( + gr_complex* fft_signal, int doppler_shift, int doppler_offset) +{ + + unsigned int indext = 0; + float magt = 0.0; + std::complex tmp_cpx; + + // FFT frequency-shift property + if (doppler_shift != 0) + { + for (unsigned int i = 0; i < d_fft_size; i++) + { + //complex conjugate (optimize me!) + tmp_cpx = std::complex(d_fft_codes[i].real(), + -d_fft_codes[i].imag()); + d_ifft->get_inbuf()[i] = fft_signal[(doppler_shift + i + + d_fft_size) % d_fft_size] * tmp_cpx; + } + } + else + { + for (unsigned int i = 0; i < d_fft_size; i++) + { + //complex conjugate (optimize me!) + tmp_cpx = std::complex(d_fft_codes[i].real(), + -d_fft_codes[i].imag()); + d_ifft->get_inbuf()[i] = fft_signal[i] * tmp_cpx; + } + } + + d_ifft->execute(); // inverse FFT of the result = convolution in time + + x86_gr_complex_mag(d_ifft->get_outbuf(), d_fft_size); // d_ifft->get_outbuf()=|abs(·)|^2 + x86_float_max((float*)d_ifft->get_outbuf(), &indext, &magt, d_fft_size); // find max of |abs(·)|^2 -> index and magt + + if (magt > d_mag) + { // if the magnitude is > threshold + + // save the synchronization parameters + d_mag = magt; + d_prn_code_phase = indext; + d_doppler_freq_phase = -((doppler_shift * 1000.0) + (doppler_offset + * 250.0)); + // save the circular correlation of this Doppler shift + memcpy(d_best_magnitudes, d_ifft->get_outbuf(), sizeof(float) + * d_fft_size); + + // Remove the maximum and its neighbours to calculate the mean + ((float*)d_ifft->get_outbuf())[indext] = 0.0; + if (indext != 0) + { + ((float*)d_ifft->get_outbuf())[indext - 1] = 0.0; + } + if (indext != d_fft_size - 1) + { + ((float*)d_ifft->get_outbuf())[indext + 1] = 0.0; + } + + for (unsigned int i = 0; i < d_fft_size; i++) + { + d_mean += ((float*)d_ifft->get_outbuf())[i]; + } + d_mean = d_mean / d_fft_size; + d_test_statistics = d_mag / d_mean; + } +} diff --git a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_cc.h new file mode 100644 index 000000000..be6e50dda --- /dev/null +++ b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_cc.h @@ -0,0 +1,166 @@ +/*! + * \file gps_l1_ca_gps_sdr_acquisition_cc.h + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef INCLUDED_GPS_L1_CA_GPS_SDR_ACQUISITION_CC_H +#define INCLUDED_GPS_L1_CA_GPS_SDR_ACQUISITION_CC_H + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include "concurrent_queue.h" + +class gps_l1_ca_gps_sdr_acquisition_cc; +typedef boost::shared_ptr + gps_l1_ca_gps_sdr_acquisition_cc_sptr; +gps_l1_ca_gps_sdr_acquisition_cc_sptr +gps_l1_ca_gps_sdr_make_acquisition_cc(unsigned int sampled_ms, long freq, + long fs_in, int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename); + +class gps_l1_ca_gps_sdr_acquisition_cc: public gr_block +{ + +private: + + friend gps_l1_ca_gps_sdr_acquisition_cc_sptr + gps_l1_ca_gps_sdr_make_acquisition_cc(unsigned int sampled_ms, long freq, + long fs_in, int samples_per_ms, gr_msg_queue_sptr queue, + bool dump, std::string dump_filename); + + gps_l1_ca_gps_sdr_acquisition_cc(unsigned int sampled_ms, long freq, + long fs_in, int samples_per_ms, gr_msg_queue_sptr queue, + bool dump, std::string dump_filename); + + void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, + int doppler_offset); + + long d_fs_in; + long d_freq; + int d_samples_per_ms; + unsigned int d_satellite; + float d_threshold; + std::string d_satellite_str; + unsigned int d_doppler_max; + unsigned int d_sampled_ms; + unsigned int d_fft_size; + unsigned long int d_sample_counter; + unsigned long int d_acq_sample_stamp; + + gr_complex* d_baseband_signal; + gr_complex* d_sine_if; + gr_complex* d_sine_250; + gr_complex* d_sine_500; + gr_complex* d_sine_750; + gr_complex* d_fft_codes; + + gri_fft_complex* d_fft_if; + gri_fft_complex* d_fft_250; + gri_fft_complex* d_fft_500; + gri_fft_complex* d_fft_750; + gri_fft_complex* d_ifft; + + float* d_best_magnitudes; + + unsigned int d_prn_code_phase; + float d_doppler_freq_phase; + float d_mag; + float d_mean; + float d_test_statistics; + + gr_msg_queue_sptr d_queue; + concurrent_queue *d_channel_internal_queue; + + std::ofstream d_dump_file; + + unsigned int d_count; + + bool d_active; + bool d_dump; + unsigned int d_channel; + std::string d_dump_filename; + +public: + + ~gps_l1_ca_gps_sdr_acquisition_cc(); + + signed int prn_code_phase(); + float doppler_freq_phase() + { + return d_doppler_freq_phase; + } + unsigned int mag() + { + return d_mag; + } + + unsigned long int get_sample_stamp() + { + return d_acq_sample_stamp; + } + + void set_satellite(unsigned int satellite); + void set_active(bool active) + { + d_active = active; + } + void set_channel(unsigned int channel) + { + d_channel = channel; + } + void set_threshold(float threshold) + { + d_threshold = threshold; + } + void set_doppler_max(unsigned int doppler_max) + { + d_doppler_max = doppler_max; + } + + void set_channel_queue(concurrent_queue *channel_internal_queue) + { + d_channel_internal_queue = channel_internal_queue; + } + + int general_work(int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif /* INCLUDED_GPS_L1_CA_GPS_SDR_ACQUISITION_CC_H */ diff --git a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_ss.cc b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_ss.cc new file mode 100644 index 000000000..b6cf68db9 --- /dev/null +++ b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_ss.cc @@ -0,0 +1,276 @@ +/*! + * \file gps_l1_ca_gps_sdr_acquisition_ss.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gps_l1_ca_gps_sdr_acquisition_ss.h" + +#include "gps_sdr_simd.h" +#include "gps_sdr_fft.h" +#include "gps_sdr_prn_codes_short.h" +#include "control_message_factory.h" +#include "gps_sdr_x86.h" + +#include + +#include + +#include +#include + +using google::LogMessage; + +gps_l1_ca_gps_sdr_acquisition_ss_sptr gps_l1_ca_gps_sdr_make_acquisition_ss( + unsigned int sampled_ms, long freq, long fs_in, int samples_per_ms, + gr_msg_queue_sptr queue, bool dump, std::string dump_filename) +{ + + return gps_l1_ca_gps_sdr_acquisition_ss_sptr( + new gps_l1_ca_gps_sdr_acquisition_ss(sampled_ms, freq, fs_in, + samples_per_ms, queue, dump, dump_filename)); +} + +gps_l1_ca_gps_sdr_acquisition_ss::gps_l1_ca_gps_sdr_acquisition_ss( + unsigned int sampled_ms, long freq, long fs_in, int samples_per_ms, + gr_msg_queue_sptr queue, bool dump, std::string dump_filename) : + gr_block("gps_l1_ca_gps_sdr_acquisition_ss", gr_make_io_signature(1, 1, + sizeof(short) * 2 * samples_per_ms), gr_make_io_signature(0, 0, + sizeof(short) * 2 * samples_per_ms)) +{ + + // SAMPLE COUNTER + d_sample_counter = 0; + + d_active = false; + d_dump = dump; + d_queue = queue; + d_dump_filename = dump_filename; + + d_fs_in = fs_in; + d_samples_per_ms = samples_per_ms; + d_doppler_resolution = 4; + d_freq = freq; + d_satellite = 0; + d_doppler_max = 0; + d_sampled_ms = sampled_ms; + d_fft_size = d_sampled_ms * d_samples_per_ms; + + d_doppler_freq_shift = 0.0; + d_prn_code_phase = 0; + d_mag = 0; + + d_sine_if = new CPX[d_fft_size]; + d_sine_250 = new CPX[d_fft_size]; + d_sine_500 = new CPX[d_fft_size]; + d_sine_750 = new CPX[d_fft_size]; + + d_baseband_signal = new CPX[d_doppler_resolution * d_fft_size]; + d_baseband_signal_shift = new CPX[d_doppler_resolution * (d_fft_size + + 201)]; + + signed int R1[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + d_pFFT = new FFT(d_fft_size, R1); + + signed int R2[16] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1 }; + d_piFFT = new FFT(d_fft_size, R2); + + for (int i = 0; i < 32; i++) + { + d_fft_codes[i] = (CPX *)&PRN_Codes_Short[sizeof(short) * i + * d_samples_per_ms]; + } + + sine_gen(d_sine_if, -d_freq, d_fs_in, d_fft_size); + sine_gen(d_sine_250, -d_freq - 250, d_fs_in, d_fft_size); + sine_gen(d_sine_500, -d_freq - 500, d_fs_in, d_fft_size); + sine_gen(d_sine_750, -d_freq - 750, d_fs_in, d_fft_size); + + DLOG(INFO) << "fs in " << d_fs_in; + DLOG(INFO) << "samples per ms " << d_samples_per_ms; + DLOG(INFO) << "doppler resolution " << d_doppler_resolution; + DLOG(INFO) << "freq " << d_freq; + DLOG(INFO) << "satellite " << d_satellite; + DLOG(INFO) << "sampled_ms " << d_sampled_ms; + DLOG(INFO) << "fft_size " << d_fft_size; + DLOG(INFO) << "dump filename " << d_dump_filename; + DLOG(INFO) << "dump " << d_dump; +} + +gps_l1_ca_gps_sdr_acquisition_ss::~gps_l1_ca_gps_sdr_acquisition_ss() +{ + delete d_baseband_signal; + delete d_baseband_signal_shift; + delete d_sine_if; + delete d_sine_250; + delete d_sine_500; + delete d_sine_750; + delete d_pFFT; + delete d_piFFT; + + if (d_dump) + { + d_dump_file.close(); + } +} + +void gps_l1_ca_gps_sdr_acquisition_ss::set_satellite(unsigned int satellite) +{ + d_satellite = satellite; + d_prn_code_phase = 0; + d_doppler_freq_shift = 0; + d_mag = 0; + DLOG(INFO) << "satellite set to " << d_satellite; +} + +signed int gps_l1_ca_gps_sdr_acquisition_ss::prn_code_phase() +{ + return d_prn_code_phase; +} + +int gps_l1_ca_gps_sdr_acquisition_ss::general_work(int noutput_items, + gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + + if (!d_active) + { + d_sample_counter += d_fft_size * noutput_items; // sample counter + consume_each(noutput_items); + } + else + { + d_sample_counter += d_fft_size; // sample counter + + const CPX *in = (const CPX *)input_items[0]; + + CPX* buffer = new CPX[d_fft_size]; + + signed int index = 0; + unsigned int indext = 0; + unsigned int magt = 0; + + DLOG(INFO) << "copied " << (d_fft_size * sizeof(CPX)) + << " bytes into buffer (" << d_fft_size << " samples)"; + memcpy(d_baseband_signal, in, d_fft_size * sizeof(CPX)); + + sse_cmulsc(d_baseband_signal, d_sine_250, + &d_baseband_signal[d_fft_size], d_fft_size, 14); + sse_cmulsc(d_baseband_signal, d_sine_500, &d_baseband_signal[2 + * d_fft_size], d_fft_size, 14); + sse_cmulsc(d_baseband_signal, d_sine_750, &d_baseband_signal[3 + * d_fft_size], d_fft_size, 14); + + sse_cmuls(d_baseband_signal, d_sine_if, d_fft_size, 14); + + for (unsigned int i = 0; i < d_doppler_resolution; i++) + { + d_pFFT->doFFT(&d_baseband_signal[i * d_fft_size], true); + memcpy(&d_baseband_signal_shift[i * (d_fft_size + 201)], + &d_baseband_signal[(i + 1) * d_fft_size - 100], 100 + * sizeof(CPX)); + memcpy(&d_baseband_signal_shift[(i * (d_fft_size + 201)) + 100], + &d_baseband_signal[i * d_fft_size], d_fft_size + * sizeof(CPX)); + memcpy(&d_baseband_signal_shift[(i * (d_fft_size + 201)) + 100 + + d_fft_size], &d_baseband_signal[i * d_fft_size], 100 + * sizeof(CPX)); + } + + // Here begins the actual acquisition process. + + for (int i = -d_doppler_max / 1000; i < (int)d_doppler_max / 1000; i++) + { + for (unsigned int j = 0; j < d_doppler_resolution; j++) + { + sse_cmulsc(&d_baseband_signal_shift[(j * (d_fft_size + 201)) + + 100 + i], d_fft_codes[d_satellite], buffer, + d_fft_size, 10); + d_piFFT->doiFFT(buffer, true); + x86_cmag(buffer, d_fft_size); + x86_max((unsigned int *)buffer, &indext, &magt, d_fft_size); + + if (magt > d_mag) + { + d_mag = magt; + index = indext; + d_prn_code_phase = ceil((index * d_samples_per_ms) + / d_fft_size); + d_doppler_freq_shift = (i * 1000.0) + (j * 250.0); + + if (d_dump) + { + d_dump_file.open(d_dump_filename.c_str(), + std::ios::out | std::ios::binary); + std::streamsize n = sizeof(unsigned int) * d_fft_size; + d_dump_file.write((char*)buffer, n); + d_dump_file.close(); + } + } + } + } + + DLOG(INFO) << "satellite " << d_satellite; + //result->code_phase = 2048 - index; + DLOG(INFO) << "code phase " << d_prn_code_phase; + //result->doppler = (lcv*1000) + (float)lcv2*250; + DLOG(INFO) << "doppler " << d_doppler_freq_shift; + //result->magnitude = mag; + DLOG(INFO) << "magnitude " << d_mag; + + d_active = false; + + delete buffer; + + DLOG(INFO) << "Acquisition done"; + + int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL + + if (d_mag > d_threshold) + { + d_acq_sample_stamp = d_sample_counter; + acquisition_message = 1; //ACQ_SUCCES + } + else + { + acquisition_message = 2; //ACQ_FAIL + + } + + d_channel_internal_queue->push(acquisition_message); + + consume_each(1); + } + return 0; + +} diff --git a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_ss.h b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_ss.h new file mode 100644 index 000000000..6ba2d1b7b --- /dev/null +++ b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_gps_sdr_acquisition_ss.h @@ -0,0 +1,155 @@ +/*! + * \file gps_l1_ca_gps_sdr_acquisition_ss.h + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef INCLUDED_GPS_L1_CA_GPS_SDR_ACQUISITION_SS_H +#define INCLUDED_GPS_L1_CA_GPS_SDR_ACQUISITION_SS_H + +#include + +#include +#include +#include "gps_sdr_signal_processing.h" + +#include +#include +#include +#include "concurrent_queue.h" + + +class FFT; + +class gps_l1_ca_gps_sdr_acquisition_ss; +typedef boost::shared_ptr + gps_l1_ca_gps_sdr_acquisition_ss_sptr; +gps_l1_ca_gps_sdr_acquisition_ss_sptr +gps_l1_ca_gps_sdr_make_acquisition_ss(unsigned int sampled_ms, long freq, + long fs_in, int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename); + +class gps_l1_ca_gps_sdr_acquisition_ss: public gr_block +{ + +private: + + friend gps_l1_ca_gps_sdr_acquisition_ss_sptr + gps_l1_ca_gps_sdr_make_acquisition_ss(unsigned int sampled_ms, long freq, + long fs_in, int samples_per_ms, gr_msg_queue_sptr queue, + bool dump, std::string dump_filename); + + gps_l1_ca_gps_sdr_acquisition_ss(unsigned int sampled_ms, long freq, + long fs_in, int samples_per_ms, gr_msg_queue_sptr queue, + bool dump, std::string dump_filename); + + long d_fs_in; + long d_freq; + int d_samples_per_ms; + unsigned int d_satellite; + float d_threshold; + unsigned int d_doppler_max; + unsigned int d_doppler_resolution; + unsigned int d_sampled_ms; + unsigned int d_fft_size; + unsigned long int d_sample_counter; + unsigned long int d_acq_sample_stamp; + + CPX* d_baseband_signal; + CPX* d_baseband_signal_shift; + CPX* d_sine_if; + CPX* d_sine_250; + CPX* d_sine_500; + CPX* d_sine_750; + FFT* d_pFFT; + FFT* d_piFFT; + CPX* d_fft_codes[32]; + + signed int d_prn_code_phase; + float d_doppler_freq_shift; + unsigned int d_mag; + + gr_msg_queue_sptr d_queue; + concurrent_queue *d_channel_internal_queue; + std::ofstream d_dump_file; + + bool d_active; + bool d_dump; + unsigned int d_channel; + std::string d_dump_filename; + +public: + + ~gps_l1_ca_gps_sdr_acquisition_ss(); + + signed int prn_code_phase(); + float doppler_freq_phase() + { + return d_doppler_freq_shift; + } + unsigned int mag() + { + return d_mag; + } + + unsigned long int get_sample_stamp() + { + return d_acq_sample_stamp; + } + + void set_satellite(unsigned int satellite); + void set_active(bool active) + { + d_active = active; + } + void set_channel(unsigned int channel) + { + d_channel = channel; + } + void set_threshold(float threshold) + { + d_threshold = threshold; + } + void set_doppler_max(unsigned int doppler_max) + { + d_doppler_max = doppler_max; + } + + void set_channel_queue(concurrent_queue *channel_internal_queue) + { + d_channel_internal_queue = channel_internal_queue; + } + + int general_work(int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif /* INCLUDED_GPS_L1_CA_GPS_SDR_ACQUISITION_SS_H */ diff --git a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.cc new file mode 100644 index 000000000..513b6b33f --- /dev/null +++ b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.cc @@ -0,0 +1,319 @@ +/*! + * \file gps_l1_ca_pcps_acquisition_cc.h + * \brief Brief description of the file here + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gps_l1_ca_pcps_acquisition_cc.h" +#include "gps_sdr_signal_processing.h" +#include "control_message_factory.h" +#include "gps_sdr_x86.h" + +#include + +#include + +#include +#include + +using google::LogMessage; + +gps_l1_ca_pcps_acquisition_cc_sptr gps_l1_ca_pcps_make_acquisition_cc( + unsigned int sampled_ms, unsigned int doppler_max, long freq, + long fs_in, int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename) +{ + + return gps_l1_ca_pcps_acquisition_cc_sptr( + new gps_l1_ca_pcps_acquisition_cc(sampled_ms, doppler_max, freq, + fs_in, samples_per_ms, queue, dump, dump_filename)); +} + +gps_l1_ca_pcps_acquisition_cc::gps_l1_ca_pcps_acquisition_cc( + unsigned int sampled_ms, unsigned int doppler_max, long freq, + long fs_in, int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename) : + gr_block("gps_l1_ca_pcps_acquisition_cc", gr_make_io_signature(1, 1, + sizeof(gr_complex) * samples_per_ms), gr_make_io_signature(0, 0, + sizeof(gr_complex) * samples_per_ms)) +{ + + // SAMPLE COUNTER + d_sample_counter = 0; + + d_active = false; + d_dump = dump; + d_queue = queue; + d_dump_filename = dump_filename; + + d_freq = freq; + d_fs_in = fs_in; + + d_samples_per_ms = samples_per_ms; + d_sampled_ms = sampled_ms; + + d_doppler_max = doppler_max; + + d_satellite = 0; + + d_fft_size = d_sampled_ms * d_samples_per_ms; + + d_doppler_freq = 0.0; + d_code_phase = 0; + d_mag = 0; + d_input_power = 0.0; + + d_sine_if = new gr_complex[d_fft_size]; + + d_fft_codes = (gr_complex*)malloc(sizeof(gr_complex) * d_samples_per_ms); + + // Direct FFT + d_fft_if = new gri_fft_complex(d_fft_size, true); + + // Inverse FFT + d_ifft = new gri_fft_complex(d_fft_size, false); + + DLOG(INFO) << "fs in " << d_fs_in; + DLOG(INFO) << "samples per ms " << d_samples_per_ms; + DLOG(INFO) << "doppler max " << d_doppler_max; + DLOG(INFO) << "freq " << d_freq; + DLOG(INFO) << "satellite " << d_satellite; + DLOG(INFO) << "sampled_ms " << d_sampled_ms; + DLOG(INFO) << "fft_size " << d_fft_size; + DLOG(INFO) << "dump filename " << d_dump_filename; + DLOG(INFO) << "dump " << d_dump; +} + +gps_l1_ca_pcps_acquisition_cc::~gps_l1_ca_pcps_acquisition_cc() +{ + delete d_sine_if; + delete d_fft_codes; + + if (d_dump) + { + d_dump_file.close(); + } +} + +void gps_l1_ca_pcps_acquisition_cc::set_satellite(unsigned int satellite) +{ + d_satellite = satellite; + d_code_phase = 0; + d_doppler_freq = 0; + d_mag = 0; + d_input_power = 0.0; + + // Now the GPS codes are generated on the fly using a custom version of the GPS code generator + code_gen_complex_sampled(d_fft_if->get_inbuf(), satellite, d_fs_in, 0); + d_fft_if->execute(); // We need the FFT of GPS C/A code + //Conjugate the local code + //TODO Optimize it ! + for (unsigned int i = 0; i < d_fft_size; i++) + { + d_fft_codes[i] = std::complex( + d_fft_if->get_outbuf()[i].real(), + -d_fft_if->get_outbuf()[i].imag()); + d_fft_codes[i] = d_fft_codes[i] / (float)d_fft_size; //to correct the scale factor introduced by FFTW + } + //memcpy(d_fft_codes,d_fft_if->get_outbuf(),sizeof(gr_complex)*d_samples_per_ms); + + // std::stringstream filename; + // std::streamsize n = 2*sizeof(float)*(d_fft_size); // complex file write + // filename.str(""); + // filename << "./data/code.dat"; + // std::cout<get_inbuf(), n); //write directly |abs(·)|^2 in this Doppler bin + // //d_dump_file.write((char*)d_sine_if, n); //to be read with read_complex_binary() -> test OK + // d_dump_file.close(); +} +signed int gps_l1_ca_pcps_acquisition_cc::prn_code_phase() +{ + return d_code_phase; +} + +int gps_l1_ca_pcps_acquisition_cc::general_work(int noutput_items, + gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + + /*! + * By J.Arribas + * Acquisition A strategy (Kay Borre book + CFAR threshold): + * 1º- Compute the input signal power estimation + * 2º- Doppler serial search loop + * 3º- Perform the FFT-based circular convolution (parallel time search) + * 4º- record the maximum peak and the associated synchronization parameters + * 5º- Compute the test statistics and compare to the threshold + * 6º- Declare positive or negative acquisition using a message queue + */ + + if (!d_active) + { + d_sample_counter += d_fft_size * noutput_items; // sample counter + consume_each(noutput_items); + } + else + { + d_sample_counter += d_fft_size; // sample counter + // initialize acquisition algorithm + + int doppler; + unsigned int indext = 0; + float magt = 0.0; + const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer + bool positive_acquisition = false; + int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL + + //aux vars + unsigned int i; + std::stringstream filename; + std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write + + LOG_AT_LEVEL(INFO) << "Channel: " << d_channel + << " , doing acquisition of satellite: " << d_satellite + << " ,sample stamp: " << d_sample_counter << ", threshold: " + << d_threshold << ", doppler_max: " << d_doppler_max + << ", doppler_step: " << d_doppler_step; + + // 1º Compute the input signal power estimation + for (i = 0; i < d_fft_size; i++) + { + d_input_power += std::abs(in[i]) * std::abs(in[i]); + } + d_input_power = d_input_power / ((float)d_fft_size + * (float)d_fft_size); + + // 2º- Doppler frequency search loop + for (doppler = (int)(-d_doppler_max); doppler < (int)d_doppler_max; doppler + += d_doppler_step) + { // doppler search steps + //Perform the carrier wipe-off + sine_gen_complex(d_sine_if, d_freq + doppler, d_fs_in, d_fft_size); + for (i = 0; i < d_fft_size; i++) + { + d_fft_if->get_inbuf()[i] = in[i] * d_sine_if[i]; + } + + //3º- Perform the FFT-based circular convolution (parallel time search) + d_fft_if->execute(); //TODO Optimize me + for (i = 0; i < d_fft_size; i++) + { + d_ifft->get_inbuf()[i] = (d_fft_if->get_outbuf()[i] + * d_fft_codes[i]) / (float)d_fft_size; + } + d_ifft->execute(); + + x86_gr_complex_mag(d_ifft->get_outbuf(), d_fft_size); // d_ifft->get_outbuf()=|abs(·)|^2 and the array is converted from CPX->Float + x86_float_max((float*)d_ifft->get_outbuf(), &indext, &magt, + d_fft_size); // find max of |abs(·)|^2 -> index and magt + + magt = magt / (float)d_fft_size; + // Record results to files + if (d_dump) + { + filename.str(""); + filename << "./data/fft_" << doppler << "_.dat"; + std::cout << filename.str().c_str(); + std::cout << ".\n"; + d_dump_file.open(filename.str().c_str(), std::ios::out + | std::ios::binary); + d_dump_file.write((char*)d_ifft->get_outbuf(), n); //write directly |abs(·)|^2 in this Doppler bin + d_dump_file.close(); + } + // 4º- record the maximum peak and the associated synchronization parameters + if (d_mag < magt) + { + d_mag = magt; + d_code_phase = indext; + d_doppler_freq = doppler; + } + } + + // 5º- Compute the test statistics and compare to the threshold + d_test_statistics = d_mag / d_input_power; + // 6º- Declare positive or negative acquisition using a message queue + + if (d_test_statistics > d_threshold) + { //0.004 + positive_acquisition = true; + d_acq_sample_stamp = d_sample_counter; + LOG_AT_LEVEL(INFO) << "positive acquisition"; + LOG_AT_LEVEL(INFO) << "satellite " << d_satellite; + LOG_AT_LEVEL(INFO) << "sample_stamp" << d_sample_counter; + LOG_AT_LEVEL(INFO) << "test statistics value " + << d_test_statistics; + LOG_AT_LEVEL(INFO) << "test statistics threshold " << d_threshold; + LOG_AT_LEVEL(INFO) << "code phase " << d_code_phase; + LOG_AT_LEVEL(INFO) << "doppler " << d_doppler_freq; + LOG_AT_LEVEL(INFO) << "magnitude " << d_mag; + LOG_AT_LEVEL(INFO) << "input signal power " << d_input_power; + + } + else + { + LOG_AT_LEVEL(INFO) << "negative acquisition"; + LOG_AT_LEVEL(INFO) << "satellite " << d_satellite; + LOG_AT_LEVEL(INFO) << "sample_stamp " << d_sample_counter; + LOG_AT_LEVEL(INFO) << "test statistics value " + << d_test_statistics; + LOG_AT_LEVEL(INFO) << "test statistics threshold " << d_threshold; + LOG_AT_LEVEL(INFO) << "magnitude " << d_mag; + LOG_AT_LEVEL(INFO) << "input signal power " << d_input_power; + + //restart acquisition variables + d_input_power = 0.0; + d_mag = 0.0; + + } + d_active = false; + + if (positive_acquisition) + { + acquisition_message = 1; + } + else + { + acquisition_message = 2; + } + + d_channel_internal_queue->push(acquisition_message); + + consume_each(1); + } + return 0; +} diff --git a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.h new file mode 100644 index 000000000..f1512a43a --- /dev/null +++ b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.h @@ -0,0 +1,163 @@ +/*! + * \file gps_l1_ca_pcps_acquisition_cc.h + * \brief Brief description of the file here + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GPS_L1_CA_PCPS_ACQUISITION_A_CC_H +#define GPS_L1_CA_PCPS_ACQUISITION_A_CC_H + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include "concurrent_queue.h" + +class gps_l1_ca_pcps_acquisition_cc; +typedef boost::shared_ptr + gps_l1_ca_pcps_acquisition_cc_sptr; +gps_l1_ca_pcps_acquisition_cc_sptr +gps_l1_ca_pcps_make_acquisition_cc(unsigned int sampled_ms, + unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, + gr_msg_queue_sptr queue, bool dump, std::string dump_filename); + +class gps_l1_ca_pcps_acquisition_cc: public gr_block +{ + +private: + + friend gps_l1_ca_pcps_acquisition_cc_sptr + gps_l1_ca_pcps_make_acquisition_cc(unsigned int sampled_ms, + unsigned int doppler_max, long freq, long fs_in, + int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename); + + gps_l1_ca_pcps_acquisition_cc(unsigned int sampled_ms, + unsigned int doppler_max, long freq, long fs_in, + int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename); + + void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, + int doppler_offset); + + long d_fs_in; + long d_freq; + int d_samples_per_ms; + unsigned int d_doppler_resolution; + unsigned int d_satellite; + float d_threshold; + std::string d_satellite_str; + unsigned int d_doppler_max; + unsigned int d_doppler_step; + unsigned int d_sampled_ms; + unsigned int d_fft_size; + unsigned long int d_sample_counter; + unsigned long int d_acq_sample_stamp; + gr_complex* d_sine_if; + + gr_complex* d_fft_codes; + + gri_fft_complex* d_fft_if; + + gri_fft_complex* d_ifft; + + unsigned int d_code_phase; + float d_doppler_freq; + float d_mag; + float d_input_power; + float d_test_statistics; + + gr_msg_queue_sptr d_queue; + concurrent_queue *d_channel_internal_queue; + std::ofstream d_dump_file; + + bool d_active; + bool d_dump; + unsigned int d_channel; + std::string d_dump_filename; + +public: + + ~gps_l1_ca_pcps_acquisition_cc(); + + signed int prn_code_phase(); + float doppler_freq() + { + return d_doppler_freq; + } + unsigned int mag() + { + return d_mag; + } + + unsigned long int get_sample_stamp() + { + return d_acq_sample_stamp; + } + + void set_satellite(unsigned int satellite); + void set_active(bool active) + { + d_active = active; + } + void set_channel(unsigned int channel) + { + d_channel = channel; + } + void set_threshold(float threshold) + { + d_threshold = threshold; + } + void set_doppler_max(unsigned int doppler_max) + { + d_doppler_max = doppler_max; + } + void set_doppler_step(unsigned int doppler_step) + { + d_doppler_step = doppler_step; + } + + void set_channel_queue(concurrent_queue *channel_internal_queue) + { + d_channel_internal_queue = channel_internal_queue; + } + + int general_work(int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif /* GPS_L1_CA_PCPS_ACQUISITION_CC_H*/ diff --git a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_tong_pcps_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_tong_pcps_acquisition_cc.cc new file mode 100644 index 000000000..f995026cf --- /dev/null +++ b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_tong_pcps_acquisition_cc.cc @@ -0,0 +1,354 @@ +/*! + * \file gps_l1_ca_tong_pcps_acquisition_cc.cc + * \brief Brief description of the file here + * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gps_l1_ca_tong_pcps_acquisition_cc.h" +#include "gps_sdr_signal_processing.h" +#include "control_message_factory.h" +#include "gps_sdr_x86.h" + +#include + +#include + +#include +#include + +using google::LogMessage; + +gps_l1_ca_tong_pcps_acquisition_cc_sptr gps_l1_ca_tong_pcps_make_acquisition_cc( + unsigned int sampled_ms, unsigned int doppler_max, long freq, + long fs_in, int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename) +{ + + return gps_l1_ca_tong_pcps_acquisition_cc_sptr( + new gps_l1_ca_tong_pcps_acquisition_cc(sampled_ms, doppler_max, + freq, fs_in, samples_per_ms, queue, dump, dump_filename)); +} + +gps_l1_ca_tong_pcps_acquisition_cc::gps_l1_ca_tong_pcps_acquisition_cc( + unsigned int sampled_ms, unsigned int doppler_max, long freq, + long fs_in, int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename) : + gr_block("gps_l1_ca_tong_pcps_acquisition_cc", gr_make_io_signature(1, 1, + sizeof(gr_complex) * samples_per_ms), gr_make_io_signature(0, 0, + sizeof(gr_complex) * samples_per_ms)) +{ + + // SAMPLE COUNTER + d_sample_counter = 0; + + d_active = false; + d_dump = dump; + d_queue = queue; + d_dump_filename = dump_filename; + + d_freq = freq; + d_fs_in = fs_in; + + d_samples_per_ms = samples_per_ms; + d_sampled_ms = sampled_ms; + + d_doppler_max = doppler_max; + + d_satellite = 0; + + d_samples = d_sampled_ms * d_samples_per_ms; + + d_doppler_freq = 0.0; + d_code_phase = 0; + d_mag = 0.0; + d_noise_power = 0.0; + d_fbins = 0; + d_doppler = 0; + d_pfa = 0.2; + d_A = 8; + d_B = 1; + d_max_dwells = 15; + d_K = d_B; + + d_if_sin = new gr_complex[d_samples]; + + d_fft_codes = (gr_complex*)malloc(sizeof(gr_complex) * d_samples_per_ms); + + // Direct FFT + d_fft_if = new gri_fft_complex(d_samples, true); + + // Inverse FFT + d_ifft = new gri_fft_complex(d_samples, false); + + d_ca_codes = new gr_complex[d_samples]; + + d_aux_ca_code = new gr_complex[d_samples]; + + //generates a unused PRN code to calculate the noise envelope + code_gen_complex_sampled(d_aux_ca_code, 33, d_fs_in, 0); + + DLOG(INFO) << "fs in " << d_fs_in; + DLOG(INFO) << "samples per ms " << d_samples_per_ms; + DLOG(INFO) << "doppler max " << d_doppler_max; + DLOG(INFO) << "freq " << d_freq; + DLOG(INFO) << "satellite " << d_satellite; + DLOG(INFO) << "sampled_ms " << d_sampled_ms; + DLOG(INFO) << "Samples_for_processing " << d_samples; + DLOG(INFO) << "dump filename " << d_dump_filename; + DLOG(INFO) << "dump " << d_dump; +} + +gps_l1_ca_tong_pcps_acquisition_cc::~gps_l1_ca_tong_pcps_acquisition_cc() +{ + delete d_if_sin; + delete d_ca_codes; + + if (d_dump) + { + d_dump_file.close(); + } +} + +void gps_l1_ca_tong_pcps_acquisition_cc::set_satellite(unsigned int satellite) +{ + d_satellite = satellite; + d_code_phase = 0; + d_doppler_freq = 0; + d_mag = 0.0; + d_noise_power = 0.0; + + // The GPS codes are generated on the fly using a custom version of the GPS code generator + code_gen_complex_sampled(d_fft_if->get_inbuf(), satellite, d_fs_in, 0); + + d_fft_if->execute(); // We need the FFT of GPS C/A code + //Conjugate the local code + //TODO Optimize it ! + for (unsigned int i = 0; i < d_samples; i++) + { + d_fft_codes[i] = std::complex( + d_fft_if->get_outbuf()[i].real(), + -d_fft_if->get_outbuf()[i].imag()); + } +} +signed int gps_l1_ca_tong_pcps_acquisition_cc::prn_code_phase() +{ + return d_code_phase; +} + +int gps_l1_ca_tong_pcps_acquisition_cc::general_work(int noutput_items, + gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + + if (!d_active) + { + // sample counter + d_sample_counter += d_samples * noutput_items; + consume_each(noutput_items); + } + else + { + d_sample_counter += d_samples; + + // initialize acquisition algorithm + + bool positive_acquisition = false; + int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL + + //float noise_envelope = 0.0; + float vt = 20000; + //float peak = 0.0; + float magt = 0.0; + unsigned int max_freq_step = 2 * (unsigned int)(d_doppler_max + / d_doppler_step); + unsigned int indext = 0; + + // Get the input samples pointer + const gr_complex *in = (const gr_complex *)input_items[0]; + + // aux vars + std::stringstream filename; + //unsigned int consume_items = 1; + + // complex file write + // std::streamsize n = 2 * sizeof(float) * (d_samples); + + // 1 - Compute the input noise envelope estimation and the threshold vt + + // sine_gen_complex( d_if_sin, d_freq + doppler, d_fs_in, d_samples ); + // + // noise_envelope = calculate_envelope( in, d_aux_ca_code, d_if_sin ); + // vt = noise_envelope * sqrt( -2 * log( d_pfa ) ); + + + // 1º Compute the input signal power estimation + for (unsigned int i = 0; i < d_samples; i++) + { + d_noise_power += std::abs(in[i]); + } + d_noise_power = sqrt(d_noise_power / (float)d_samples); + + //Perform the carrier wipe-off + sine_gen_complex(d_if_sin, d_freq + d_doppler, d_fs_in, d_samples); + for (unsigned int i = 0; i < d_samples; i++) + { + d_fft_if->get_inbuf()[i] = in[i] * d_if_sin[i]; + } + + //3º- Perform the FFT-based circular convolution (parallel time search) + d_fft_if->execute(); //TODO Optimize me + for (unsigned int i = 0; i < d_samples; i++) + { + d_ifft->get_inbuf()[i] = d_fft_if->get_outbuf()[i] + * d_fft_codes[i]; + } + + d_ifft->execute(); + x86_gr_complex_mag(d_ifft->get_outbuf(), d_samples); // d_ifft->get_outbuf()=|abs(·)|^2 and the array is converted from CPX->Float + x86_float_max((float*)d_ifft->get_outbuf(), &d_indext, &magt, + d_samples); // find max of |abs(·)|^2 -> index and magt + magt = sqrt(magt) / (float)d_samples; + d_test_statistics = magt / d_noise_power; + + LOG_AT_LEVEL(INFO) << "Channel: " << d_channel + << ", doing Tong PCSS acquisition of satellite: " + << d_satellite << ", sample stamp: " << d_sample_counter + << ", bin_freq " << d_doppler << ", doppler_max: " + << d_doppler_max << ", K " << d_K << ", sigma: " + << d_noise_power << ", mag: " << d_test_statistics + << ", vt: " << vt; + + if ((d_test_statistics > vt) && (indext = d_indext)) + { + d_K++; + if (d_K == d_A) + { + d_code_phase = d_indext; + positive_acquisition = true; + d_doppler_freq = d_doppler; + d_acq_sample_stamp = d_sample_counter; + LOG_AT_LEVEL(INFO) << "positive acquisition"; + LOG_AT_LEVEL(INFO) << "satellite " << d_satellite; + LOG_AT_LEVEL(INFO) << "sample_stamp " << d_sample_counter; + LOG_AT_LEVEL(INFO) << "test statistics value " + << d_test_statistics; + LOG_AT_LEVEL(INFO) << "test statistics threshold " << vt; + LOG_AT_LEVEL(INFO) << "code phase " << d_code_phase; + LOG_AT_LEVEL(INFO) << "doppler " << d_doppler_freq; + LOG_AT_LEVEL(INFO) << "magnitude " << magt; + LOG_AT_LEVEL(INFO) << "input signal power " << d_noise_power; + d_dwells = 0; + d_active = false; + } + else d_dwells++; + } + else + { + d_K--; + if ((d_K == 0) || (d_dwells > d_max_dwells)) + { + d_K = d_B; + d_dwells = 0; + d_fbins++; + if (d_fbins > max_freq_step) + { + d_fbins = 0; + LOG_AT_LEVEL(INFO) << "negative acquisition"; + LOG_AT_LEVEL(INFO) << "satellite " << d_satellite; + LOG_AT_LEVEL(INFO) << "sample_stamp" << d_sample_counter; + LOG_AT_LEVEL(INFO) << "test statistics value " + << d_test_statistics; + LOG_AT_LEVEL(INFO) << "test statistics threshold " << vt; + LOG_AT_LEVEL(INFO) << "input signal power " + << d_noise_power; + d_active = false; + } + else + { + d_doppler = d_doppler + pow(-1, d_fbins + 1) * d_fbins + * d_doppler_step; + } + } + else d_dwells++; + } + + // Record results to files + // if( d_dump ) + // { + // filename.str( "" ); + // filename << "./data/fft_" << doppler << "_.dat"; + // std::cout << filename.str().c_str(); + // std::cout << ".\n"; + // d_dump_file.open( filename.str().c_str(), std::ios::out + // | std::ios::binary ); + // d_dump_file.write( (char*) d_ifft->get_outbuf(), n ); //write directly |abs(·)|^2 in this Doppler bin + // d_dump_file.close(); + // } + + + if (d_active == false) + { + if (positive_acquisition) + { + acquisition_message = 1; + } + else + { + acquisition_message = 2; + } + + d_channel_internal_queue->push(acquisition_message); + } + + consume_each(1); + } + return 0; +} + +float gps_l1_ca_tong_pcps_acquisition_cc::calculate_envelope( + const gr_complex* _input_signal, std::complex* _local_code, + std::complex* _local_if_sin) +{ + float mag = 0.0; + std::complex tmp_cpx = 0.0; + //std::cout << "tmp_cpx " << tmp_cpx << std::endl; + + for (unsigned int i = 0; i < d_samples; i++) + { + tmp_cpx = tmp_cpx + _input_signal[i] * _local_code[i] + * _local_if_sin[i]; + } + //std::cout << "tmp_cpx " << tmp_cpx << std::endl; + + mag = abs(tmp_cpx); + return mag; +} diff --git a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_tong_pcps_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_tong_pcps_acquisition_cc.h new file mode 100644 index 000000000..3ed8b0c9b --- /dev/null +++ b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_tong_pcps_acquisition_cc.h @@ -0,0 +1,186 @@ +/*! + * \file gps_l1_ca_tong_pcps_acquisition_cc.h + * \brief Brief description of the file here + * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GPS_L1_CA_TONG_PCPS_ACQUISITION_CC_H +#define GPS_L1_CA_TONG_PCPS_ACQUISITION_CC_H + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include "concurrent_queue.h" + +class gps_l1_ca_tong_pcps_acquisition_cc; +typedef boost::shared_ptr + gps_l1_ca_tong_pcps_acquisition_cc_sptr; +gps_l1_ca_tong_pcps_acquisition_cc_sptr +gps_l1_ca_tong_pcps_make_acquisition_cc(unsigned int sampled_ms, + unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, + gr_msg_queue_sptr queue, bool dump, std::string dump_filename); + +class gps_l1_ca_tong_pcps_acquisition_cc: public gr_block +{ + +private: + + friend gps_l1_ca_tong_pcps_acquisition_cc_sptr + gps_l1_ca_tong_pcps_make_acquisition_cc(unsigned int sampled_ms, + unsigned int doppler_max, long freq, long fs_in, + int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename); + + gps_l1_ca_tong_pcps_acquisition_cc(unsigned int sampled_ms, + unsigned int doppler_max, long freq, long fs_in, + int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename); + + long d_fs_in; + long d_freq; + long d_doppler; + int d_samples_per_ms; + unsigned int d_doppler_resolution; + unsigned int d_satellite; + std::string d_satellite_str; + unsigned int d_doppler_max; + unsigned int d_doppler_step; + unsigned int d_sampled_ms; + unsigned int d_samples; + unsigned long int d_sample_counter; + unsigned long int d_acq_sample_stamp; + unsigned int d_fbins; + unsigned int d_indext; + unsigned d_dwells; + float d_pfa; + unsigned int d_A; + unsigned int d_B; + unsigned int d_max_dwells; + unsigned int d_K; + + gr_complex* d_if_sin; + + gr_complex* d_fft_codes; + + gri_fft_complex* d_fft_if; + + gri_fft_complex* d_ifft; + + gr_complex* d_ca_codes; + + gr_complex* d_aux_ca_code; + + unsigned int d_code_phase; + float d_doppler_freq; + float d_mag; + float d_noise_power; + float d_test_statistics; + + gr_msg_queue_sptr d_queue; + concurrent_queue *d_channel_internal_queue; + std::ofstream d_dump_file; + + bool d_active; + bool d_dump; + unsigned int d_channel; + std::string d_dump_filename; + +public: + + ~gps_l1_ca_tong_pcps_acquisition_cc(); + + signed int prn_code_phase(); + + float doppler_freq() + { + return d_doppler_freq; + } + unsigned int mag() + { + return d_mag; + } + + unsigned long int get_sample_stamp() + { + return d_acq_sample_stamp; + } + + void set_satellite(unsigned int satellite); + + void set_active(bool active) + { + d_active = active; + } + + void set_channel(unsigned int channel) + { + d_channel = channel; + } + + void set_doppler_max(unsigned int doppler_max) + { + d_doppler_max = doppler_max; + } + + void set_doppler_step(unsigned int doppler_step) + { + d_doppler_step = doppler_step; + } + + void set_doppler(unsigned int doppler) + { + d_doppler = doppler; + } + + void set_dwells(unsigned int dwells) + { + d_dwells = dwells; + } + + float calculate_envelope(const gr_complex* _input_signal, std::complex< + float>* _local_code, std::complex* _local_if_sin); + + void set_channel_queue(concurrent_queue *channel_internal_queue) + { + d_channel_internal_queue = channel_internal_queue; + } + + int general_work(int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif /* GPS_L1_CA_TONG_PCPS_ACQUISITION_CC_H*/ diff --git a/src/algorithms/acquisition/gnuradio_blocks/jamfile.jam b/src/algorithms/acquisition/gnuradio_blocks/jamfile.jam new file mode 100644 index 000000000..7e90c42b2 --- /dev/null +++ b/src/algorithms/acquisition/gnuradio_blocks/jamfile.jam @@ -0,0 +1,6 @@ +project : build-dir ../../../../build ; + +obj gps_l1_ca_gps_sdr_acquisition_cc : gps_l1_ca_gps_sdr_acquisition_cc.cc ; +obj gps_l1_ca_gps_sdr_acquisition_ss : gps_l1_ca_gps_sdr_acquisition_ss.cc ; +obj gps_l1_ca_pcps_acquisition_cc : gps_l1_ca_pcps_acquisition_cc.cc ; +obj gps_l1_ca_tong_pcps_acquisition_cc : gps_l1_ca_tong_pcps_acquisition_cc.cc ; \ No newline at end of file diff --git a/src/algorithms/acquisition/jamfile.jam b/src/algorithms/acquisition/jamfile.jam new file mode 100644 index 000000000..86bceb14f --- /dev/null +++ b/src/algorithms/acquisition/jamfile.jam @@ -0,0 +1,2 @@ +build-project adapters ; +build-project gnuradio_blocks ; diff --git a/src/algorithms/channel/adapters/channel.cc b/src/algorithms/channel/adapters/channel.cc new file mode 100644 index 000000000..9fcf3aac9 --- /dev/null +++ b/src/algorithms/channel/adapters/channel.cc @@ -0,0 +1,266 @@ +/*! + * \file channel.cc + * \brief Implementation of a GPS_L1_CA_Channel with a Finite State Machine + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "channel.h" + +#include "acquisition_interface.h" +#include "tracking_interface.h" +#include "telemetry_decoder_interface.h" +#include "configuration_interface.h" +#include "gnss_flowgraph.h" + +#include +#include +#include + +#include +#include + +#include +#include + +using google::LogMessage; + +//! Constructor +Channel::Channel(ConfigurationInterface *configuration, unsigned int channel, + GNSSBlockInterface *pass_through, AcquisitionInterface *acq, + TrackingInterface *trk, TelemetryDecoderInterface *nav, + std::string role, std::string implementation, gr_msg_queue_sptr queue) : + pass_through_(pass_through), acq_(acq), trk_(trk), nav_(nav), + role_(role), implementation_(implementation), channel_(channel), + queue_(queue) + +{ + stop_ = false; + acq_->set_channel(channel_); + trk_->set_channel(channel_); + nav_->set_channel(channel_); + + acq_->set_threshold(configuration->property("Acquisition" + + boost::lexical_cast(channel_) + ".threshold", 0.0)); + acq_->set_doppler_max(configuration->property("Acquisition" + + boost::lexical_cast(channel_) + ".doppler_max", + 10000)); + acq_->set_doppler_step(configuration->property("Acquisition" + + boost::lexical_cast(channel_) + ".doppler_step", + 250)); + + repeat_ = configuration->property("Acquisition" + boost::lexical_cast< + std::string>(channel_) + ".repeat_satellite", false); + std::cout << "Channel " << channel_ << " satellite repeat = " << repeat_ + << std::endl; + + acq_->set_channel_queue(&channel_internal_queue_); + trk_->set_channel_queue(&channel_internal_queue_); + + channel_fsm_.set_acquisition(acq_); + channel_fsm_.set_tracking(trk_); + channel_fsm_.set_channel(channel_); + channel_fsm_.set_queue(queue_); + + connected_ = false; + message_ = 0; + +} + + +//! Destructor +Channel::~Channel() +{ + + delete acq_; + delete trk_; + delete nav_; + delete pass_through_; +} + +void Channel::connect(gr_top_block_sptr top_block) +{ + + if (connected_) + { + LOG_AT_LEVEL(WARNING) << "channel already connected internally"; + return; + } + + pass_through_->connect(top_block); + acq_->connect(top_block); + trk_->connect(top_block); + nav_->connect(top_block); + + top_block->connect(pass_through_->get_right_block(), 0, + acq_->get_left_block(), 0); + DLOG(INFO) << "pass_through_ -> acquisition"; + + top_block->connect(pass_through_->get_right_block(), 0, + trk_->get_left_block(), 0); + DLOG(INFO) << "pass_through_ -> tracking"; + top_block->connect(trk_->get_right_block(), 0, nav_->get_left_block(), 0); // channel 1 + top_block->connect(trk_->get_right_block(), 1, nav_->get_left_block(), 1); // channel 2 + top_block->connect(trk_->get_right_block(), 2, nav_->get_left_block(), 2); // channel 3 + DLOG(INFO) << "tracking -> telemetry_decoder"; + + connected_ = true; +} + +void Channel::disconnect(gr_top_block_sptr top_block) +{ + + if (!connected_) + { + LOG_AT_LEVEL(WARNING) << "Channel already disconnected internally"; + return; + } + + top_block->disconnect(acq_->get_right_block(), 0, trk_->get_left_block(), + 0); + top_block->disconnect(trk_->get_right_block(), 0, nav_->get_left_block(), + 0); + + acq_->disconnect(top_block); + trk_->disconnect(top_block); + nav_->disconnect(top_block); + + connected_ = false; +} + +gr_basic_block_sptr Channel::get_left_block() +{ + return pass_through_->get_left_block(); +} + +gr_basic_block_sptr Channel::get_right_block() +{ + + return nav_->get_right_block(); +} + +void Channel::set_satellite(unsigned int satellite) +{ + satellite_ = satellite; + acq_->set_satellite(satellite); + trk_->set_satellite(satellite); + nav_->set_satellite(satellite); +} + +void Channel::start_acquisition() +{ + channel_fsm_.Event_gps_start_acquisition(); +} + +void Channel::start() +{ + ch_thread_ = boost::thread(&Channel::run, this); +} + +void Channel::run() +{ + start_acquisition(); + while (!stop_) + { + channel_internal_queue_.wait_and_pop(message_); + process_channel_messages(); + } + +} + +/* + * \brief Set stop_ to true and blocks the calling thread until + * the thread of the constructor has completed + */ +void Channel::stop() +{ + stop_ = true; + channel_internal_queue_.push(0); //message to stop channel + + /* When the boost::thread object that represents a thread of execution + * is destroyed the thread becomes detached. Once a thread is detached, + * it will continue executing until the invocation of the function or + * callable object supplied on construction has completed, + * or the program is terminated. In order to wait for a thread of + * execution to finish, the join() or timed_join() member functions of + * the boost::thread object must be used. join() will block the calling + * thread until the thread represented by the boost::thread object + * has completed. + * + */ + ch_thread_.join(); +} + +void Channel::process_channel_messages() +{ + switch (message_) + { + case 0: + + LOG_AT_LEVEL(INFO) << "Stop channel " << channel_; + + break; + + case 1: + + LOG_AT_LEVEL(INFO) << "Channel " << channel_ + << " ACQ SUCCESS satellite " << satellite_; + channel_fsm_.Event_gps_valid_acquisition(); + + break; + + case 2: + + LOG_AT_LEVEL(INFO) << "Channel " << channel_ + << " ACQ FAILED satellite " << satellite_; + if (repeat_ == true) + { + channel_fsm_.Event_gps_failed_acquisition_repeat(); + } + else + { + channel_fsm_.Event_gps_failed_acquisition_no_repeat(); + } + break; + + case 3: + LOG_AT_LEVEL(INFO) << "Channel " << channel_ + << " TRACKING FAILED satellite " << satellite_ + << ", reacquisition."; + channel_fsm_.Event_gps_failed_tracking(); + + break; + + default: + + LOG_AT_LEVEL(WARNING) << "Default case, invalid message."; + break; + } +} + diff --git a/src/algorithms/channel/adapters/channel.h b/src/algorithms/channel/adapters/channel.h new file mode 100644 index 000000000..51646303d --- /dev/null +++ b/src/algorithms/channel/adapters/channel.h @@ -0,0 +1,121 @@ +/*! + * \file channel.h + * \brief This class represents a GNSS channel. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * It holds blocks for acquisition, tracking, + * navigation data extraction and pseudorange calculation. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef CHANNEL_H_ +#define CHANNEL_H_ + +#include +#include + +#include "channel_interface.h" +#include "gps_l1_ca_channel_fsm.h" +#include "control_message_factory.h" +#include "concurrent_queue.h" + +class ConfigurationInterface; +class AcquisitionInterface; +class TrackingInterface; +class TelemetryDecoderInterface; +//class GpsL1CaChannelFsm; + +/*! + * \brief This class represents a GNSS channel. + * + */ +class Channel: public ChannelInterface +{ + +public: + //! Constructor + Channel(ConfigurationInterface *configuration, unsigned int channel, + GNSSBlockInterface *pass_through, AcquisitionInterface *acq, + TrackingInterface *trk, TelemetryDecoderInterface *nav, + std::string role, std::string implementation, + gr_msg_queue_sptr queue); + + //! Virtual destructor + virtual ~Channel(); + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + + std::string role(){ return role_;} + + std::string implementation(){ return "Channel";} + + size_t item_size(){ return 0;} + + unsigned int satellite(){ return satellite_;} + + AcquisitionInterface* acquisition(){ return acq_;} + + TrackingInterface* tracking(){ return trk_;} + + TelemetryDecoderInterface* telemetry(){ return nav_;} + + void start_acquisition(); + void set_satellite(unsigned int satellite); + void start(); + void stop(); + +private: + + GNSSBlockInterface *pass_through_; + AcquisitionInterface *acq_; + TrackingInterface *trk_; + TelemetryDecoderInterface *nav_; + + std::string role_; + std::string implementation_; + + unsigned int channel_; + unsigned int satellite_; + bool connected_; + bool stop_; + int message_; + bool repeat_; + + GpsL1CaChannelFsm channel_fsm_; + gr_msg_queue_sptr queue_; + concurrent_queue channel_internal_queue_; + boost::thread ch_thread_; + + void run(); + void process_channel_messages(); + +}; + +#endif /*CHANNEL_H_*/ diff --git a/src/algorithms/channel/adapters/jamfile.jam b/src/algorithms/channel/adapters/jamfile.jam new file mode 100644 index 000000000..d1a954382 --- /dev/null +++ b/src/algorithms/channel/adapters/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj channel : channel.cc ; \ No newline at end of file diff --git a/src/algorithms/channel/jamfile.jam b/src/algorithms/channel/jamfile.jam new file mode 100644 index 000000000..2024c84e2 --- /dev/null +++ b/src/algorithms/channel/jamfile.jam @@ -0,0 +1,3 @@ +build-project adapters ; +# build-project gnuradio_blocks ; +build-project libs ; \ No newline at end of file diff --git a/src/algorithms/channel/libs/gps_l1_ca_channel_fsm.cc b/src/algorithms/channel/libs/gps_l1_ca_channel_fsm.cc new file mode 100644 index 000000000..19b841cf1 --- /dev/null +++ b/src/algorithms/channel/libs/gps_l1_ca_channel_fsm.cc @@ -0,0 +1,209 @@ +/*! + * \file gps_l1_ca_channel_fsm.cc + * \briefState Machine for channel using boost::statechart + * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "gps_l1_ca_channel_fsm.h" +#include "control_message_factory.h" +#include "channel.h" + +#include +#include + +struct Ev_gps_channel_start_acquisition: sc::event< + Ev_gps_channel_start_acquisition> +{}; + +struct Ev_gps_channel_valid_acquisition: sc::event< + Ev_gps_channel_valid_acquisition> +{}; + +struct Ev_gps_channel_failed_acquisition_repeat: sc::event< + Ev_gps_channel_failed_acquisition_repeat> +{}; + +struct Ev_gps_channel_failed_acquisition_no_repeat: sc::event< + Ev_gps_channel_failed_acquisition_no_repeat> +{}; + +struct Ev_gps_channel_failed_tracking: sc::event< + Ev_gps_channel_failed_tracking> +{}; + +struct gps_channel_idle_fsm_S0: public sc::state +{ +public: + // sc::transition(event, next state) + typedef sc::transition reactions; + gps_channel_idle_fsm_S0(my_context ctx) : + my_base(ctx) + { + //std::cout << "Enter Channel_Idle_S0 " << std::endl; + } +}; + +struct gps_channel_acquiring_fsm_S1: public sc::state< + gps_channel_acquiring_fsm_S1, GpsL1CaChannelFsm> +{ +public: + typedef mpl::list, sc::transition< + Ev_gps_channel_failed_acquisition_repeat, + gps_channel_acquiring_fsm_S1>, sc::transition< + Ev_gps_channel_valid_acquisition, gps_channel_tracking_fsm_S2> > + reactions; + + gps_channel_acquiring_fsm_S1(my_context ctx) : + my_base(ctx) + { + //std::cout << "Enter Channel_Acq_S1 " << std::endl; + context ().start_acquisition(); + } +}; + +struct gps_channel_tracking_fsm_S2: public sc::state< + gps_channel_tracking_fsm_S2, GpsL1CaChannelFsm> +{ +public: + typedef sc::transition reactions; + + gps_channel_tracking_fsm_S2(my_context ctx) : + my_base(ctx) + { + //std::cout << "Enter Channel_tracking_S2 " << std::endl; + context ().start_tracking(); + } +}; + +struct gps_channel_waiting_fsm_S3: public sc::state< + gps_channel_waiting_fsm_S3, GpsL1CaChannelFsm> +{ +public: + typedef sc::transition reactions; + + gps_channel_waiting_fsm_S3(my_context ctx) : + my_base(ctx) + { + //std::cout << "Enter Channel_waiting_S3 " << std::endl; + context ().request_satellite(); + } +}; + +GpsL1CaChannelFsm::GpsL1CaChannelFsm() +{ + initiate(); //start the FSM +} + +GpsL1CaChannelFsm::GpsL1CaChannelFsm(AcquisitionInterface *acquisition) : + acq_(acquisition) +{ + initiate(); //start the FSM +} + +void GpsL1CaChannelFsm::Event_gps_start_acquisition() +{ + this->process_event(Ev_gps_channel_start_acquisition()); +} + +void GpsL1CaChannelFsm::Event_gps_valid_acquisition() +{ + this->process_event(Ev_gps_channel_valid_acquisition()); +} + +void GpsL1CaChannelFsm::Event_gps_failed_acquisition_repeat() +{ + this->process_event(Ev_gps_channel_failed_acquisition_repeat()); +} + +void GpsL1CaChannelFsm::Event_gps_failed_acquisition_no_repeat() +{ + this->process_event(Ev_gps_channel_failed_acquisition_no_repeat()); +} + +void GpsL1CaChannelFsm::Event_gps_failed_tracking() +{ + this->process_event(Ev_gps_channel_failed_tracking()); +} +void GpsL1CaChannelFsm::set_acquisition(AcquisitionInterface *acquisition) +{ + acq_ = acquisition; +} + +void GpsL1CaChannelFsm::set_tracking(TrackingInterface *tracking) +{ + trk_ = tracking; +} + +void GpsL1CaChannelFsm::set_queue(gr_msg_queue_sptr queue) +{ + queue_ = queue; +} + +void GpsL1CaChannelFsm::set_channel(unsigned int channel) +{ + channel_ = channel; +} + +void GpsL1CaChannelFsm::start_acquisition() +{ + acq_->reset(); +} + +void GpsL1CaChannelFsm::start_tracking() +{ + LOG_AT_LEVEL(INFO) << "Channel " << channel_ + << " passing prn code phase " << acq_->prn_code_phase(); + LOG_AT_LEVEL(INFO) << "Channel " << channel_ + << " passing doppler freq shift " << acq_->doppler_freq_shift(); + LOG_AT_LEVEL(INFO) << "Channel " << channel_ + << " passing acquisition sample stamp " + << acq_->get_sample_stamp(); + trk_->set_prn_code_phase(acq_->prn_code_phase()); + trk_->set_doppler_freq_shift(acq_->doppler_freq_shift()); + trk_->set_acq_sample_stamp(acq_->get_sample_stamp()); + trk_->start_tracking(); +} + +void GpsL1CaChannelFsm::request_satellite() +{ + ControlMessageFactory* cmf = new ControlMessageFactory(); + if (queue_ != gr_msg_queue_sptr()) + { + queue_->handle(cmf->GetQueueMessage(channel_, 0)); + } + delete cmf; + +} + diff --git a/src/algorithms/channel/libs/gps_l1_ca_channel_fsm.h b/src/algorithms/channel/libs/gps_l1_ca_channel_fsm.h new file mode 100644 index 000000000..182d4d130 --- /dev/null +++ b/src/algorithms/channel/libs/gps_l1_ca_channel_fsm.h @@ -0,0 +1,96 @@ +/*! + * \file gps_l1_ca_channel_fsm.h + * \brief State Machine for channel using boost::statechart + * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_GPS_L1_CA_CHANNEL_FSM_H +#define GNSS_SDR_GPS_L1_CA_CHANNEL_FSM_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "acquisition_interface.h" +#include "tracking_interface.h" +#include "telemetry_decoder_interface.h" +#include + +#include +#include + +namespace sc = boost::statechart; +namespace mpl = boost::mpl; + +struct gps_channel_idle_fsm_S0; +struct gps_channel_acquiring_fsm_S1; +struct gps_channel_tracking_fsm_S2; +struct gps_channel_waiting_fsm_S3; + +/*! + * \brief This class implements a State Machine for channel using boost::statechart + */ +class GpsL1CaChannelFsm: public sc::state_machine +{ + +public: + + GpsL1CaChannelFsm(); + GpsL1CaChannelFsm(AcquisitionInterface *acquisition); + + void set_acquisition(AcquisitionInterface *acquisition); + void set_tracking(TrackingInterface *tracking); + void set_queue(gr_msg_queue_sptr queue); + void set_channel(unsigned int channel); + void start_acquisition(); + void start_tracking(); + void request_satellite(); + + //FSM EVENTS + void Event_gps_start_acquisition(); + void Event_gps_valid_acquisition(); + void Event_gps_failed_acquisition_repeat(); + void Event_gps_failed_acquisition_no_repeat(); + void Event_gps_failed_tracking(); + +private: + AcquisitionInterface *acq_; + TrackingInterface *trk_; + TelemetryDecoderInterface *nav_; + gr_msg_queue_sptr queue_; + unsigned int channel_; +}; + +#endif /*GNSS_SDR_GPS_L1_CA_CHANNEL_FSM_H*/ diff --git a/src/algorithms/channel/libs/jamfile.jam b/src/algorithms/channel/libs/jamfile.jam new file mode 100644 index 000000000..4d04993ce --- /dev/null +++ b/src/algorithms/channel/libs/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj gps_l1_ca_channel_fsm : gps_l1_ca_channel_fsm.cc ; \ No newline at end of file diff --git a/src/algorithms/conditioner/adapters/direct_resampler_conditioner.cc b/src/algorithms/conditioner/adapters/direct_resampler_conditioner.cc new file mode 100644 index 000000000..61dc7a6ea --- /dev/null +++ b/src/algorithms/conditioner/adapters/direct_resampler_conditioner.cc @@ -0,0 +1,136 @@ +/*! + * \file direct_resampler_conditioner.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "direct_resampler_conditioner.h" + +#include +#include + +#include "direct_resampler_conditioner_cc.h" +#include "direct_resampler_conditioner_ss.h" + +#include "configuration_interface.h" + +#include +#include + +using google::LogMessage; + +DirectResamplerConditioner::DirectResamplerConditioner( + ConfigurationInterface* configuration, std::string role, + unsigned int in_stream, unsigned int out_stream) : + role_(role), in_stream_(in_stream), out_stream_(out_stream) +{ + + std::string default_item_type = "short"; + std::string default_dump_file = "./data/signal_conditioner.dat"; + + sample_freq_in_ = configuration->property(role_ + ".sample_freq_in", + (double)4000000.0); + sample_freq_out_ = configuration->property(role_ + ".sample_freq_out", + (double)2048000.0); + item_type_ = configuration->property(role + ".item_type", + default_item_type); + dump_ = configuration->property(role + ".dump", false); + dump_filename_ = configuration->property(role + ".dump_filename", + default_dump_file); + + if (item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + resampler_ = direct_resampler_make_conditioner_cc(sample_freq_in_, + sample_freq_out_); + } + else if (item_type_.compare("short") == 0) + { + item_size_ = sizeof(short); + resampler_ = direct_resampler_make_conditioner_ss(sample_freq_in_, + sample_freq_out_); + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ + << " unrecognized item type. Using short"; + item_size_ = sizeof(short); + } + + if (dump_) + { + DLOG(INFO) << "Dumping output into file " << dump_filename_; + file_sink_ = gr_make_file_sink(item_size_, dump_filename_.c_str()); + } + + DLOG(INFO) << "sample_freq_in " << sample_freq_in_; + DLOG(INFO) << "sample_freq_out" << sample_freq_out_; + DLOG(INFO) << "Item size " << item_size_; + DLOG(INFO) << "resampler(" << resampler_->unique_id() << ")"; + if (dump_) + { + DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; + } +} +DirectResamplerConditioner::~DirectResamplerConditioner() +{ +} + +void DirectResamplerConditioner::connect(gr_top_block_sptr top_block) +{ + + if (dump_) + { + top_block->connect(resampler_, 0, file_sink_, 0); + DLOG(INFO) << "connected resampler to file sink"; + } + else + { + DLOG(INFO) << "nothing to connect internally"; + } + +} + +void DirectResamplerConditioner::disconnect(gr_top_block_sptr top_block) +{ + if (dump_) + { + top_block->disconnect(resampler_, 0, file_sink_, 0); + } +} + +gr_basic_block_sptr DirectResamplerConditioner::get_left_block() +{ + return resampler_; +} + +gr_basic_block_sptr DirectResamplerConditioner::get_right_block() +{ + return resampler_; +} diff --git a/src/algorithms/conditioner/adapters/direct_resampler_conditioner.h b/src/algorithms/conditioner/adapters/direct_resampler_conditioner.h new file mode 100644 index 000000000..7fb83644c --- /dev/null +++ b/src/algorithms/conditioner/adapters/direct_resampler_conditioner.h @@ -0,0 +1,87 @@ +/*! + * \file direct_resampler_conditioner.h + * \brief This class represents a direct resampler. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef DIRECT_RESAMPLER_CONDITIONER_H_ +#define DIRECT_RESAMPLER_CONDITIONER_H_ + +#include + +#include "gnss_block_interface.h" + +class ConfigurationInterface; + +class DirectResamplerConditioner: public GNSSBlockInterface +{ + +public: + DirectResamplerConditioner(ConfigurationInterface* configuration, + std::string role, unsigned int in_stream, + unsigned int out_stream); + virtual ~DirectResamplerConditioner(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "DirectResamplerConditioner"; + } + size_t item_size() + { + return item_size_; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + +private: + + std::string role_; + unsigned int in_stream_; + unsigned int out_stream_; + + std::string item_type_; + size_t item_size_; + long samples_; + bool dump_; + std::string dump_filename_; + double sample_freq_in_; + double sample_freq_out_; + + gr_block_sptr resampler_; + gr_block_sptr file_sink_; +}; + +#endif /*DIRECT_RESAMPLER_CONDITIONER_H_*/ diff --git a/src/algorithms/conditioner/adapters/jamfile.jam b/src/algorithms/conditioner/adapters/jamfile.jam new file mode 100644 index 000000000..671a7edd7 --- /dev/null +++ b/src/algorithms/conditioner/adapters/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj direct_resampler_conditioner : direct_resampler_conditioner.cc ; \ No newline at end of file diff --git a/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_cc.cc b/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_cc.cc new file mode 100644 index 000000000..840e0af76 --- /dev/null +++ b/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_cc.cc @@ -0,0 +1,146 @@ +/*! + * \file direct_resampler_conditioner_cc.cc + * \brief Brief description of the file here + * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "direct_resampler_conditioner_cc.h" + +#include + +#include + +#include +#include + +using google::LogMessage; + +direct_resampler_conditioner_cc_sptr direct_resampler_make_conditioner_cc( + double sample_freq_in, double sample_freq_out) +{ + + return direct_resampler_conditioner_cc_sptr( + new direct_resampler_conditioner_cc(sample_freq_in, + sample_freq_out)); +} + +direct_resampler_conditioner_cc::direct_resampler_conditioner_cc( + double sample_freq_in, double sample_freq_out) : + gr_block("direct_resampler_conditioner_cc", gr_make_io_signature(1, 1, + sizeof(gr_complex)), gr_make_io_signature(1, 1, + sizeof(gr_complex))), d_sample_freq_in(sample_freq_in), + d_sample_freq_out(sample_freq_out), d_phase(0), d_lphase(0), + d_history(1) +{ + + // Computes the phase step multiplying the resampling ratio by 2^32 = 4294967296 + if (d_sample_freq_in >= d_sample_freq_out) + { + d_phase_step = (unsigned int)floor((double)4294967296.0 + * sample_freq_out / sample_freq_in); + } + else + { + d_phase_step = (unsigned int)floor((double)4294967296.0 + * sample_freq_in / sample_freq_out); + } + + set_relative_rate(1.0 * sample_freq_out / sample_freq_in); + set_output_multiple(1); +} + +direct_resampler_conditioner_cc::~direct_resampler_conditioner_cc() +{ + +} + +void direct_resampler_conditioner_cc::forecast(int noutput_items, + gr_vector_int &ninput_items_required) +{ + + int nreqd = std::max((unsigned)1, (int)((double)(noutput_items + 1) + * sample_freq_in() / sample_freq_out()) + history() - 1); + unsigned ninputs = ninput_items_required.size(); + + for (unsigned i = 0; i < ninputs; i++) + { + ninput_items_required[i] = nreqd; + } +} + +int direct_resampler_conditioner_cc::general_work(int noutput_items, + gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + + const gr_complex *in = (const gr_complex *)input_items[0]; + gr_complex *out = (gr_complex *)output_items[0]; + + int lcv = 0; + int count = 0; + + if (d_sample_freq_in >= d_sample_freq_out) + { + while ((lcv < noutput_items)) + { + if (d_phase <= d_lphase) + { + out[lcv] = *in; + lcv++; + } + + d_lphase = d_phase; + d_phase += d_phase_step; + in++; + count++; + } + } + else + { + while ((lcv < noutput_items)) + { + d_lphase = d_phase; + d_phase += d_phase_step; + if (d_phase <= d_lphase) + { + in++; + count++; + } + out[lcv] = *in; + lcv++; + } + } + + consume_each(std::min(count, ninput_items[0])); + return lcv; +} diff --git a/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_cc.h b/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_cc.h new file mode 100644 index 000000000..6f297ec43 --- /dev/null +++ b/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_cc.h @@ -0,0 +1,93 @@ +/*! + * \file direct_resampler_conditioner_cc.h + * + * \brief Direct resampler with + * gr_complex input and gr_complex output + * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * This block takes in a signal stream and performs direct + * resampling. + * + * The theory behind this block can be found in Chapter 7.5 of + * the following book. + * + * \param sample_freq_in (double) Specifies the sampling frequency of the input signal + * \param sample_freq_out (double) Specifies the sampling frequency of the output signal + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef INCLUDED_DIRECT_RESAMPLER_CONDITIONER_CC_H +#define INCLUDED_DIRECT_RESAMPLER_CONDITIONER_CC_H + +#include + +class direct_resampler_conditioner_cc; +typedef boost::shared_ptr + direct_resampler_conditioner_cc_sptr; +direct_resampler_conditioner_cc_sptr +direct_resampler_make_conditioner_cc(double sample_freq_in, + double sample_freq_out); + +class direct_resampler_conditioner_cc: public gr_block +{ + +private: + + friend direct_resampler_conditioner_cc_sptr + direct_resampler_make_conditioner_cc(double sample_freq_in, + double sample_freq_out); + + double d_sample_freq_in; + double d_sample_freq_out; + unsigned int d_phase; + unsigned int d_lphase; + unsigned int d_phase_step; + unsigned int d_history; + + direct_resampler_conditioner_cc(double sample_freq_in, + double sample_freq_out); + +public: + + ~direct_resampler_conditioner_cc(); + + unsigned int sample_freq_in() const + { + return d_sample_freq_in; + } + unsigned int sample_freq_out() const + { + return d_sample_freq_out; + } + void forecast(int noutput_items, gr_vector_int &ninput_items_required); + int general_work(int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif /* INCLUDED_DIRECT_RESAMPLER_CONDITIONER_CC_H */ diff --git a/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_ss.cc b/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_ss.cc new file mode 100644 index 000000000..7c52507a6 --- /dev/null +++ b/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_ss.cc @@ -0,0 +1,147 @@ +/*! + * \file direct_resampler_conditioner_ss.cc + * \brief Brief description of the file here + * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "direct_resampler_conditioner_ss.h" + +#include "gps_sdr_signal_processing.h" + +#include + +#include + +#include +#include + +using google::LogMessage; + +direct_resampler_conditioner_ss_sptr direct_resampler_make_conditioner_ss( + double sample_freq_in, double sample_freq_out) +{ + + return direct_resampler_conditioner_ss_sptr( + new direct_resampler_conditioner_ss(sample_freq_in, + sample_freq_out)); +} + +direct_resampler_conditioner_ss::direct_resampler_conditioner_ss( + double sample_freq_in, double sample_freq_out) : + gr_block("direct_resampler_make_conditioner_ss", gr_make_io_signature(1, + 1, sizeof(short)), gr_make_io_signature(1, 1, sizeof(short))), + d_sample_freq_in(sample_freq_in), d_sample_freq_out( + sample_freq_out), d_phase(0), d_lphase(0), d_history(1) +{ + + // Computes the phase step multiplying the resampling ratio by 2^32 = 4294967296 + if (d_sample_freq_in >= d_sample_freq_out) + { + d_phase_step = (unsigned int)floor((double)4294967296.0 + * sample_freq_out / sample_freq_in); + } + else + { + d_phase_step = (unsigned int)floor((double)4294967296.0 + * sample_freq_in / sample_freq_out); + } + + set_relative_rate(1.0 * sample_freq_out / sample_freq_in); + set_output_multiple(1); +} + +direct_resampler_conditioner_ss::~direct_resampler_conditioner_ss() +{ + +} + +void direct_resampler_conditioner_ss::forecast(int noutput_items, + gr_vector_int &ninput_items_required) +{ + + int nreqd = std::max((unsigned)1, (int)((double)(noutput_items + 1) + * sample_freq_in() / sample_freq_out()) + history() - 1); + unsigned ninputs = ninput_items_required.size(); + + for (unsigned i = 0; i < ninputs; i++) + { + ninput_items_required[i] = nreqd; + } +} + +int direct_resampler_conditioner_ss::general_work(int noutput_items, + gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + + const CPX *in = (const CPX *)input_items[0]; + CPX *out = (CPX *)output_items[0]; + + int lcv = 0; + int count = 0; + + if (d_sample_freq_in >= d_sample_freq_out) + { + while ((lcv < noutput_items)) + { + if (d_phase <= d_lphase) + { + out[lcv] = *in; + lcv++; + } + + d_lphase = d_phase; + d_phase += d_phase_step; + in++; + count++; + } + } + else + { + while ((lcv < noutput_items)) + { + d_lphase = d_phase; + d_phase += d_phase_step; + if (d_phase <= d_lphase) + { + in++; + count++; + } + out[lcv] = *in; + lcv++; + } + } + + consume_each(std::min(count, ninput_items[0])); + return lcv; +} diff --git a/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_ss.h b/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_ss.h new file mode 100644 index 000000000..8e251cb35 --- /dev/null +++ b/src/algorithms/conditioner/gnuradio_blocks/direct_resampler_conditioner_ss.h @@ -0,0 +1,83 @@ +/*! + * \file direct_resampler_conditioner_ss.h + * \brief Direct resampler with + * short input and short output + * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef INCLUDED_DIRECT_RESAMPLER_CONDITIONER_SS_H +#define INCLUDED_DIRECT_RESAMPLER_CONDITIONER_SS_H + +#include + +class direct_resampler_conditioner_ss; +typedef boost::shared_ptr + direct_resampler_conditioner_ss_sptr; +direct_resampler_conditioner_ss_sptr +direct_resampler_make_conditioner_ss(double sample_freq_in, + double sample_freq_out); + +class direct_resampler_conditioner_ss: public gr_block +{ + +private: + + friend direct_resampler_conditioner_ss_sptr + direct_resampler_make_conditioner_ss(double sample_freq_in, + double sample_freq_out); + + double d_sample_freq_in; + double d_sample_freq_out; + unsigned int d_phase; + unsigned int d_lphase; + unsigned int d_phase_step; + unsigned int d_history; + + direct_resampler_conditioner_ss(double sample_freq_in, + double sample_freq_out); + +public: + + ~direct_resampler_conditioner_ss(); + + unsigned int sample_freq_in() const + { + return d_sample_freq_in; + } + unsigned int sample_freq_out() const + { + return d_sample_freq_out; + } + void forecast(int noutput_items, gr_vector_int &ninput_items_required); + int general_work(int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif /* INCLUDED_DIRECT_RESAMPLER_CONDITIONER_SS_H */ diff --git a/src/algorithms/conditioner/gnuradio_blocks/jamfile.jam b/src/algorithms/conditioner/gnuradio_blocks/jamfile.jam new file mode 100644 index 000000000..4661e5a2e --- /dev/null +++ b/src/algorithms/conditioner/gnuradio_blocks/jamfile.jam @@ -0,0 +1,4 @@ +project : build-dir ../../../../build ; + +obj direct_resampler_conditioner_cc : direct_resampler_conditioner_cc.cc ; +obj direct_resampler_conditioner_ss : direct_resampler_conditioner_ss.cc ; \ No newline at end of file diff --git a/src/algorithms/conditioner/jamfile.jam b/src/algorithms/conditioner/jamfile.jam new file mode 100644 index 000000000..86bceb14f --- /dev/null +++ b/src/algorithms/conditioner/jamfile.jam @@ -0,0 +1,2 @@ +build-project adapters ; +build-project gnuradio_blocks ; diff --git a/src/algorithms/jamfile.jam b/src/algorithms/jamfile.jam new file mode 100644 index 000000000..e0bd0a1c7 --- /dev/null +++ b/src/algorithms/jamfile.jam @@ -0,0 +1,9 @@ +build-project acquisition ; +build-project channel ; +build-project conditioner ; +build-project libs ; +build-project signal_source ; +build-project tracking ; +build-project telemetry_decoder ; +build-project observables ; +build-project output_filter ; \ No newline at end of file diff --git a/src/algorithms/libs/gnss_sdr_valve.cc b/src/algorithms/libs/gnss_sdr_valve.cc new file mode 100644 index 000000000..9f502d98c --- /dev/null +++ b/src/algorithms/libs/gnss_sdr_valve.cc @@ -0,0 +1,82 @@ +/*! + * \file gnss_sdr_valve.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "gnss_sdr_valve.h" + +#include + +#include "control_message_factory.h" + +#include +#include + +using google::LogMessage; + +gnss_sdr_valve::gnss_sdr_valve (size_t sizeof_stream_item, + int nitems, + gr_msg_queue_sptr queue) : gr_sync_block ("valve", + gr_make_io_signature (1, 1, sizeof_stream_item), + gr_make_io_signature (1, 1, sizeof_stream_item)), + d_nitems (nitems), d_ncopied_items (0), d_queue(queue) +{} + +gr_block_sptr gnss_sdr_make_valve (size_t sizeof_stream_item, + int nitems, + gr_msg_queue_sptr queue) +{ + return gr_block_sptr (new gnss_sdr_valve (sizeof_stream_item, nitems, queue)); +} + +int gnss_sdr_valve::work (int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + if (d_ncopied_items >= d_nitems) + { + + ControlMessageFactory* cmf = new ControlMessageFactory(); + d_queue->handle(cmf->GetQueueMessage(200,0)); + delete cmf; + + return -1; // Done! + } + + unsigned n = std::min (d_nitems - d_ncopied_items, noutput_items); + + if (n == 0) + return 0; + + memcpy (output_items[0], input_items[0], n * input_signature()->sizeof_stream_item (0)); + d_ncopied_items += n; + + return n; +} diff --git a/src/algorithms/libs/gnss_sdr_valve.h b/src/algorithms/libs/gnss_sdr_valve.h new file mode 100644 index 000000000..705ddca7f --- /dev/null +++ b/src/algorithms/libs/gnss_sdr_valve.h @@ -0,0 +1,69 @@ +/*! + * \file gnss_sdr_valve.h + * \brief This class implements a GNU Radio block that sends a STOP message to the + * control queue right after a specific number of samples have passed through it. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + + +#ifndef GNSS_SDR_VALVE_H_ +#define GNSS_SDR_VALVE_H_ + +#include +#include +#include + +gr_block_sptr gnss_sdr_make_valve (size_t sizeof_stream_item, + int nitems, + gr_msg_queue_sptr queue); + +class gnss_sdr_valve : public gr_sync_block +{ + + friend gr_block_sptr gnss_sdr_make_valve(size_t sizeof_stream_item, + int nitems, + gr_msg_queue_sptr queue); + gnss_sdr_valve (size_t sizeof_stream_item, + int nitems, + gr_msg_queue_sptr queue); + + int d_nitems; + int d_ncopied_items; + gr_msg_queue_sptr d_queue; + +public: + + int work (int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif /*GNSS_SDR_VALVE_H_*/ diff --git a/src/algorithms/libs/gps_sdr_defines.h b/src/algorithms/libs/gps_sdr_defines.h new file mode 100644 index 000000000..c945584f5 --- /dev/null +++ b/src/algorithms/libs/gps_sdr_defines.h @@ -0,0 +1,169 @@ +/*----------------------------------------------------------------------------------------------*/ +/*! \file defines.h +// +// FILENAME: defines.h +// +// DESCRIPTION: Important, non board-specific defines, many associated with IS-GPS-200D. +// +// DEVELOPERS: Gregory W. Heckler (2003-2009) +// +// LICENSE TERMS: Copyright (c) Gregory W. Heckler 2009 +// +// This file is part of the GPS Software Defined Radio (GPS-SDR) +// +// The GPS-SDR is free software; you can redistribute it and/or modify it under the terms of the +// GNU General Public License as published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. The GPS-SDR is distributed in the hope that +// it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// Note: Comments within this file follow a syntax that is compatible with +// DOXYGEN and are utilized for automated document extraction +// +// Reference: + */ +/*----------------------------------------------------------------------------------------------*/ + +#ifndef DEFINES_H_ +#define DEFINES_H_ + +/* For unnamed pipes */ +/*----------------------------------------------------------------------------------------------*/ +#define READ (0) //!< Read handle +#define WRITE (1) //!< Write handle +#define TRUE (1) //!< True? +#define FALSE (0) //!< False! +/*----------------------------------------------------------------------------------------------*/ + +/* First make some type prototypes */ +/*----------------------------------------------------------------------------------------------*/ +typedef unsigned char uint8; //!< Unsigned byte +typedef unsigned short uint16; //!< Unsigned word +//typedef unsigned long uint32; //!< Unsigned double word +typedef unsigned long long uint64; //!< Unsigned quadruple word +typedef signed char int8; //!< Signed byte +typedef signed short int16; //!< Signed word +//typedef signed long int32; //!< Signed double word +typedef signed long long int64; //!< Signed quadruple word +typedef signed int int32; +typedef unsigned int uint32; +/*----------------------------------------------------------------------------------------------*/ + +/* Constants for scaling the ephemeris found in the data message + the format is the following: TWO_N5 -> 2^-5, TWO_P4 -> 2^4, PI_TWO_N43 -> Pi*2^-43, etc etc + Additionally some of the PI*2^N terms are used in the tracking stuff + TWO_PX ==> 2^X + TWO_NX ==> 2^-X + PI_TWO_NX ==> Pi*2^-X + PI_TWO_PX ==> Pi*2^X + ONE_PI_TWO_PX = (1/Pi)*2^X +*/ +/*----------------------------------------------------------------------------------------------*/ +#define TWO_P4 (16) //!< 2^4 +#define TWO_P11 (2048) //!< 2^11 +#define TWO_P12 (4096) //!< 2^12 +#define TWO_P14 (16384) //!< 2^14 +#define TWO_P16 (65536) //!< 2^16 +#define TWO_P19 (524288) //!< 2^19 +#define TWO_P31 (2147483648.0) //!< 2^31 +#define TWO_P32 (4294967296.0) //!< 2^32 this is too big for an int so add the x.0 +#define TWO_P57 (1.441151880758559e+017) //!< 2^57 + +#define TWO_N5 (0.03125) //!< 2^-5 +#define TWO_N11 (4.882812500000000e-004) //!< 2^-11 +#define TWO_N19 (1.907348632812500e-006) //!< 2^-19 +#define TWO_N20 (9.536743164062500e-007) //!< 2^-20 +#define TWO_N21 (4.768371582031250e-007) //!< 2^-21 +#define TWO_N24 (5.960464477539063e-008) //!< 2^-24 +#define TWO_N25 (2.980232238769531e-008) //!< 2^-25 +#define TWO_N27 (7.450580596923828e-009) //!< 2^-27 +#define TWO_N29 (1.862645149230957e-009) //!< 2^-29 +#define TWO_N30 (9.313225746154785e-010) //!< 2^-30 +#define TWO_N31 (4.656612873077393e-010) //!< 2^-31 +#define TWO_N32 (2.328306436538696e-010) //!< 2^-32 +#define TWO_N33 (1.164153218269348e-010) //!< 2^-33 +#define TWO_N38 (3.637978807091713e-012) //!< 2^-38 +#define TWO_N43 (1.136868377216160e-013) //!< 2^-43 +#define TWO_N50 (8.881784197001252e-016) //!< 2^-50 +#define TWO_N55 (2.775557561562891e-017) //!< 2^-55 +#define TWO_P56 (7.205759403792794e+016) //!< 2^56 +#define TWO_P57 (1.441151880758559e+017) //!< 2^57 + +#define PI_TWO_N19 (5.992112452678286e-006) //!< Pi*2^-19 +#define PI_TWO_N43 (3.571577341960839e-013) //!< Pi*2^-43 +#define PI_TWO_N31 (1.462918079267160e-009) //!< Pi*2^-31 +#define PI_TWO_N38 (1.142904749427469e-011) //!< Pi*2^-38 +#define PI_TWO_N23 (3.745070282923929e-007) //!< Pi*2^-23 + +/* from ICD-GPS-2000 !!! Do not extend the number of significant digits !!! */ +#ifndef PI +#define PI (3.141592653589793) //!< Pi +#endif +#ifndef TWO_PI +#define TWO_PI (6.283185307179586) //!< 2*Pi +#endif + +#define THREE_PI_OVER_2 (4.7123889803) //!< 3*Pi/2 +#define PI_OVER_2 (1.5707963267) //!< Pi/2 +#define RAD_2_DEG (57.29577951308232) //!< 180/Pi +#define DEG_2_RAD (0.01745329251994) //!< Pi/180 +/*----------------------------------------------------------------------------------------------*/ + + +/* Channel Defines */ +/*----------------------------------------------------------------------------------------------*/ +#define FRAME_SIZE_PLUS_2 (12) //!< Number of 30 bit words in subframe plus 2 +#define PREAMBLE (unsigned long)(0x008B) //!< GPS data message preamble. +#define INVERSEPREAMBLE (unsigned long)(0x0074) //!< Inverted preamble. +/*----------------------------------------------------------------------------------------------*/ + + +/* PVT Stuff */ +/*----------------------------------------------------------------------------------------------*/ +#define GRAVITY_CONSTANT (3.986005e14) //!< Earth's WGS-84 gravitational constant (m^3/s^2) as specified in IS-GPS-200D +#define WGS84OE (7.2921151467e-5) //!< Earth's WGS-84 rotation rate (rads/s) as specified in IS-GPS-200D +#define WGS84_MAJOR_AXIS (6378137.0) //!< Earth's WGS-84 ellipsoid's major axis +#define WGS84_MINOR_AXIS (6356752.314245) //!< Earth's WGS-84 ellipsoid's minor axis +#define SECONDS_IN_1024_WEEKS (619315200.0) //!< Number of seconds in 1024 weeks +#define SECONDS_IN_WEEK (604800.0) //!< Number of seconds in a week +#define HALF_OF_SECONDS_IN_WEEK (302400.0) //!< Number of seconds in one half of a week +#define SECONDS_IN_DAY (86400.0) //!< Number of seconds in a day +#define SECONDS_IN_HOUR (3600.0) //!< Number of seconds in an hour +#define SECONDS_IN_MINUTE (60.0) //!< Number of seconds in a minute +#define SECONDS_IN_HALF_HOUR (1800.0) //!< Number of seconds in a half hour +#define FOUR_HOURS (14400.0) //!< Number of seconds in 4 hrs +#define SECONDS_PER_MZCOUNT (0.6) //!< Seconds per RTCM-104 modified Z-count. +#define L1 (1.57542e9) +#define L2 (1.2276e9) +#define L1_WAVELENGTH (1.902936727983649e-001) //!< Meters +#define L1_OVER_C (5.255035468570728) //!< L1 over Speed O Light +#define C_OVER_L1 (0.190293672798365) //!< Speed O Light over L1 +#ifndef SPEED_OF_LIGHT + #define SPEED_OF_LIGHT (2.99792458e8) //!< Speed of light (m/s) as specified in IS-GPS-200D +#endif +#define INVERSE_L1 (6.347513678891978e-10) //!< 1/L1 +#define INVERSE_SPEED_OF_LIGHT (3.33564095198152049576e-9) //!< Inverse speed of light +#define CODE_RATE (1.023e6) //!< L1 C/A code chipping rate +#define INVERSE_CODE_RATE (9.775171065493646e-07) //!< 1/L1 C/A code chipping rate +#define CODE_CHIPS (1023) +#define SAMPS_MS (2048) //!< All incoming signals are resampled to this sampling frequency +#define SAMPLE_FREQUENCY (2048000) //!< All incoming signals are resampled to this sampling frequency +#define INVERSE_SAMPLE_FREQUENCY (4.882812500000000e-7) +/*----------------------------------------------------------------------------------------------*/ + + +/* Global Serial Port */ +/*----------------------------------------------------------------------------------------------*/ +#define CHECK_STATUS(x) if((x) != NU_SUCCESS) {ERC_System_Error((x));} +#define READ (0) +#define WRITE (1) +/*----------------------------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------------------------*/ +#define NON_EXISTENT_SV (666) +#define NON_EXISTENT_IODE (9999) +#define STALE_SPS_VALUE (99999) +/*----------------------------------------------------------------------------------------------*/ + +#endif //DEFINES_H_ diff --git a/src/algorithms/libs/gps_sdr_fft.cc b/src/algorithms/libs/gps_sdr_fft.cc new file mode 100644 index 000000000..1caba1021 --- /dev/null +++ b/src/algorithms/libs/gps_sdr_fft.cc @@ -0,0 +1,816 @@ +/*----------------------------------------------------------------------------------------------*/ +/*! \file fft.cpp +// +// FILENAME: fft.cpp +// +// DESCRIPTION: Implements member functions of the FFT class. +// +// DEVELOPERS: Gregory W. Heckler (2003-2009) +// +// LICENSE TERMS: Copyright (c) Gregory W. Heckler 2009 +// +// This file is part of the GPS Software Defined Radio (GPS-SDR) +// +// The GPS-SDR is free software; you can redistribute it and/or modify it under the terms of the +// GNU General Public License as published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. The GPS-SDR is distributed in the hope that +// it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// Note: Comments within this file follow a syntax that is compatible with +// DOXYGEN and are utilized for automated document extraction +// +// Reference: +*/ +/*----------------------------------------------------------------------------------------------*/ + +#include "gps_sdr_fft.h" + +#include +#include +#include + + +//#define NO_SIMD + +#ifdef NO_SIMD + void rank(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize); + void rankdf(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize); + void rank_noscale(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize); + void rankdf_noscale(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize); + void bfly(CPX *_A, CPX *_B, MIX *_W); + void bflydf(CPX *_A, CPX *_B, MIX *_W); + void bfly_noscale(CPX *_A, CPX *_B, MIX *_W); + void bflydf_noscale(CPX *_A, CPX *_B, MIX *_W); +#else + void rank(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) __attribute__ ((noinline)); + void rankdf(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) __attribute__ ((noinline)); + void rank_noscale(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) __attribute__ ((noinline)); + void rankdf_noscale(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) __attribute__ ((noinline)); +#endif + +FFT::FFT() +{ + + N = 0; + +} + +FFT::FFT(int32 _N) +{ + + int32 lcv; + + for(lcv = 0; lcv < MAX_RANKS; lcv++) + R[lcv] = 1; + + N = _N; + M = 0; + + /* Get the number of ranks */ + while(_N > 1) + { + M++; + _N >>= 1; + } + + W = (MIX *)malloc(N/2*sizeof(MIX)); // Forward twiddle lookup + iW = (MIX *)malloc(N/2*sizeof(MIX)); // Inverse twiddle lookup + BR = (int32 *)malloc(N*sizeof(int32)); // Bit reverse lookup + BRX = (int32 *)malloc(N*sizeof(CPX)); // Shuffle temp array + + initW(); + initBR(); + +} + + +FFT::FFT(int32 _N, int32 _R[MAX_RANKS]) +{ + + int32 lcv; + + for(lcv = 0; lcv < MAX_RANKS; lcv++) + R[lcv] = _R[lcv]; + + N = _N; + M = 0; + + /* Get the number of ranks */ + while(_N > 1) + { + M++; + _N >>= 1; + } + + W = (MIX *)malloc(N/2*sizeof(MIX)); // Forward twiddle lookup + iW = (MIX *)malloc(N/2*sizeof(MIX)); // Inverse twiddle lookup + BR = (int32 *)malloc(N*sizeof(int32)); // Bit reverse lookup + BRX = (int32 *)malloc(N*sizeof(CPX)); // Shuffle temp array + + initW(); + initBR(); + +} + + +FFT::~FFT() +{ + free(BRX); + free(BR); + free(W); + free(iW); +} + +void FFT::initW() +{ + + int32 lcv; + double s, c, phase; + const double pi = 3.14159265358979323846264338327; + + for(lcv = 0; lcv < N/2; lcv++) + { + //Forward twiddles + phase = (-2*pi*lcv)/N; + c = floor(16384*cos(phase)); + s = floor(16384*sin(phase)); + W[lcv].i = (short)(c); + W[lcv].q = (short)(s); + W[lcv].nq = (short)(-s); + W[lcv].ni = (short)(c); + +// fprintf(stdout,"W:%d,%d\n",W[lcv].i,W[lcv].q); + + //Inverse twiddles + iW[lcv].i = (short)(c); + iW[lcv].q = (short)(-s); + iW[lcv].nq = (short)(s); + iW[lcv].ni = (short)(c); + } + +} + + + +void FFT::initBR() +{ + int lcv, lcv2, index; + + for(lcv = 0; lcv < N; lcv++) + { + index = 0; + for(lcv2 = 0; lcv2 < M; lcv2++) + { + index += ((lcv >> lcv2) & 0x1); + index <<= 1; + } + index >>= 1; + + BR[lcv] = index; + +// fprintf(stdout,"BR:%d\n",BR[lcv]); + } + +} + +void FFT::doFFT(CPX *_x, bool _shuf) +{ + int32 lcv, nblocks, bsize; + CPX *a, *b; + MIX *w; + + if(_shuf) { + doShuffle(_x); //bit reverse the array + } + + bsize = 1; + nblocks = N >> 1; + + for(lcv = 0; lcv < M; lcv++) //Loop over M ranks + { + a = _x; + b = _x + bsize; + w = W; + + if(R[lcv]) + rank(a, b, w, nblocks, bsize); + else + rank_noscale(a, b, w, nblocks, bsize); + + bsize <<= 1; + nblocks >>= 1; + } +} + + +void FFT::doiFFT(CPX *_x, bool _shuf) +{ + + int32 lcv, nblocks, bsize; + CPX *a, *b; + MIX *w; + + if(_shuf) + doShuffle(_x); //bit reverse the array + + bsize = 1; + nblocks = N >> 1; + + for(lcv = 0; lcv < M; lcv++) //Loop over M ranks + { + a = _x; + b = _x + bsize; + w = iW; + + if(R[lcv]) + rank(a, b, w, nblocks, bsize); + else + rank_noscale(a, b, w, nblocks, bsize); + + + bsize <<= 1; + nblocks >>= 1; + } + +} + + +void FFT::doFFTdf(CPX *_x, bool _shuf) +{ + + int32 lcv; + int32 bsize; + int32 nblocks; + CPX *a, *b; + MIX *w; + + bsize = N >> 1; + nblocks = 1; + + for(lcv = 0; lcv < M; lcv++) //Loop over M ranks + { + a = _x; + b = _x + bsize; + w = W; + + if(R[lcv]) + rankdf(a, b, w, nblocks, bsize); + else + rankdf_noscale(a, b, w, nblocks, bsize); + + bsize >>= 1; + nblocks <<= 1; + } + + if(_shuf) + doShuffle(_x); //bit reverse the array + +} + + +void FFT::doiFFTdf(CPX *_x, bool _shuf) +{ + + int32 lcv; + int32 bsize, nblocks; + CPX *a, *b; + MIX *w; + + bsize = N >> 1; + nblocks = 1; + + for(lcv = 0; lcv < M; lcv++) //Loop over M ranks + { + a = _x; + b = _x + bsize; + w = iW; + + if(R[lcv]) + rankdf(a, b, w, nblocks, bsize); + else + rankdf_noscale(a, b, w, nblocks, bsize); + + bsize >>= 1; + nblocks <<= 1; + } + + if(_shuf) + doShuffle(_x); //bit reverse the array + +} + +void FFT::doShuffle(CPX *_x) +{ + + int32 lcv; + int32 *p = (int32 *)_x; + + memcpy(BRX, p, N*sizeof(CPX)); + + for(lcv = 0; lcv < N; lcv++) + p[lcv] = BRX[BR[lcv]]; + +} + + +#ifdef NO_SIMD /* Include the cPP FFT Functions */ + +void rank(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) +{ + + int32 lcv, lcv2; + + MIX *wbase = _W; + + for(lcv = 0; lcv < _nblocks; lcv++) + { + for(lcv2 = 0; lcv2 < _bsize; lcv2++) + { + bfly(_A, _B, _W); + _A++; _B++; _W+=_nblocks; + } + + _A += _bsize; + _B += _bsize; + _W = wbase; + } + +} + +void rank_noscale(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) +{ + + int32 lcv, lcv2; + + MIX *wbase = _W; + + for(lcv = 0; lcv < _nblocks; lcv++) + { + for(lcv2 = 0; lcv2 < _bsize; lcv2++) + { + bfly_noscale(_A, _B, _W); + _A++; _B++; _W+=_nblocks; + } + + _A += _bsize; + _B += _bsize; + _W = wbase; + } + +} + +void rankdf(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) +{ + + int32 lcv, lcv2; + + MIX *wbase = _W; + + for(lcv = 0; lcv < _nblocks; lcv++) + { + for(lcv2 = 0; lcv2 < _bsize; lcv2++) + { + bflydf(_A, _B, _W); + _A++; _B++; _W+=_nblocks; + } + + _A += _bsize; + _B += _bsize; + _W = wbase; + } + +} + + +void rankdf_noscale(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) +{ + + int32 lcv, lcv2; + + MIX *wbase = _W; + + for(lcv = 0; lcv < _nblocks; lcv++) + { + for(lcv2 = 0; lcv2 < _bsize; lcv2++) + { + bflydf_noscale(_A, _B, _W); + _A++; _B++; _W+=_nblocks; + } + + _A += _bsize; + _B += _bsize; + _W = wbase; + } + +} + +void bfly(CPX *_A, CPX *_B, MIX *_W) +{ + int32 bi, bq; + + _A->i >>= 1; + _A->q >>= 1; + _B->i >>= 1; + _B->q >>= 1; + + bi = _B->i*_W->i - _B->q*_W->q; + bq = _B->i*_W->q + _B->q*_W->i; + + bi = (bi + 8192) >> 14; + bq = (bq + 8192) >> 14; + + _B->i = _A->i - (int16)bi; + _B->q = _A->q - (int16)bq; + + _A->i += (int16)bi; + _A->q += (int16)bq; +} + +void bfly_noscale(CPX *_A, CPX *_B, MIX *_W) +{ + int32 bi, bq; + + bi = _B->i*_W->i - _B->q*_W->q; + bq = _B->i*_W->q + _B->q*_W->i; + + bi = (bi + 8192) >> 14; + bq = (bq + 8192) >> 14; + + _B->i = _A->i - (int16)bi; + _B->q = _A->q - (int16)bq; + + _A->i += (int16)bi; + _A->q += (int16)bq; +} + +void bflydf(CPX *_A, CPX *_B, MIX *_W) +{ + int32 bi, bq; + + _A->i >>= 1; + _A->q >>= 1; + _B->i >>= 1; + _B->q >>= 1; + + bi = _B->i; + bq = _B->q; + + _B->i = _A->i - bi; + _B->q = _A->q - bq; + _A->i = _A->i + bi; + _A->q = _A->q + bq; + + bi = _A->i*_W->i - _A->q*_W->q; + bq = _A->i*_W->q + _A->q*_W->i; + + bi = (bi + 8192) >> 14; + bq = (bq + 8192) >> 14; + + _A->i += (int16)bi; + _A->q += (int16)bq; +} + +void bflydf_noscale(CPX *_A, CPX *_B, MIX *_W) +{ + int32 bi, bq; + + bi = _B->i; + bq = _B->q; + + _B->i = _A->i - bi; + _B->q = _A->q - bq; + _A->i = _A->i + bi; + _A->q = _A->q + bq; + + bi = _A->i*_W->i - _A->q*_W->q; + bq = _A->i*_W->q + _A->q*_W->i; + + bi = (bi + 8192) >> 14; + bq = (bq + 8192) >> 14; + + _A->i += (int16)bi; + _A->q += (int16)bq; +} + +#else /* Include the SIMD FFT Functions */ + +void rank(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) +{ + + __asm + ( + ".intel_syntax noprefix \n" //Use intel syntax + "push ebx\n\t" + "mov ebx, [ebp+8] \n" //A + "mov edi, [ebp+12] \n" //B + "mov edx, [ebp+20] \n" //nblocks + "mov eax, 0x00002000 \n" + "movd mm4, eax \n" + "punpckldq mm4, mm4 \n" //Low 32 bits to high 32 bits + "B%=: \n" + "mov esi, [ebp+16] \n" //W + "mov ecx, 0x0 \n" + "mov eax, [ebp+20] \n" //nblocks + "sal eax, 3 \n" //make into bytes + "S%=: \n" + "movd mm0, [ebx+ecx*4]\n" //Copy A to mm0 + "movd mm1, [edi+ecx*4]\n" //Copy B to mm1 + "movq mm2, [esi] \n" //Copy W to mm2 + "psraw mm0, 1 \n" //Divide A by 2 + "psraw mm1, 1 \n" //Divide B by 2 + "movq mm3, mm0 \n" //Copy A to mm3 + "punpckldq mm1, mm1 \n" //Low 32 bits to high 32 bits + "pmaddwd mm1, mm2 \n" //Multiply and add + "padddw mm1, mm4 \n" + "psrad mm1, 0xe \n" //Right shift by 14 bits + "packssdw mm1, mm1 \n" //Pack back into 16 bit interleaved + "paddw mm0, mm1 \n" //A+Bw + "psubw mm3, mm1 \n" //A-Bw + "movd [ebx+ecx*4], mm0\n" //Copy back to A + "movd [edi+ecx*4], mm3\n" //Copy back to B + "add esi, eax \n" + "add ecx, 0x1 \n" + "cmp ecx, [ebp+24] \n" + "jne S%= \n" + "sal ecx, 3 \n" + "add ebx, ecx \n" + "add edi, ecx \n" + "sub edx, 0x1 \n" + "jnz B%= \n" + "pop ebx\n\t" + "EMMS \n" //Done with MMX + ".att_syntax \n" //Back to ATT syntax + : + : "m" (_A), "m" (_B), "m" (_W), "m" (_nblocks), "m" (_bsize) + : "%eax", "%ecx", "%edx", "%edi", "%esi" + ); + +} + + +void rank_noscale(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) +{ + + __asm + ( + ".intel_syntax noprefix \n" //Use intel syntax + "push ebx\n\t" + "mov ebx, [ebp+8] \n" //A + "mov edi, [ebp+12] \n" //B + "mov edx, [ebp+20] \n" //nblocks + "mov eax, 0x00002000 \n" + "movd mm4, eax \n" + "punpckldq mm4, mm4 \n" //Low 32 bits to high 32 bits + "B%=: \n" + "mov esi, [ebp+16] \n" //W + "mov ecx, 0x0 \n" + "mov eax, [ebp+20] \n" //nblocks + "sal eax, 3 \n" //make into bytes + "S%=: \n" + "movd mm0, [ebx+ecx*4]\n" //Copy A to mm0 + "movd mm1, [edi+ecx*4]\n" //Copy B to mm1 + "movq mm2, [esi] \n" //Copy W to mm2 + "movq mm3, mm0 \n" //Copy A to mm3 + "punpckldq mm1, mm1 \n" //Low 32 bits to high 32 bits + "pmaddwd mm1, mm2 \n" //Multiply and add + "padddw mm1, mm4 \n" + "psrad mm1, 0xe \n" //Right shift by 14 bits + "packssdw mm1, mm1 \n" //Pack back into 16 bit interleaved + "paddw mm0, mm1 \n" //A+Bw + "psubw mm3, mm1 \n" //A-Bw + "movd [ebx+ecx*4], mm0\n" //Copy back to A + "movd [edi+ecx*4], mm3\n" //Copy back to B + "add esi, eax \n" + "add ecx, 0x1 \n" + "cmp ecx, [ebp+24] \n" + "jne S%= \n" + "sal ecx, 3 \n" + "add ebx, ecx \n" + "add edi, ecx \n" + "sub edx, 0x1 \n" + "jnz B%= \n" + "pop ebx\n\t" + "EMMS \n" //Done with MMX + ".att_syntax \n" //Back to ATT syntax + : + : "m" (_A), "m" (_B), "m" (_W), "m" (_nblocks), "m" (_bsize) + : "%eax", "%ecx", "%edx", "%edi", "%esi" + ); + +} + +//static void bflydf(void *_A, void *_B, void *_W) +//{ +// +// __asm +// { +// mov ebx, _A; +// mov edi, _B; +// mov esi, _W; +// +// movd mm0, [ebx]; /*move 32 bits from A to bottom 32 bits of mm0*/ +// movd mm1, [edi]; /*move 32 bits from B to bottom 32 bits of mm1*/ +// movq mm2, [esi]; /*move 64 bits from W to mm2*/ +// psraw mm0, 0x1; +// psraw mm1, 0x1; +// movq mm3, mm0; /*copy A to mm3*/ +// paddw mm0, mm1; /*A+B*/ +// psubw mm3, mm1; /*A-B*/ +// punpckldq mm3, mm3; /*copy bottom 32 bits of B data into high 32 bits*/ +// pmaddwd mm3, mm2; /*complex multiply, real now 0..31 of mm1, imag 32..63 of mm1*/ +// psrad mm3, 0xf; /*right shift 0..31 by 16, 32..63 by 16*/ +// packssdw mm3, mm3; /*pack bits 0..31 to 0..16, bits 32..63 to 16..31*/ +// movd [ebx], mm0; +// movd [edi], mm3; +// +// EMMS; +// } +//} + + +void rankdf(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) +{ + + __asm + ( + ".intel_syntax noprefix \n" //Use intel syntax + "push ebx\n\t" + "mov ebx, [ebp+8] \n" //A + "mov edi, [ebp+12] \n" //B + "mov edx, [ebp+20] \n" //nblocks + "mov eax, 0x00002000 \n" + "movd mm4, eax \n" + "punpckldq mm4, mm4 \n" //Low 32 bits to high 32 bits + "B%=: \n" + "mov esi, [ebp+16] \n" //W + "mov ecx, [ebp+24] \n" //bsize + "mov eax, [ebp+20] \n" //nblocks + "sal eax, 3 \n" //make into bytes + "L%=: \n" + "movd mm0, [ebx] \n" //Copy A to mm0 + "movd mm1, [edi] \n" //Copy B to mm1 + "movq mm2, [esi] \n" //Copy W to mm2 + "psraw mm0, 1 \n" //Divide A by 2 + "psraw mm1, 1 \n" //Divide B by 2 + "movq mm3, mm0 \n" //Copy A to mm3 + "paddw mm0, mm1 \n" //A+B + "psubw mm3, mm1 \n" //A-B + "punpckldq mm3, mm3 \n" //Copy bottom 32 bits of B data into high 32 bits*/ + "pmaddwd mm3, mm2 \n" //Complex multiply, real now 0..31 of mm1, imag 32..63 of mm1*/ + "padddw mm3, mm4 \n" + "psrad mm3, 0xe \n" //Right shift 0..31 by 14, 32..63 by 14*/ + "packssdw mm3, mm3 \n" //Pack bits 0..31 to 0..16, bits 32..63 to 16..31*/ + "movd [ebx], mm0 \n" //Copy back to A + "movd [edi], mm3 \n" //Copy back to B + "add ebx, 0x4 \n" + "add edi, 0x4 \n" + "add esi, eax \n" + "loop L%= \n" + "mov ecx, [ebp+24] \n" //bsize + "sal ecx, 2 \n" + "add ebx, ecx \n" + "add edi, ecx \n" + "sub edx, 0x1 \n" + "jnz B%= \n" + "pop ebx\n\t" + "EMMS \n" //Done with MMX + ".att_syntax \n" //Back to ATT syntax + : + : "m" (_A), "m" (_B), "m" (_W), "m" (_nblocks), "m" (_bsize) + : "%eax", "%ecx", "%edx", "%edi", "%esi" + ); + + +} + + +void rankdf_noscale(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) +{ + + __asm + ( + ".intel_syntax noprefix \n" //Use intel syntax + "push ebx\n\t" + "mov ebx, [ebp+8] \n" //A + "mov edi, [ebp+12] \n" //B + "mov edx, [ebp+20] \n" //nblocks + "mov eax, 0x00002000 \n" + "movd mm4, eax \n" + "punpckldq mm4, mm4 \n" //Low 32 bits to high 32 bits + "B%=: \n" + "mov esi, [ebp+16] \n" //W + "mov ecx, [ebp+24] \n" //bsize + "mov eax, [ebp+20] \n" //nblocks + "sal eax, 3 \n" //make into bytes + "L%=: \n" + "movd mm0, [ebx] \n" //Copy A to mm0 + "movd mm1, [edi] \n" //Copy B to mm1 + "movq mm2, [esi] \n" //Copy W to mm2 + "movq mm3, mm0 \n" //Copy A to mm3 + "paddw mm0, mm1 \n" //A+B + "psubw mm3, mm1 \n" //A-B + "punpckldq mm3, mm3 \n" //Copy bottom 32 bits of B data into high 32 bits*/ + "pmaddwd mm3, mm2 \n" //Complex multiply, real now 0..31 of mm1, imag 32..63 of mm1*/ + "padddw mm3, mm4 \n" + "psrad mm3, 0xe \n" //Right shift 0..31 by 14, 32..63 by 14*/ + "packssdw mm3, mm3 \n" //Pack bits 0..31 to 0..16, bits 32..63 to 16..31*/ + "movd [ebx], mm0 \n" //Copy back to A + "movd [edi], mm3 \n" //Copy back to B + "add ebx, 0x4 \n" + "add edi, 0x4 \n" + "add esi, eax \n" + "loop L%= \n" + "mov ecx, [ebp+24] \n" //bsize + "sal ecx, 2 \n" + "add ebx, ecx \n" + "add edi, ecx \n" + "sub edx, 0x1 \n" + "jnz B%= \n" + "pop ebx\n\t" + "EMMS \n" //Done with MMX + ".att_syntax \n" //Back to ATT syntax + : + : "m" (_A), "m" (_B), "m" (_W), "m" (_nblocks), "m" (_bsize) + : "%eax", "%ecx", "%edx", "%edi", "%esi" + ); + + +} + +//void bfly(CPX *_A, CPX *_B, MIX *_W) +//{ +// __asm +// ( +// ".intel_syntax noprefix \n" //Use intel syntax +// "mov ebx, [ebp+8] \n" //A +// "mov edi, [ebp+12] \n" //B +// "mov esi, [ebp+16] \n" //W +// "movd mm0, [ebx] \n" //Copy A to mm0 +// "movd mm1, [edi] \n" //Copy B to mm1 +// "movq mm2, [esi] \n" //Copy W to mm2 +// "psraw mm0, 1 \n" //Divide A by 2 +// "psraw mm1, 1 \n" //Divide B by 2 +// "movq mm3, mm0 \n" //Copy A to mm3 +// "punpckldq mm1, mm1 \n" //Low 32 bits to high 32 bits +// "pmaddwd mm1, mm2 \n" //Multiply and add +// "psrad mm1, 0xe \n" //Right shift by 14 bits +// "packssdw mm1, mm1 \n" //Pack back into 16 bit interleaved +// "paddw mm0, mm1 \n" //A+Bw +// "psubw mm3, mm1 \n" //A-Bw +// "movd [ebx], mm0 \n" //Copy back to A +// "movd [edi], mm3 \n" //Copy back to B +// "EMMS \n" //Done with MMX +// ".att_syntax \n" //Back to ATT syntax +// : +// : +// : "%eax", "%ebx", "%ecx", "%edx", "%edi", "%esi" +// ); +//} +// +// +//void block(CPX *_A, CPX *_B, MIX *_W, int32 _nblocks, int32 _bsize) +//{ +// +// __asm +// ( +// ".intel_syntax noprefix \n" //Use intel syntax +// "mov ebx, [ebp+8] \n" //A +// "mov edi, [ebp+12] \n" //B +// "mov esi, [ebp+16] \n" //W +// "mov eax, [ebp+20] \n" //nblocks +// "sal eax, 3 \n" //make into bytes +// "mov ecx, [ebp+24] \n" //bsize +// "Lbsize: \n" +// "movd mm0, [ebx] \n" //Copy A to mm0 +// "movd mm1, [edi] \n" //Copy B to mm1 +// "movq mm2, [esi] \n" //Copy W to mm2 +// "psraw mm0, 1 \n" //Divide A by 2 +// "psraw mm1, 1 \n" //Divide B by 2 +// "movq mm3, mm0 \n" //Copy A to mm3 +// "punpckldq mm1, mm1 \n" //Low 32 bits to high 32 bits +// "pmaddwd mm1, mm2 \n" //Multiply and addint64 +// "psrad mm1, 0xe \n" //Right shift by 14 bits +// "packssdw mm1, mm1 \n" //Pack back into 16 bit interleaved +// "paddw mm0, mm1 \n" //A+Bw +// "psubw mm3, mm1 \n" //A-Bw +// "movd [ebx], mm0 \n" //Copy back to A +// "movd [edi], mm3 \n" //Copy back to B +// "add ebx, 0x4 \n" +// "add edi, 0x4 \n" +// "add esi, eax \n" +// "loop Lbsize \n" +// "EMMS \n" //Done with MMX +// ".att_syntax \n" //Back to ATT syntax +// : +// : +// : "%eax", "%ebx", "%ecx", "%edx", "%edi", "%esi" +// ); +// +//} + + +#endif + + diff --git a/src/algorithms/libs/gps_sdr_fft.h b/src/algorithms/libs/gps_sdr_fft.h new file mode 100644 index 000000000..3c51c8341 --- /dev/null +++ b/src/algorithms/libs/gps_sdr_fft.h @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------------------------------------*/ +/*! \file fft.h +// +// FILENAME: fft.h +// +// DESCRIPTION: Defines the FFT class. +// +// DEVELOPERS: Gregory W. Heckler (2003-2009) +// +// LICENSE TERMS: Copyright (c) Gregory W. Heckler 2009 +// +// This file is part of the GPS Software Defined Radio (GPS-SDR) +// +// The GPS-SDR is free software; you can redistribute it and/or modify it under the terms of the +// GNU General Public License as published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. The GPS-SDR is distributed in the hope that +// it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// Note: Comments within this file follow a syntax that is compatible with +// DOXYGEN and are utilized for automated document extraction +// +// Reference: +*/ +/*----------------------------------------------------------------------------------------------*/ + +#ifndef FFT_H_ +#define FFT_H_ + +#include "gps_sdr_defines.h" +#include "gps_sdr_signal_processing.h" + +#define MAX_RANKS (16) + +/*! @ingroup CLASSES + @brief /xyzzy */ +class FFT +{ + + private: + + MIX *W; //!< Twiddle lookup array for FFT + MIX *iW; //!< Twiddle lookup array for iFFT + int32 *BRX; //!< Re-order temp array + int32 *BR; //!< Re-order index array + + int32 N; //!< Length (should be 2^N!!!) + int32 M; //!< Log2(N) (number of ranks) + int32 R[16]; //!< Programmable rank scaling + + void initW(); //!< Initialize twiddles + void initBR(); //!< Initialize re-order array + void doShuffle(CPX *_x); //!< Do bit-reverse shuffling + + public: + + FFT(); //!< Initialize FFT + FFT(int32 _N); //!< Initialize FFT for 2^N + FFT(int32 _N, int32 _R[MAX_RANKS]); //!< Initialize FFT for 2^N, with ranks + ~FFT(); //!< Destructor + void doFFT(CPX *_x, bool _shuf); //!< Forward FFT, decimate in time + void doiFFT(CPX *_x, bool _shuf); //!< Inverse FFT, decimate in time + void doFFTdf(CPX *_x, bool _shuf); //!< Forward FFT, decimate in frequency + void doiFFTdf(CPX *_x, bool _shuf); //!< Inverse FFT, decimate in frequency + +}; + +#endif /*FFT_H_*/ diff --git a/src/algorithms/libs/gps_sdr_prn_codes_short.h b/src/algorithms/libs/gps_sdr_prn_codes_short.h new file mode 100644 index 000000000..31527cf49 --- /dev/null +++ b/src/algorithms/libs/gps_sdr_prn_codes_short.h @@ -0,0 +1,104452 @@ +#ifndef PRN_CODES +#define PRN_CODES +int16 PRN_Codes_Short[208896] = {11,0, +-90,-89, +-85,45, +49,130, +-56,-106, +-199,-69, +-85,-66, +-192,292, +-279,100, +73,-54, +90,-125, +98,-13, +-157,211, +198,91, +152,-102, +-86,258, +-325,114, +-82,-128, +158,-55, +-104,-70, +160,-215, +52,-78, +-66,-170, +54,88, +-83,-84, +-61,24, +-117,-28, +15,95, +-18,13, +-67,93, +-35,-264, +28,93, +-62,162, +-8,129, +-233,-157, +-125,44, +54,33, +-153,-35, +127,88, +-62,150, +82,-28, +-82,26, +356,-242, +-165,26, +-126,52, +19,-154, +116,-166, +8,11, +162,108, +52,-4, +16,243, +14,-25, +-50,-24, +-43,39, +10,18, +-87,304, +127,-213, +-67,8, +-72,30, +-119,-33, +-23,166, +40,-13, +34,-301, +-118,-92, +145,169, +-108,-16, +-43,78, +-221,10, +123,-164, +1,-114, +103,71, +96,112, +137,-15, +-82,107, +-40,93, +52,-263, +69,-194, +155,-85, +104,201, +-126,-33, +225,75, +223,-30, +113,-92, +45,58, +-197,178, +149,151, +129,-81, +-131,59, +129,-26, +-165,40, +-143,69, +195,91, +152,152, +11,56, +192,-130, +33,-132, +35,130, +-113,-1, +162,-275, +-36,218, +-73,-2, +52,19, +20,-106, +65,-255, +-211,28, +157,127, +-60,177, +-184,-61, +95,4, +-29,69, +155,81, +96,273, +-178,59, +51,115, +-145,-52, +-149,-167, +-230,-132, +-79,30, +110,25, +171,-50, +17,18, +64,64, +-29,179, +-94,25, +61,-157, +78,170, +-211,249, +-3,-77, +44,-60, +-3,-55, +190,273, +-121,7, +209,114, +0,199, +-53,15, +36,-63, +43,187, +10,214, +158,4, +-170,-6, +-272,42, +219,150, +109,-172, +-54,-136, +29,-59, +80,-235, +-318,142, +134,17, +-102,-4, +-34,-202, +46,42, +-62,71, +165,-19, +-194,-191, +-136,135, +-46,-72, +89,-18, +209,-88, +-42,57, +80,-235, +-120,-126, +-81,-165, +-213,2, +61,52, +5,-19, +81,-62, +-48,-75, +-20,26, +136,-212, +-188,-27, +-12,88, +-67,38, +119,8, +-94,114, +-86,23, +44,96, +54,54, +-24,143, +-80,75, +117,-52, +-67,217, +49,189, +51,-156, +169,28, +148,134, +-26,-31, +-1,-73, +-33,-87, +27,139, +58,-60, +-23,281, +-114,153, +23,149, +118,-16, +28,-106, +144,76, +118,170, +132,-188, +178,-173, +124,-84, +221,-108, +-210,180, +49,-38, +6,-104, +-6,21, +206,58, +127,97, +206,2, +43,-179, +20,417, +-273,22, +17,109, +-3,26, +29,70, +161,132, +102,121, +-146,63, +176,-83, +151,195, +13,-54, +-12,142, +-63,-133, +-130,-42, +167,-11, +-82,-167, +-77,-103, +192,-42, +-85,116, +-105,-126, +-90,-73, +88,61, +122,61, +-182,-77, +-30,190, +-95,-33, +-34,21, +-13,-27, +173,-111, +-41,36, +38,74, +11,-158, +311,161, +132,-86, +-100,-47, +-40,-10, +191,69, +-145,-73, +42,-148, +3,61, +40,98, +-37,306, +30,-53, +125,-280, +-37,-161, +79,-206, +78,-51, +-164,43, +-33,-181, +-34,133, +122,26, +133,-49, +196,38, +-217,190, +27,6, +-65,101, +-92,92, +-225,93, +153,-108, +-87,124, +330,6, +83,146, +64,67, +44,-45, +63,-171, +-28,113, +-57,139, +51,87, +15,46, +-23,-181, +-57,68, +-97,18, +-47,185, +191,-15, +203,108, +139,-41, +71,-45, +-57,11, +-72,-62, +-31,-131, +-101,-32, +103,-18, +146,-249, +-2,-74, +-111,64, +132,137, +44,42, +-69,1, +-15,-153, +-42,87, +-80,10, +-8,160, +-22,-24, +-20,138, +64,-122, +114,88, +-79,-10, +-52,84, +-384,81, +-158,45, +81,54, +-240,24, +35,0, +238,56, +179,-145, +-110,-85, +18,-60, +-93,-76, +-22,255, +-8,96, +173,116, +76,52, +-61,82, +-5,22, +-78,109, +-96,100, +-19,90, +2,-138, +-35,-66, +50,66, +-88,-62, +-84,47, +-70,41, +-97,-343, +145,236, +-156,95, +-64,-136, +-142,179, +-58,81, +-137,-130, +-93,16, +-87,-177, +22,28, +21,86, +-2,-25, +-79,220, +-76,-4, +227,90, +58,73, +97,-110, +35,-34, +80,58, +-21,-132, +113,163, +26,-146, +-93,124, +-76,151, +1,143, +143,143, +141,-21, +125,118, +80,-71, +-165,-118, +173,242, +36,-139, +-152,161, +-182,-52, +-51,11, +-265,156, +-96,18, +218,74, +-104,21, +-10,160, +-27,-78, +-25,-26, +99,-29, +79,19, +-5,63, +-156,23, +-99,-169, +-37,-26, +75,23, +-12,-23, +-45,-22, +-192,9, +22,105, +135,19, +-20,-50, +-173,-101, +54,30, +18,-82, +-66,38, +-40,-165, +-44,14, +109,16, +124,-216, +67,150, +67,-161, +26,102, +4,113, +90,-86, +-93,95, +21,-126, +110,-65, +54,106, +13,-255, +61,108, +100,-10, +-62,48, +24,-172, +-48,71, +38,48, +-57,-129, +-99,13, +-48,92, +-118,-301, +-90,69, +-76,77, +-68,-160, +121,-4, +190,25, +26,180, +151,32, +-155,10, +-64,108, +-21,65, +116,54, +-78,62, +-54,58, +95,-19, +-14,-156, +-177,88, +-175,109, +-49,51, +158,-98, +-108,122, +-98,62, +-35,117, +81,37, +92,116, +71,-9, +211,190, +30,-48, +-48,-66, +-16,-68, +0,-48, +59,-76, +-104,-38, +-66,58, +53,1, +-6,-120, +-54,0, +-271,26, +102,50, +-33,-24, +-127,-2, +109,-115, +132,-216, +76,89, +-105,104, +154,99, +-85,-12, +127,-85, +120,-184, +28,52, +110,-79, +147,-47, +66,227, +85,137, +-12,-24, +-43,-82, +60,33, +144,-53, +12,-45, +72,-32, +-87,-115, +-72,219, +-18,-100, +-15,36, +-59,-185, +-63,-123, +-191,13, +-10,-109, +144,34, +72,-210, +85,85, +74,-88, +96,64, +65,-11, +104,141, +-70,49, +-29,-2, +169,34, +-108,180, +76,-62, +-20,-53, +100,-51, +-33,-65, +69,8, +-150,-51, +-111,-93, +163,-103, +13,-122, +110,84, +-130,-32, +-19,129, +-48,57, +92,91, +-83,54, +-18,28, +6,-104, +-9,-33, +-68,-68, +-95,-28, +13,-114, +-116,3, +-34,39, +-13,-96, +68,20, +72,-8, +112,39, +12,-114, +124,11, +-70,-83, +-12,217, +-142,8, +-101,-66, +-7,-76, +-43,-62, +-21,98, +-58,-19, +-89,107, +33,-98, +51,101, +133,-16, +-51,50, +48,-29, +124,-6, +59,150, +-99,55, +138,63, +-148,70, +1,113, +-126,73, +42,2, +-109,-107, +-53,-165, +-101,23, +-176,-12, +209,-70, +-86,-35, +67,-20, +-62,-71, +-88,145, +7,68, +9,26, +-64,13, +-60,-10, +202,3, +109,145, +-10,97, +-10,41, +-75,107, +-42,83, +-134,10, +2,123, +73,-81, +143,67, +-25,-21, +-80,161, +-149,45, +-16,-69, +39,-10, +-23,-22, +66,-46, +-28,-229, +-72,110, +-26,29, +63,-113, +-21,-6, +-93,-9, +-14,27, +-41,-20, +-119,-43, +67,48, +32,114, +104,133, +-3,6, +111,86, +20,15, +115,-169, +32,22, +-9,35, +-36,17, +165,-158, +-3,-139, +-71,7, +-41,50, +58,-28, +37,-47, +46,39, +66,71, +38,-163, +57,9, +15,-10, +64,122, +164,79, +-162,101, +-31,-15, +95,-108, +-95,-42, +-44,-59, +-57,-104, +41,-11, +-58,-47, +-7,-40, +43,77, +-47,-84, +-100,9, +166,62, +-119,43, +17,-10, +-84,73, +20,62, +-28,-20, +-97,18, +119,-32, +-6,61, +-7,19, +113,5, +-173,86, +65,85, +-66,32, +-50,31, +25,-71, +-118,-40, +48,45, +-35,-18, +-43,-65, +-50,-48, +34,105, +40,8, +41,-108, +-42,-77, +-7,62, +35,-20, +-61,17, +-59,-68, +-23,-117, +55,-7, +12,99, +-10,-11, +-54,35, +18,8, +17,-116, +100,81, +-33,27, +84,-34, +42,-115, +19,-111, +35,-58, +-61,-119, +140,48, +-70,40, +61,11, +-50,-69, +-29,144, +128,97, +-18,21, +111,68, +150,-71, +-43,-81, +60,63, +-59,28, +62,12, +-61,23, +2,68, +-16,-18, +-31,123, +79,53, +73,12, +-38,-75, +161,2, +-32,30, +-51,-21, +76,-12, +-169,-83, +-5,-61, +119,-50, +-44,-40, +21,-119, +91,33, +-36,-46, +18,38, +-120,-71, +45,-72, +43,6, +-58,-24, +1,10, +-35,-5, +-35,-16, +126,-47, +30,-37, +5,-21, +53,-5, +48,18, +1,89, +140,40, +43,-91, +31,38, +-63,-52, +-57,-34, +-24,86, +-39,154, +53,-59, +-2,-15, +2,-45, +64,-68, +21,-124, +16,-143, +69,61, +-55,14, +38,24, +-19,13, +70,-14, +-8,-25, +97,-16, +-41,-22, +-16,-28, +-30,-15, +34,29, +50,26, +61,-6, +-76,-36, +-81,85, +-33,41, +-5,-30, +-66,-44, +-26,-9, +5,-30, +-31,15, +7,86, +7,92, +52,65, +11,13, +95,-69, +-61,-23, +-1,0, +-28,-1, +46,16, +91,-6, +8,-35, +-40,39, +-45,30, +55,-13, +23,114, +64,31, +-15,97, +15,-63, +-9,2, +81,-102, +2,14, +42,-40, +53,-16, +26,-8, +-25,136, +36,4, +-9,6, +17,-30, +-61,-35, +0,-11, +-38,57, +-144,3, +-65,-7, +-1,75, +42,-38, +133,-22, +-32,86, +-54,-76, +-7,11, +12,39, +-2,3, +-34,-58, +26,78, +-42,86, +49,43, +-33,-33, +4,42, +13,4, +-51,45, +-12,-40, +69,-23, +-28,-33, +39,-18, +6,-25, +9,87, +-21,-30, +-20,-108, +-8,73, +37,-7, +-73,-22, +-42,33, +-9,-26, +-24,8, +-10,-24, +-25,-32, +85,19, +-33,78, +37,3, +2,5, +33,10, +52,49, +31,21, +6,11, +-1,-40, +106,-27, +-2,-54, +71,60, +-68,33, +21,76, +79,29, +-46,25, +-31,7, +43,-32, +-22,15, +25,-19, +-38,105, +-85,31, +-13,28, +22,70, +26,12, +-18,27, +-16,34, +33,1, +88,-29, +21,-8, +52,16, +-22,6, +22,0, +-50,-18, +0,14, +49,28, +-17,49, +-16,32, +36,-20, +58,24, +9,-9, +-7,8, +52,-22, +31,17, +-12,17, +48,-31, +7,-13, +1,9, +24,24, +18,-63, +-25,15, +-18,-15, +-35,15, +9,-1, +-26,-11, +-8,39, +19,-18, +-7,-24, +-27,-54, +-60,11, +-16,-25, +-32,30, +18,22, +-36,38, +12,-14, +-4,-47, +-2,-8, +-43,-21, +39,52, +4,-31, +-43,-17, +-23,40, +52,-61, +-32,6, +3,-19, +-39,5, +-39,-2, +-7,35, +-2,12, +33,-21, +-12,-47, +3,9, +47,43, +37,-16, +-9,0, +0,11, +43,-2, +20,0, +16,55, +23,-40, +37,39, +-61,22, +14,-46, +50,0, +8,2, +-3,-1, +-6,-1, +22,-7, +34,-5, +-12,26, +-10,18, +15,19, +-1,-6, +-27,-42, +-22,-43, +-7,7, +-1,-31, +44,3, +15,1, +30,17, +13,27, +-10,-24, +0,-3, +20,-7, +35,-10, +-19,20, +-15,-38, +-29,27, +-11,10, +40,-27, +-17,10, +-3,14, +-14,-4, +11,-20, +-4,40, +-29,-3, +9,12, +25,35, +12,5, +7,-10, +5,-5, +5,-21, +-10,20, +9,4, +6,2, +29,10, +8,-25, +-13,23, +-1,42, +2,1, +12,8, +1,2, +14,17, +-41,15, +-22,1, +9,-6, +11,-3, +-1,5, +11,21, +12,0, +-19,13, +-12,-2, +4,-4, +-4,-27, +13,13, +8,-7, +-10,3, +-22,-4, +-5,5, +10,-1, +9,-10, +-5,-13, +-7,5, +7,-3, +-9,6, +30,-8, +-7,-2, +-12,0, +18,-4, +1,2, +9,9, +7,3, +0,9, +-14,4, +-6,3, +2,-13, +-4,1, +-2,3, +-13,19, +8,-15, +7,9, +2,-1, +1,-1, +2,-5, +-3,0, +-1,-12, +0,-8, +14,9, +-2,-7, +-4,-2, +-6,3, +9,-6, +-1,0, +1,3, +0,-11, +1,2, +-4,2, +3,-4, +-10,3, +-4,5, +-1,-1, +-4,-1, +-2,4, +4,-11, +2,-5, +2,11, +0,-3, +3,-1, +1,4, +-3,0, +-1,-2, +3,2, +1,-7, +1,-2, +-2,4, +0,-5, +0,0, +0,5, +0,-5, +0,0, +0,5, +0,-5, +0,0, +0,5, +-2,-4, +1,2, +1,7, +3,-2, +-1,2, +-3,0, +1,-4, +3,1, +0,3, +2,-11, +2,5, +4,11, +-2,-4, +-4,1, +-1,1, +-4,-5, +-10,-3, +3,4, +-4,-2, +1,-2, +0,11, +1,-3, +-1,0, +9,6, +-6,-3, +-4,2, +-2,7, +14,-9, +0,8, +-1,12, +-3,0, +2,5, +1,1, +2,1, +7,-9, +8,15, +-13,-19, +-2,-3, +-4,-1, +2,13, +-6,-3, +-14,-4, +0,-9, +7,-3, +9,-9, +1,-2, +18,4, +-12,0, +-7,2, +30,8, +-9,-6, +7,3, +-7,-5, +-5,13, +9,10, +10,1, +-5,-5, +-22,4, +-10,-3, +8,7, +13,-13, +-4,27, +4,4, +-12,2, +-19,-13, +12,0, +11,-21, +-1,-5, +11,3, +9,6, +-22,-1, +-41,-15, +14,-17, +1,-2, +12,-8, +2,-1, +-1,-42, +-13,-23, +8,25, +29,-10, +6,-2, +9,-4, +-10,-20, +5,21, +5,5, +7,10, +12,-5, +25,-35, +9,-12, +-29,3, +-4,-40, +11,20, +-14,4, +-3,-14, +-17,-10, +40,27, +-11,-10, +-29,-27, +-15,38, +-19,-20, +35,10, +20,7, +0,3, +-10,24, +13,-27, +30,-17, +15,-1, +44,-3, +-1,31, +-7,-7, +-22,43, +-27,42, +-1,6, +15,-19, +-10,-18, +-12,-26, +34,5, +22,7, +-6,1, +-3,1, +8,-2, +50,0, +14,46, +-61,-22, +37,-39, +23,40, +16,-55, +20,0, +43,2, +0,-11, +-9,0, +37,16, +47,-43, +3,-9, +-12,47, +33,21, +-2,-12, +-7,-35, +-39,2, +-39,-5, +3,19, +-32,-6, +52,61, +-23,-40, +-43,17, +4,31, +39,-52, +-43,21, +-2,8, +-4,47, +12,14, +-36,-38, +18,-22, +-32,-30, +-16,25, +-60,-11, +-27,54, +-7,24, +19,18, +-8,-39, +-26,11, +9,1, +-35,-15, +-18,15, +-25,-15, +18,63, +24,-24, +1,-9, +7,13, +48,31, +-12,-17, +31,-17, +52,22, +-7,-8, +9,9, +58,-24, +36,20, +-16,-32, +-17,-49, +49,-28, +0,-14, +-50,18, +22,0, +-22,-6, +52,-16, +21,8, +88,29, +33,-1, +-16,-34, +-18,-27, +26,-12, +22,-70, +-13,-28, +-85,-31, +-38,-105, +25,19, +-22,-15, +43,32, +-31,-7, +-46,-25, +79,-29, +21,-76, +-68,-33, +71,-60, +-2,54, +106,27, +-1,40, +6,-11, +31,-21, +52,-49, +33,-10, +2,-5, +37,-3, +-33,-78, +85,-19, +-25,32, +-10,24, +-24,-8, +-9,26, +-42,-33, +-73,22, +37,7, +-8,-73, +-20,108, +-21,30, +9,-87, +6,25, +39,18, +-28,33, +69,23, +-12,40, +-51,-45, +13,-4, +4,-42, +-33,33, +49,-43, +-42,-86, +26,-78, +-34,58, +-2,-3, +12,-39, +-7,-11, +-54,76, +-32,-86, +133,22, +42,38, +-1,-75, +-65,7, +-144,-3, +-38,-57, +0,11, +-61,35, +17,30, +-9,-6, +36,-4, +-25,-136, +26,8, +53,16, +42,40, +2,-14, +81,102, +-9,-2, +15,63, +-15,-97, +64,-31, +23,-114, +55,13, +-45,-30, +-40,-39, +8,35, +91,6, +46,-16, +-28,1, +-1,0, +-61,23, +95,69, +11,-13, +52,-65, +7,-92, +7,-86, +-31,-15, +5,30, +-26,9, +-66,44, +-5,30, +-33,-41, +-81,-85, +-76,36, +61,6, +50,-26, +34,-29, +-30,15, +-16,28, +-41,22, +97,16, +-8,25, +70,14, +-19,-13, +38,-24, +-55,-14, +69,-61, +16,143, +21,124, +64,68, +2,45, +-2,15, +53,59, +-39,-154, +-24,-86, +-57,34, +-63,52, +31,-38, +43,91, +140,-40, +1,-89, +48,-18, +53,5, +5,21, +30,37, +126,47, +-35,16, +-35,5, +1,-10, +-58,24, +43,-6, +45,72, +-120,71, +18,-38, +-36,46, +91,-33, +21,119, +-44,40, +119,50, +-5,61, +-169,83, +76,12, +-51,21, +-32,-30, +161,-2, +-38,75, +73,-12, +79,-53, +-31,-123, +-16,18, +2,-68, +-61,-23, +62,-12, +-59,-28, +60,-63, +-43,81, +150,71, +111,-68, +-18,-21, +128,-97, +-29,-144, +-50,69, +61,-11, +-70,-40, +140,-48, +-61,119, +35,58, +19,111, +42,115, +84,34, +-33,-27, +100,-81, +17,116, +18,-8, +-54,-35, +-10,11, +12,-99, +55,7, +-23,117, +-59,68, +-61,-17, +35,20, +-7,-62, +-42,77, +41,108, +40,-8, +34,-105, +-50,48, +-43,65, +-35,18, +48,-45, +-118,40, +25,71, +-50,-31, +-66,-32, +65,-85, +-173,-86, +113,-5, +-7,-19, +-6,-61, +119,32, +-97,-18, +-28,20, +20,-62, +-84,-73, +17,10, +-119,-43, +166,-62, +-100,-9, +-47,84, +43,-77, +-7,40, +-58,47, +41,11, +-57,104, +-44,59, +-95,42, +95,108, +-31,15, +-162,-101, +164,-79, +64,-122, +15,10, +57,-9, +38,163, +66,-71, +46,-39, +37,47, +58,28, +-41,-50, +-71,-7, +-3,139, +165,158, +-36,-17, +-9,-35, +32,-22, +115,169, +20,-15, +111,-86, +-3,-6, +104,-133, +32,-114, +67,-48, +-119,43, +-41,20, +-14,-27, +-93,9, +-21,6, +63,113, +-26,-29, +-72,-110, +-28,229, +66,46, +-23,22, +39,10, +-16,69, +-149,-45, +-80,-161, +-25,21, +143,-67, +73,81, +2,-123, +-134,-10, +-42,-83, +-75,-107, +-10,-41, +-10,-97, +109,-145, +202,-3, +-60,10, +-64,-13, +9,-26, +7,-68, +-88,-145, +-62,71, +67,20, +-86,35, +209,70, +-176,12, +-101,-23, +-53,165, +-109,107, +42,-2, +-126,-73, +1,-113, +-148,-70, +138,-63, +-99,-55, +59,-150, +124,6, +48,29, +-51,-50, +133,16, +51,-101, +33,98, +-89,-107, +-58,19, +-21,-98, +-43,62, +-7,76, +-101,66, +-142,-8, +-12,-217, +-70,83, +124,-11, +12,114, +112,-39, +72,8, +68,-20, +-13,96, +-34,-39, +-116,-3, +13,114, +-95,28, +-68,68, +-9,33, +6,104, +-18,-28, +-83,-54, +92,-91, +-48,-57, +-19,-129, +-130,32, +110,-84, +13,122, +163,103, +-111,93, +-150,51, +69,-8, +-33,65, +100,51, +-20,53, +76,62, +-108,-180, +169,-34, +-29,2, +-70,-49, +104,-141, +65,11, +96,-64, +74,88, +85,-85, +72,210, +144,-34, +-10,109, +-191,-13, +-63,123, +-59,185, +-15,-36, +-18,100, +-72,-219, +-87,115, +72,32, +12,45, +144,53, +60,-33, +-43,82, +-12,24, +85,-137, +66,-227, +147,47, +110,79, +28,-52, +120,184, +127,85, +-85,12, +154,-99, +-105,-104, +76,-89, +132,216, +109,115, +-127,2, +-33,24, +102,-50, +-271,-26, +-54,0, +-6,120, +53,-1, +-66,-58, +-104,38, +59,76, +0,48, +-16,68, +-48,66, +30,48, +211,-190, +71,9, +92,-116, +81,-37, +-35,-117, +-98,-62, +-108,-122, +158,98, +-49,-51, +-175,-109, +-177,-88, +-14,156, +95,19, +-54,-58, +-78,-62, +116,-54, +-21,-65, +-64,-108, +-155,-10, +151,-32, +26,-180, +190,-25, +121,4, +-68,160, +-76,-77, +-90,-69, +-118,301, +-48,-92, +-99,-13, +-57,129, +38,-48, +-48,-71, +24,172, +-62,-48, +100,10, +61,-108, +13,255, +54,-106, +110,65, +21,126, +-93,-95, +90,86, +4,-113, +26,-102, +67,161, +67,-150, +124,216, +109,-16, +-44,-14, +-40,165, +-66,-38, +18,82, +54,-30, +-173,101, +-20,50, +135,-19, +22,-105, +-192,-9, +-45,22, +-12,23, +75,-23, +-37,26, +-99,169, +-156,-23, +-5,-63, +79,-19, +99,29, +-25,26, +-27,78, +-10,-160, +-104,-21, +218,-74, +-96,-18, +-265,-156, +-51,-11, +-182,52, +-152,-161, +36,139, +173,-242, +-165,118, +80,71, +125,-118, +141,21, +143,-143, +1,-143, +-76,-151, +-93,-124, +26,146, +113,-163, +-21,132, +80,-58, +35,34, +97,110, +58,-73, +227,-90, +-76,4, +-79,-220, +-2,25, +21,-86, +22,-28, +-87,177, +-93,-16, +-137,130, +-58,-81, +-142,-179, +-64,136, +-156,-95, +145,-236, +-97,343, +-70,-41, +-84,-47, +-88,62, +50,-66, +-35,66, +2,138, +-19,-90, +-96,-100, +-78,-109, +-5,-22, +-61,-82, +76,-52, +173,-116, +-8,-96, +-22,-255, +-93,76, +18,60, +-110,85, +179,145, +238,-56, +35,0, +-240,-24, +81,-54, +-158,-45, +-384,-81, +-52,-84, +-79,10, +114,-88, +64,122, +-20,-138, +-22,24, +-8,-160, +-80,-10, +-42,-87, +-15,153, +-69,-1, +44,-42, +132,-137, +-111,-64, +-2,74, +146,249, +103,18, +-101,32, +-31,131, +-72,62, +-57,-11, +71,45, +139,41, +203,-108, +191,15, +-47,-185, +-97,-18, +-57,-68, +-23,181, +15,-46, +51,-87, +-57,-139, +-28,-113, +63,171, +44,45, +64,-67, +83,-146, +330,-6, +-87,-124, +153,108, +-225,-93, +-92,-92, +-65,-101, +27,-6, +-217,-190, +196,-38, +133,49, +122,-26, +-34,-133, +-33,181, +-164,-43, +78,51, +79,206, +-37,161, +125,280, +30,53, +-37,-306, +40,-98, +3,-61, +42,148, +-145,73, +191,-69, +-40,10, +-100,47, +132,86, +311,-161, +11,158, +38,-74, +-41,-36, +173,111, +-13,27, +-34,-21, +-95,33, +-30,-190, +-182,77, +122,-61, +88,-61, +-90,73, +-105,126, +-85,-116, +192,42, +-77,103, +-82,167, +167,11, +-130,42, +-63,133, +-12,-142, +13,54, +151,-195, +176,83, +-146,-63, +102,-121, +161,-132, +29,-70, +-3,-26, +17,-109, +-273,-22, +20,-417, +43,179, +206,-2, +127,-97, +206,-58, +-6,-21, +6,104, +49,38, +-210,-180, +221,108, +124,84, +178,173, +132,188, +118,-170, +144,-76, +28,106, +118,16, +23,-149, +-114,-153, +-23,-281, +58,60, +27,-139, +-33,87, +-1,73, +-26,31, +148,-134, +169,-28, +51,156, +49,-189, +-67,-217, +117,52, +-80,-75, +-24,-143, +54,-54, +44,-96, +-86,-23, +-94,-114, +119,-8, +-67,-38, +-12,-88, +-188,27, +136,212, +-20,-26, +-48,75, +81,62, +5,19, +61,-52, +-213,-2, +-81,165, +-120,126, +80,235, +-42,-57, +209,88, +89,18, +-46,72, +-136,-135, +-194,191, +165,19, +-62,-71, +46,-42, +-34,202, +-102,4, +134,-17, +-318,-142, +80,235, +29,59, +-54,136, +109,172, +219,-150, +-272,-42, +-170,6, +158,-4, +10,-214, +43,-187, +36,63, +-53,-15, +0,-199, +209,-114, +-121,-7, +190,-273, +-3,55, +44,60, +-3,77, +-211,-249, +78,-170, +61,157, +-94,-25, +-29,-179, +64,-64, +17,-18, +171,50, +110,-25, +-79,-30, +-230,132, +-149,167, +-145,52, +51,-115, +-178,-59, +96,-273, +155,-81, +-29,-69, +95,-4, +-184,61, +-60,-177, +157,-127, +-211,-28, +65,255, +20,106, +52,-19, +-73,2, +-36,-218, +162,275, +-113,1, +35,-130, +33,132, +192,130, +11,-56, +152,-152, +195,-91, +-143,-69, +-165,-40, +129,26, +-131,-59, +129,81, +149,-151, +-197,-178, +45,-58, +113,92, +223,30, +225,-75, +-126,33, +104,-201, +155,85, +69,194, +52,263, +-40,-93, +-82,-107, +137,15, +96,-112, +103,-71, +1,114, +123,164, +-221,-10, +-43,-78, +-108,16, +145,-169, +-118,92, +34,301, +40,13, +-23,-166, +-119,33, +-72,-30, +-67,-8, +127,213, +-87,-304, +10,-18, +-43,-39, +-50,24, +14,25, +16,-243, +52,4, +162,-108, +8,-11, +116,166, +19,154, +-126,-52, +-165,-26, +356,242, +-82,-26, +82,28, +-62,-150, +127,-88, +-153,35, +54,-33, +-125,-44, +-233,157, +-8,-129, +-62,-162, +28,-93, +-35,264, +-67,-93, +-18,-13, +15,-95, +-117,28, +-61,-24, +-83,84, +54,-88, +-66,170, +52,78, +160,215, +-104,70, +158,55, +-82,128, +-325,-114, +-86,-258, +152,102, +198,-91, +-157,-211, +98,13, +90,125, +73,54, +-279,-100, +-192,-292, +-85,66, +-199,69, +-56,106, +49,-130, +-85,-45, +-90,89, +6,0, +99,-338, +-46,14, +89,-38, +25,-180, +-215,24, +69,82, +-83,205, +-237,5, +-71,27, +-156,220, +-244,119, +210,-143, +-237,101, +-171,18, +-88,-116, +-6,72, +-31,131, +40,-33, +152,30, +-110,-24, +55,0, +170,55, +106,119, +52,-100, +-24,-2, +-32,216, +-9,-58, +111,48, +-29,-27, +-36,-334, +-96,15, +103,-93, +-8,-29, +79,-82, +-27,145, +-77,-117, +167,62, +48,-9, +68,150, +-69,-43, +93,131, +-267,-66, +9,192, +46,-107, +29,-164, +13,-48, +68,-3, +135,1, +-39,-96, +166,-261, +7,233, +135,-191, +-57,-101, +55,51, +-31,-107, +-17,-50, +110,102, +-48,119, +137,137, +-63,31, +10,56, +71,-175, +-228,201, +-220,247, +-138,80, +185,-59, +-204,128, +78,-1, +5,-207, +105,-100, +-71,62, +-185,12, +-29,165, +-82,183, +86,-241, +118,-72, +192,-111, +-19,55, +-213,-54, +110,62, +-9,292, +177,85, +137,-38, +-224,-255, +-70,-83, +259,23, +141,-5, +-26,-98, +27,-219, +52,11, +-13,-43, +4,64, +110,142, +80,-8, +-158,-64, +35,21, +281,-48, +61,109, +-35,-40, +-38,-15, +21,108, +-30,-141, +-101,-62, +14,10, +-20,82, +148,33, +79,55, +119,151, +51,100, +-26,56, +-85,67, +-8,-45, +4,249, +50,-20, +166,174, +10,323, +-156,123, +-324,269, +-157,-353, +122,84, +109,156, +-59,172, +-164,215, +-293,-100, +159,60, +-93,-115, +1,264, +150,246, +287,-60, +-268,126, +3,148, +15,-116, +41,-47, +-50,27, +-51,-59, +55,-36, +-69,-112, +-64,-93, +83,74, +150,150, +-141,215, +12,121, +115,-285, +6,-52, +-148,84, +48,-65, +-144,-126, +-35,-118, +-95,-203, +104,212, +114,-219, +306,81, +98,-140, +-103,38, +43,102, +2,129, +39,-113, +67,0, +245,-61, +-101,-44, +127,-185, +-81,185, +87,102, +-60,-26, +-62,-61, +-148,155, +-87,220, +126,-5, +91,-144, +-123,-50, +84,-130, +137,-184, +81,-13, +139,-45, +32,-117, +46,133, +53,169, +-112,31, +-133,-51, +-27,-236, +22,-227, +58,-31, +249,104, +-151,-114, +151,116, +-80,144, +109,238, +-16,-64, +-97,-61, +-124,-74, +-175,45, +57,237, +147,18, +-39,103, +-52,10, +67,186, +-38,140, +108,60, +-63,-64, +129,-68, +323,-19, +144,-41, +-127,103, +-158,-65, +-233,-109, +-187,188, +-76,71, +-32,26, +-76,83, +4,96, +161,-147, +1,118, +114,192, +-50,18, +-95,-42, +90,-80, +64,42, +-151,89, +104,4, +-8,124, +-29,67, +-48,94, +-21,22, +-33,157, +54,124, +21,-107, +56,-176, +-155,152, +204,238, +-24,288, +-72,11, +40,-108, +-9,114, +3,-24, +-211,236, +15,-10, +-4,49, +29,-25, +-33,-11, +-119,-125, +-72,-91, +16,151, +-57,-11, +62,-5, +-122,125, +96,134, +-193,124, +-48,54, +263,25, +88,1, +303,16, +-80,-56, +-142,-257, +46,44, +-36,48, +42,3, +-174,-5, +-5,70, +169,-133, +46,143, +-179,56, +219,-19, +-157,342, +-34,26, +-73,38, +92,-90, +232,174, +4,-115, +-70,10, +126,-38, +93,-14, +95,77, +31,94, +-171,137, +145,-47, +-70,-137, +-4,77, +-104,-38, +-95,-23, +-80,-150, +213,97, +20,-7, +29,-30, +64,80, +136,226, +22,125, +-18,-126, +-270,-90, +243,65, +-56,-67, +62,-82, +-51,6, +15,-86, +-67,184, +97,-167, +-100,17, +-10,71, +21,39, +33,48, +205,16, +-63,-115, +187,-16, +-23,-34, +-5,21, +168,27, +-78,-103, +-92,-123, +-109,149, +118,78, +15,55, +-20,-3, +-108,-113, +-198,29, +-67,79, +-243,56, +-129,-107, +7,69, +51,-55, +-1,-52, +-75,-223, +-147,-164, +235,74, +-54,-109, +49,13, +-50,-161, +30,-26, +29,75, +-105,63, +196,-61, +168,-221, +139,76, +-105,-176, +42,75, +201,-26, +-130,56, +-73,-93, +152,151, +42,173, +83,37, +-40,-38, +20,-38, +-46,-163, +-131,-25, +-101,18, +-40,5, +178,-53, +-18,55, +135,-80, +-123,-189, +150,87, +-167,-136, +-12,-85, +-6,-35, +1,-8, +-119,101, +-37,29, +-68,-1, +-133,-10, +-262,-51, +120,-1, +-134,-80, +168,22, +229,-128, +-28,-278, +-211,-58, +22,-210, +74,-243, +-191,-84, +-103,187, +166,104, +-108,157, +-9,102, +-43,146, +38,89, +2,17, +132,34, +-84,53, +-44,57, +-99,72, +-135,48, +20,-94, +180,-120, +187,142, +133,-36, +-57,11, +32,40, +87,-167, +12,27, +124,-130, +44,-124, +-176,33, +81,1, +-105,-123, +-21,-53, +179,-115, +-82,148, +158,-174, +-124,-43, +-228,32, +-7,15, +47,347, +-73,23, +22,145, +-7,73, +-63,251, +-61,-4, +-25,36, +28,-282, +107,171, +56,-31, +110,21, +-120,36, +86,46, +3,-26, +178,-51, +104,-23, +-96,51, +115,70, +100,-103, +67,-96, +95,14, +-127,278, +266,-106, +165,-71, +-94,15, +-48,-147, +-5,35, +57,-49, +-127,-30, +157,-82, +-50,11, +75,22, +-108,10, +-11,143, +-49,-17, +16,194, +-212,-19, +-15,-42, +95,117, +-62,5, +-73,-9, +-46,-76, +-72,23, +-23,-101, +-12,46, +67,-29, +13,-100, +-113,181, +60,-69, +-25,63, +-241,40, +108,-61, +13,101, +-48,-47, +-97,118, +87,58, +95,60, +-15,-8, +-92,3, +140,-84, +-155,106, +-17,90, +-13,68, +10,75, +-11,-170, +149,44, +101,69, +-116,16, +-8,-10, +96,172, +1,-56, +18,220, +-69,-1, +-63,-153, +-51,200, +6,90, +3,1, +36,-19, +-122,11, +9,-131, +-24,19, +-11,102, +43,34, +168,-21, +44,-55, +134,-127, +93,15, +-126,-95, +32,152, +-80,-31, +-44,-62, +-32,-3, +32,-164, +-1,30, +92,118, +0,-64, +30,-119, +54,171, +-203,-29, +30,-44, +8,98, +127,-13, +26,9, +-35,-62, +89,-8, +-69,11, +7,62, +186,-132, +-108,-54, +126,51, +140,-201, +45,62, +-68,262, +-104,-81, +22,95, +-86,55, +-59,40, +124,-22, +-61,-3, +-50,59, +-22,-29, +74,96, +-13,136, +6,-179, +42,20, +4,-86, +41,39, +-119,94, +72,-35, +81,72, +-123,30, +-133,-54, +78,-66, +-40,38, +-30,-139, +197,29, +-230,32, +-33,72, +21,147, +-132,63, +61,78, +179,-13, +-111,-5, +-51,-59, +36,-2, +-70,-71, +-26,60, +232,2, +-32,-63, +-2,-62, +37,-10, +-4,-62, +199,65, +-27,66, +51,-36, +24,-52, +68,51, +-44,134, +-8,17, +-66,-41, +119,60, +105,-115, +2,2, +30,-34, +-76,59, +34,-95, +35,93, +70,103, +37,-98, +85,-91, +-84,143, +98,-86, +-17,-51, +-43,-80, +153,4, +-78,12, +53,-80, +-17,71, +-73,53, +45,-113, +-60,1, +-30,-23, +-43,-130, +84,22, +-9,61, +20,-71, +42,-64, +-9,-89, +177,34, +-20,-67, +44,-3, +44,-73, +-23,132, +-54,-51, +-40,39, +33,-48, +-108,63, +34,-95, +-66,-33, +-93,144, +55,98, +50,77, +127,-101, +-125,138, +-63,113, +45,-47, +50,67, +-23,20, +-46,75, +-5,140, +31,-93, +23,37, +-15,-4, +88,99, +-79,33, +45,43, +-193,-10, +134,-74, +114,-26, +109,19, +-11,-49, +201,12, +38,20, +163,-52, +-22,-105, +-98,-70, +23,-26, +-68,162, +73,-72, +-140,49, +-48,30, +29,-146, +-36,58, +-52,-30, +-43,18, +-108,123, +40,-9, +-69,-6, +-6,58, +85,-3, +-39,155, +3,154, +-66,-41, +-11,-67, +81,-33, +42,-98, +8,17, +33,32, +32,44, +27,-27, +94,48, +116,-101, +20,25, +135,36, +87,-28, +-47,-127, +-172,32, +-75,37, +-121,-153, +-100,-16, +-103,179, +-20,18, +17,48, +-67,-76, +12,-27, +-21,-171, +-9,-3, +48,-26, +15,-76, +40,-14, +-36,43, +-92,-90, +15,18, +-65,-57, +-24,88, +-73,-76, +0,115, +26,23, +-45,17, +36,-75, +-29,-66, +-73,-33, +-52,0, +7,24, +6,-33, +103,112, +75,33, +-12,-51, +-49,-8, +98,34, +-85,67, +27,-37, +-70,-1, +-30,194, +-97,20, +61,2, +54,-17, +-60,24, +-19,1, +-76,-52, +30,100, +-42,-25, +-35,46, +-120,-97, +-84,-15, +65,75, +-55,-22, +0,-99, +12,-48, +46,-123, +-8,-49, +-12,-60, +-45,-41, +30,48, +92,23, +-4,-14, +-5,-107, +-57,38, +-23,13, +42,26, +-3,28, +-70,-11, +12,106, +-22,-22, +-1,87, +66,7, +21,-59, +-50,33, +42,-29, +-56,18, +72,-22, +-48,9, +-47,-40, +6,97, +-6,-48, +-26,32, +-51,-118, +36,47, +126,78, +33,12, +-35,-9, +39,80, +-9,9, +-13,28, +-65,-67, +39,-45, +-21,-25, +-17,44, +-36,-54, +37,42, +93,-52, +-12,33, +2,103, +24,-10, +-70,-7, +29,33, +8,43, +27,78, +-70,-11, +123,-104, +33,68, +62,-44, +27,22, +-8,-20, +34,63, +-36,17, +21,-62, +3,-42, +29,78, +-22,-61, +-45,-38, +-75,29, +28,1, +9,165, +-13,24, +41,-16, +38,-11, +61,-62, +45,48, +-6,-45, +17,16, +22,-9, +2,-27, +-67,-38, +-14,-21, +26,10, +-32,20, +58,-40, +17,-17, +72,-63, +-34,44, +7,-4, +3,-40, +63,34, +148,9, +9,22, +-49,-55, +-31,62, +35,-1, +50,-23, +31,14, +3,-23, +53,-38, +16,54, +28,-27, +10,-10, +18,12, +-7,18, +-50,-20, +33,-8, +68,4, +4,47, +0,14, +-4,24, +41,-29, +5,-18, +38,-14, +28,-73, +2,-64, +-35,-61, +11,-36, +32,49, +-45,98, +-12,36, +-2,5, +-7,-11, +61,41, +48,-19, +23,-4, +-12,3, +66,20, +18,28, +37,-38, +-10,-71, +-53,1, +19,-4, +37,-14, +77,61, +-8,-58, +11,48, +-4,9, +5,45, +-63,4, +-69,-14, +-24,-35, +25,-24, +39,4, +25,17, +-7,18, +-32,17, +-6,42, +-28,31, +-55,7, +-14,-2, +-16,-4, +-25,43, +63,-11, +57,-59, +-34,-9, +-11,7, +61,-31, +-5,49, +-1,-35, +-38,26, +0,26, +-19,44, +2,-17, +0,26, +46,-7, +-3,-20, +-11,31, +-38,58, +44,45, +-58,1, +31,10, +-49,-49, +-56,8, +23,-21, +10,-17, +-44,-4, +-10,31, +-13,-12, +52,-7, +56,9, +-10,30, +-14,-15, +-7,-16, +-33,5, +2,6, +12,-26, +-29,6, +-7,33, +29,-51, +11,0, +9,16, +36,54, +44,-18, +10,9, +-40,-11, +38,-9, +-3,-68, +49,1, +50,30, +-37,4, +7,-18, +-23,-54, +76,-47, +35,22, +20,18, +34,9, +-4,7, +33,-8, +-10,-12, +10,-4, +29,10, +13,12, +13,27, +9,7, +6,14, +9,-11, +-19,-8, +-7,-9, +-3,4, +13,-2, +-6,-15, +-4,23, +24,30, +-21,9, +-5,-15, +14,-3, +2,28, +13,-2, +10,-10, +-26,18, +-7,0, +-21,-11, +-6,31, +12,27, +-16,-15, +-30,-14, +-14,5, +28,20, +16,20, +20,-17, +-2,-1, +-14,-11, +14,15, +-33,29, +-12,-5, +13,1, +22,-11, +1,-13, +3,-12, +-4,7, +-28,18, +2,-20, +16,10, +-8,-7, +3,3, +38,-32, +2,-14, +-2,-1, +-4,4, +9,1, +5,-4, +20,16, +3,-6, +-8,4, +4,3, +-8,-7, +-9,8, +5,-2, +-14,13, +9,0, +-20,9, +-5,0, +13,10, +-11,0, +-16,-1, +7,9, +-3,-8, +8,-6, +-1,-8, +7,9, +-3,-7, +12,9, +-7,6, +0,-2, +3,-3, +3,4, +-12,4, +7,-3, +-9,4, +-9,-8, +-3,1, +1,5, +1,0, +4,-4, +5,3, +-7,-1, +3,4, +8,8, +-6,-1, +2,-1, +2,3, +-4,3, +5,-3, +4,2, +-7,-1, +2,-8, +3,2, +-5,-2, +2,-1, +7,-3, +-4,-2, +2,-2, +5,-1, +-3,-1, +1,0, +2,-1, +-5,1, +2,0, +3,0, +-6,0, +3,0, +2,0, +-5,-1, +2,1, +1,0, +-3,1, +5,1, +2,2, +-4,2, +7,3, +2,1, +-5,2, +3,-2, +2,8, +-7,1, +4,-2, +5,3, +-4,-3, +2,-3, +2,1, +-6,1, +8,-8, +3,-4, +-7,1, +5,-3, +4,4, +1,0, +1,-5, +-3,-1, +-9,8, +-9,-4, +7,3, +-12,-4, +3,-4, +3,3, +0,2, +-7,-6, +12,-9, +-3,7, +7,-9, +-1,8, +8,6, +-3,8, +7,-9, +-16,1, +-11,0, +13,-10, +-5,0, +-20,-9, +9,0, +-14,-13, +5,2, +-9,-8, +-8,7, +4,-3, +-8,-4, +3,6, +20,-16, +5,4, +9,-1, +-4,-4, +-2,1, +2,14, +38,32, +3,-3, +-8,7, +16,-10, +2,20, +-28,-18, +-4,-7, +3,12, +1,13, +22,11, +13,-1, +-12,5, +-33,-29, +14,-15, +-14,11, +-2,1, +20,17, +16,-20, +28,-20, +-14,-5, +-30,14, +-16,15, +12,-27, +-6,-31, +-21,11, +-7,0, +-26,-18, +10,10, +13,2, +2,-28, +14,3, +-5,15, +-21,-9, +24,-30, +-4,-23, +-6,15, +13,2, +-3,-4, +-7,9, +-19,8, +9,11, +6,-14, +9,-7, +13,-27, +13,-12, +29,-10, +10,4, +-10,12, +33,8, +-4,-7, +34,-9, +20,-18, +35,-22, +76,47, +-23,54, +7,18, +-37,-4, +50,-30, +49,-1, +-3,68, +38,9, +-40,11, +10,-9, +44,18, +36,-54, +9,-16, +11,0, +29,51, +-7,-33, +-29,-6, +12,26, +2,-6, +-33,-5, +-7,16, +-14,15, +-10,-30, +56,-9, +52,7, +-13,12, +-10,-31, +-44,4, +10,17, +23,21, +-56,-8, +-49,49, +31,-10, +-58,-1, +44,-45, +-38,-58, +-11,-31, +-3,20, +46,7, +0,-26, +2,17, +-19,-44, +0,-26, +-38,-26, +-1,35, +-5,-49, +61,31, +-11,-7, +-34,9, +57,59, +63,11, +-25,-43, +-16,4, +-14,2, +-55,-7, +-28,-31, +-6,-42, +-32,-17, +-7,-18, +25,-17, +39,-4, +25,24, +-24,35, +-69,14, +-63,-4, +5,-45, +-4,-9, +11,-48, +-8,58, +77,-61, +37,14, +19,4, +-53,-1, +-10,71, +37,38, +18,-28, +66,-20, +-12,-3, +23,4, +48,19, +61,-41, +-7,11, +-2,-5, +-12,-36, +-45,-98, +32,-49, +11,36, +-35,61, +2,64, +28,73, +38,14, +5,18, +41,29, +-4,-24, +0,-14, +4,-47, +68,-4, +33,8, +-50,20, +-7,-18, +18,-12, +10,10, +28,27, +16,-54, +53,38, +3,23, +31,-14, +50,23, +35,1, +-31,-62, +-49,55, +9,-22, +148,-9, +63,-34, +3,40, +7,4, +-34,-44, +72,63, +17,17, +58,40, +-32,-20, +26,-10, +-14,21, +-67,38, +2,27, +22,9, +17,-16, +-6,45, +45,-48, +61,62, +38,11, +41,16, +-13,-24, +9,-165, +28,-1, +-75,-29, +-45,38, +-22,61, +29,-78, +3,42, +21,62, +-36,-17, +34,-63, +-8,20, +27,-22, +62,44, +33,-68, +123,104, +-70,11, +27,-78, +8,-43, +29,-33, +-70,7, +24,10, +2,-103, +-12,-33, +93,52, +37,-42, +-36,54, +-17,-44, +-21,25, +39,45, +-65,67, +-13,-28, +-9,-9, +39,-80, +-35,9, +33,-12, +126,-78, +36,-47, +-51,118, +-26,-32, +-6,48, +6,-97, +-47,40, +-48,-9, +72,22, +-56,-18, +42,29, +-50,-33, +21,59, +66,-7, +-1,-87, +-22,22, +12,-106, +-70,11, +-3,-28, +42,-26, +-23,-13, +-57,-38, +-5,107, +-4,14, +92,-23, +30,-48, +-45,41, +-12,60, +-8,49, +46,123, +12,48, +0,99, +-55,22, +65,-75, +-84,15, +-120,97, +-35,-46, +-42,25, +30,-100, +-76,52, +-19,-1, +-60,-24, +54,17, +61,-2, +-97,-20, +-30,-194, +-70,1, +27,37, +-85,-67, +98,-34, +-49,8, +-12,51, +75,-33, +103,-112, +6,33, +7,-24, +-52,0, +-73,33, +-29,66, +36,75, +-45,-17, +26,-23, +0,-115, +-73,76, +-24,-88, +-65,57, +15,-18, +-92,90, +-36,-43, +40,14, +15,76, +48,26, +-9,3, +-21,171, +12,27, +-67,76, +17,-48, +-20,-18, +-103,-179, +-100,16, +-121,153, +-75,-37, +-172,-32, +-47,127, +87,28, +135,-36, +20,-25, +116,101, +94,-48, +27,27, +32,-44, +33,-32, +8,-17, +42,98, +81,33, +-11,67, +-66,41, +3,-154, +-39,-155, +85,3, +-6,-58, +-69,6, +40,9, +-108,-123, +-43,-18, +-52,30, +-36,-58, +29,146, +-48,-30, +-140,-49, +73,72, +-68,-162, +23,26, +-98,70, +-22,105, +163,52, +38,-20, +201,-12, +-11,49, +109,-19, +114,26, +134,74, +-193,10, +45,-43, +-79,-33, +88,-99, +-15,4, +23,-37, +31,93, +-5,-140, +-46,-75, +-23,-20, +50,-67, +45,47, +-63,-113, +-125,-138, +127,101, +50,-77, +55,-98, +-93,-144, +-66,33, +34,95, +-108,-63, +33,48, +-40,-39, +-54,51, +-23,-132, +44,73, +44,3, +-20,67, +177,-34, +-9,89, +42,64, +20,71, +-9,-61, +84,-22, +-43,130, +-30,23, +-60,-1, +45,113, +-73,-53, +-17,-71, +53,80, +-78,-12, +153,-4, +-43,80, +-17,51, +98,86, +-84,-143, +85,91, +37,98, +70,-103, +35,-93, +34,95, +-76,-59, +30,34, +2,-2, +105,115, +119,-60, +-66,41, +-8,-17, +-44,-134, +68,-51, +24,52, +51,36, +-27,-66, +199,-65, +-4,62, +37,10, +-2,62, +-32,63, +232,-2, +-26,-60, +-70,71, +36,2, +-51,59, +-111,5, +179,13, +61,-78, +-132,-63, +21,-147, +-33,-72, +-230,-32, +197,-29, +-30,139, +-40,-38, +78,66, +-133,54, +-123,-30, +81,-72, +72,35, +-119,-94, +41,-39, +4,86, +42,-20, +6,179, +-13,-136, +74,-96, +-22,29, +-50,-59, +-61,3, +124,22, +-59,-40, +-86,-55, +22,-95, +-104,81, +-68,-262, +45,-62, +140,201, +126,-51, +-108,54, +186,132, +7,-62, +-69,-11, +89,8, +-35,62, +26,-9, +127,13, +8,-98, +30,44, +-203,29, +54,-171, +30,119, +0,64, +92,-118, +-1,-30, +32,164, +-32,3, +-44,62, +-80,31, +32,-152, +-126,95, +93,-15, +134,127, +44,55, +168,21, +43,-34, +-11,-102, +-24,-19, +9,131, +-122,-11, +36,19, +3,-1, +6,-90, +-51,-200, +-63,153, +-69,1, +18,-220, +1,56, +96,-172, +-8,10, +-116,-16, +101,-69, +149,-44, +-11,170, +10,-75, +-13,-68, +-17,-90, +-155,-106, +140,84, +-92,-3, +-15,8, +95,-60, +87,-58, +-97,-118, +-48,47, +13,-101, +108,61, +-241,-40, +-25,-63, +60,69, +-113,-181, +13,100, +67,29, +-12,-46, +-23,101, +-72,-23, +-46,76, +-73,9, +-62,-5, +95,-117, +-15,42, +-212,19, +16,-194, +-49,17, +-11,-143, +-108,-10, +75,-22, +-50,-11, +157,82, +-127,30, +57,49, +-5,-35, +-48,147, +-94,-15, +165,71, +266,106, +-127,-278, +95,-14, +67,96, +100,103, +115,-70, +-96,-51, +104,23, +178,51, +3,26, +86,-46, +-120,-36, +110,-21, +56,31, +107,-171, +28,282, +-25,-36, +-61,4, +-63,-251, +-7,-73, +22,-145, +-73,-23, +47,-347, +-7,-15, +-228,-32, +-124,43, +158,174, +-82,-148, +179,115, +-21,53, +-105,123, +81,-1, +-176,-33, +44,124, +124,130, +12,-27, +87,167, +32,-40, +-57,-11, +133,36, +187,-142, +180,120, +20,94, +-135,-48, +-99,-72, +-44,-57, +-84,-53, +132,-34, +2,-17, +38,-89, +-43,-146, +-9,-102, +-108,-157, +166,-104, +-103,-187, +-191,84, +74,243, +22,210, +-211,58, +-28,278, +229,128, +168,-22, +-134,80, +120,1, +-262,51, +-133,10, +-68,1, +-37,-29, +-119,-101, +1,8, +-6,35, +-12,85, +-167,136, +150,-87, +-123,189, +135,80, +-18,-55, +178,53, +-40,-5, +-101,-18, +-131,25, +-46,163, +20,38, +-40,38, +83,-37, +42,-173, +152,-151, +-73,93, +-130,-56, +201,26, +42,-75, +-105,176, +139,-76, +168,221, +196,61, +-105,-63, +29,-75, +30,26, +-50,161, +49,-13, +-54,109, +235,-74, +-147,164, +-75,223, +-1,52, +51,55, +7,-69, +-129,107, +-243,-56, +-67,-79, +-198,-29, +-108,113, +-20,3, +15,-55, +118,-78, +-109,-149, +-92,123, +-78,103, +168,-27, +-5,-21, +-23,34, +187,16, +-63,115, +205,-16, +33,-48, +21,-39, +-10,-71, +-100,-17, +97,167, +-67,-184, +15,86, +-51,-6, +62,82, +-56,67, +243,-65, +-270,90, +-18,126, +22,-125, +136,-226, +64,-80, +29,30, +20,7, +213,-97, +-80,150, +-95,23, +-104,38, +-4,-77, +-70,137, +145,47, +-171,-137, +31,-94, +95,-77, +93,14, +126,38, +-70,-10, +4,115, +232,-174, +92,90, +-73,-38, +-34,-26, +-157,-342, +219,19, +-179,-56, +46,-143, +169,133, +-5,-70, +-174,5, +42,-3, +-36,-48, +46,-44, +-142,257, +-80,56, +303,-16, +88,-1, +263,-25, +-48,-54, +-193,-124, +96,-134, +-122,-125, +62,5, +-57,11, +16,-151, +-72,91, +-119,125, +-33,11, +29,25, +-4,-49, +15,10, +-211,-236, +3,24, +-9,-114, +40,108, +-72,-11, +-24,-288, +204,-238, +-155,-152, +56,176, +21,107, +54,-124, +-33,-157, +-21,-22, +-48,-94, +-29,-67, +-8,-124, +104,-4, +-151,-89, +64,-42, +90,80, +-95,42, +-50,-18, +114,-192, +1,-118, +161,147, +4,-96, +-76,-83, +-32,-26, +-76,-71, +-187,-188, +-233,109, +-158,65, +-127,-103, +144,41, +323,19, +129,68, +-63,64, +108,-60, +-38,-140, +67,-186, +-52,-10, +-39,-103, +147,-18, +57,-237, +-175,-45, +-124,74, +-97,61, +-16,64, +109,-238, +-80,-144, +151,-116, +-151,114, +249,-104, +58,31, +22,227, +-27,236, +-133,51, +-112,-31, +53,-169, +46,-133, +32,117, +139,45, +81,13, +137,184, +84,130, +-123,50, +91,144, +126,5, +-87,-220, +-148,-155, +-62,61, +-60,26, +87,-102, +-81,-185, +127,185, +-101,44, +245,61, +67,0, +39,113, +2,-129, +43,-102, +-103,-38, +98,140, +306,-81, +114,219, +104,-212, +-95,203, +-35,118, +-144,126, +48,65, +-148,-84, +6,52, +115,285, +12,-121, +-141,-215, +150,-150, +83,-74, +-64,93, +-69,112, +55,36, +-51,59, +-50,-27, +41,47, +15,116, +3,-148, +-268,-126, +287,60, +150,-246, +1,-264, +-93,115, +159,-60, +-293,100, +-164,-215, +-59,-172, +109,-156, +122,-84, +-157,353, +-324,-269, +-156,-123, +10,-323, +166,-174, +50,20, +4,-249, +-8,45, +-85,-67, +-26,-56, +51,-100, +119,-151, +79,-55, +148,-33, +-20,-82, +14,-10, +-101,62, +-30,141, +21,-108, +-38,15, +-35,40, +61,-109, +281,48, +35,-21, +-158,64, +80,8, +110,-142, +4,-64, +-13,43, +52,-11, +27,219, +-26,98, +141,5, +259,-23, +-70,83, +-224,255, +137,38, +177,-85, +-9,-292, +110,-62, +-213,54, +-19,-55, +192,111, +118,72, +86,241, +-82,-183, +-29,-165, +-185,-12, +-71,-62, +105,100, +5,207, +78,1, +-204,-128, +185,59, +-138,-80, +-220,-247, +-228,-201, +71,175, +10,-56, +-63,-31, +137,-137, +-48,-119, +110,-102, +-17,50, +-31,107, +55,-51, +-57,101, +135,191, +7,-233, +166,261, +-39,96, +135,-1, +68,3, +13,48, +29,164, +46,107, +9,-192, +-267,66, +93,-131, +-69,43, +68,-150, +48,9, +167,-62, +-77,117, +-27,-145, +79,82, +-8,29, +103,93, +-96,-15, +-36,334, +-29,27, +111,-48, +-9,58, +-32,-216, +-24,2, +52,100, +106,-119, +170,-55, +55,0, +-110,24, +152,-30, +40,33, +-31,-131, +-6,-72, +-88,116, +-171,-18, +-237,-101, +210,143, +-244,-119, +-156,-220, +-71,-27, +-237,-5, +-83,-205, +69,-82, +-215,-24, +25,180, +89,38, +-46,-14, +99,338, +6,0, +-253,61, +-19,74, +-74,-68, +21,-158, +77,-45, +-22,-49, +20,-35, +-64,-23, +-29,-8, +-2,-114, +-139,61, +-142,42, +23,132, +-193,178, +-92,6, +-157,52, +-41,-78, +-82,-112, +238,-149, +-111,-4, +-34,77, +45,91, +95,240, +0,-4, +189,-42, +286,14, +42,154, +18,52, +210,86, +-22,95, +35,291, +-120,110, +82,-209, +307,-20, +-45,-207, +121,69, +-22,-19, +-83,34, +153,-63, +-37,-144, +1,34, +176,-52, +-16,4, +-48,116, +-37,-30, +-32,-122, +44,-23, +96,-10, +-15,91, +8,162, +-66,-11, +5,-126, +-21,222, +-143,12, +-91,195, +-28,-168, +-48,-44, +87,-203, +-310,48, +84,-255, +219,163, +-56,154, +21,-50, +-37,-190, +-84,14, +79,-146, +108,139, +-84,118, +119,3, +-11,66, +43,105, +-55,71, +66,-105, +107,62, +45,273, +-24,-93, +140,199, +169,-285, +-99,6, +-22,-64, +-20,-68, +17,67, +-88,231, +168,-172, +120,57, +-208,116, +28,151, +223,-2, +81,-265, +87,-30, +32,-212, +-1,243, +112,-77, +-90,126, +27,130, +-61,88, +83,-138, +28,10, +84,4, +-59,-86, +38,191, +170,160, +202,-111, +33,-39, +-87,18, +84,65, +-51,224, +-367,290, +28,172, +292,225, +92,46, +311,40, +-106,-226, +165,77, +81,54, +-51,-253, +-106,-133, +-160,-29, +-134,-193, +34,59, +-36,-52, +-69,141, +-33,-122, +-156,-238, +-194,-50, +-63,257, +205,-60, +-180,-11, +35,35, +81,105, +96,196, +-129,88, +219,-26, +-242,43, +-61,201, +50,-3, +-115,-73, +-120,178, +-233,-104, +14,74, +107,-83, +3,225, +201,163, +128,-143, +67,34, +-168,76, +-161,-52, +-19,22, +48,-202, +-36,-67, +16,163, +39,21, +-241,4, +139,49, +-136,78, +207,191, +-49,-121, +-307,-98, +139,161, +-25,327, +-168,-325, +82,19, +46,-270, +162,-102, +-234,112, +-128,99, +47,11, +-20,-99, +56,23, +36,140, +51,-32, +70,-5, +175,101, +-73,53, +-197,-259, +62,6, +72,52, +164,136, +255,11, +-37,-115, +-176,-118, +-45,11, +105,212, +268,37, +178,250, +-121,-108, +28,33, +93,36, +-38,50, +-103,-29, +-128,10, +168,-3, +126,-86, +-38,-90, +-30,149, +-35,138, +61,2, +-102,-121, +33,271, +-17,83, +172,53, +-48,-70, +90,-24, +264,5, +-125,12, +-88,74, +182,303, +-131,10, +-127,-44, +119,246, +80,46, +-44,-20, +-88,99, +37,-35, +-109,-27, +-111,-124, +99,9, +-202,-41, +-126,26, +-124,6, +-104,-125, +-3,94, +-46,-55, +-280,233, +-87,107, +-36,3, +-57,38, +6,-91, +-59,-38, +72,-37, +-48,-104, +10,-98, +35,-43, +-12,-245, +145,62, +114,-107, +133,21, +-121,171, +108,-131, +-82,-65, +-148,4, +-96,197, +-271,-39, +-152,162, +-276,138, +185,110, +37,-250, +73,73, +-97,-58, +-32,-97, +11,134, +58,-186, +127,-147, +-125,35, +-53,21, +-49,-39, +-9,-91, +99,2, +-114,35, +-267,67, +-111,198, +-179,71, +82,-129, +171,65, +43,85, +216,82, +137,-104, +-18,42, +-50,202, +-108,-5, +2,-82, +96,-142, +-72,-15, +14,-155, +29,138, +81,-48, +46,-148, +84,161, +5,-8, +-211,-80, +128,-154, +-91,-131, +119,138, +-19,90, +17,-129, +-165,123, +-75,92, +-199,-18, +-57,-16, +-134,150, +71,-95, +-106,212, +26,102, +22,-21, +-82,-83, +-242,-14, +-115,-231, +88,97, +109,255, +195,-117, +141,119, +136,26, +35,33, +-92,-33, +-29,10, +-22,-99, +-187,48, +26,-92, +181,-46, +270,34, +138,112, +2,91, +93,202, +80,68, +41,26, +20,-35, +-115,61, +60,-57, +42,120, +-37,-165, +118,41, +111,135, +-89,-85, +97,85, +74,85, +90,42, +-84,-45, +165,90, +-33,-22, +-53,38, +-102,-137, +-34,-50, +267,-60, +12,-62, +29,138, +-9,116, +-124,-52, +140,89, +-197,14, +96,100, +103,-173, +73,71, +-65,20, +11,-67, +-27,-12, +87,26, +108,-50, +28,148, +100,37, +85,2, +49,163, +52,101, +-25,-79, +13,111, +52,-14, +57,59, +181,37, +-50,-31, +270,167, +-101,17, +-4,37, +-115,-109, +124,16, +119,-53, +-34,-47, +-99,-79, +23,-38, +50,158, +-79,-34, +18,15, +4,-77, +193,-106, +-198,-185, +-10,161, +22,48, +32,-74, +63,-51, +155,-109, +105,65, +-14,37, +-101,-146, +-49,73, +36,-217, +109,22, +2,-69, +-243,248, +-123,-15, +24,1, +4,73, +-127,-21, +4,19, +79,126, +-173,57, +154,51, +127,-168, +-22,191, +315,136, +-56,14, +65,-160, +53,28, +-9,73, +43,54, +71,55, +45,165, +-121,72, +12,18, +3,24, +-53,164, +-88,-11, +2,-99, +-51,27, +12,12, +-95,-30, +154,-134, +-165,-77, +-283,-225, +2,27, +12,161, +81,38, +-1,92, +35,-203, +155,94, +142,-143, +95,85, +9,-25, +-80,56, +-49,33, +-132,-53, +39,-302, +136,-41, +-116,98, +116,-148, +76,-57, +239,60, +-183,-132, +86,-22, +-112,47, +-16,-163, +-18,79, +128,243, +-72,66, +108,-126, +66,40, +-43,-19, +73,-13, +-88,263, +28,142, +-182,-153, +41,-16, +102,-160, +-144,88, +2,-30, +-104,-101, +117,10, +-24,-145, +-130,155, +-28,-59, +-57,-109, +-54,-150, +61,101, +100,-112, +-196,47, +72,23, +172,111, +-150,-62, +-31,-103, +-137,-43, +-4,22, +-66,-12, +-113,-191, +160,57, +-6,44, +70,-84, +29,128, +-35,-93, +9,-23, +-196,54, +-90,-72, +-103,-7, +10,117, +8,-87, +-57,37, +-78,-132, +-79,30, +242,-110, +112,-52, +9,-74, +-124,14, +6,62, +56,-94, +15,-74, +-129,111, +30,107, +50,50, +37,27, +74,42, +-27,-38, +-60,21, +55,0, +151,-34, +-28,147, +-27,127, +148,166, +46,11, +-9,59, +-96,76, +24,-81, +-25,118, +2,28, +78,-118, +-170,69, +112,-118, +-115,53, +-21,-87, +35,76, +23,-5, +53,-65, +-36,21, +95,-108, +66,106, +38,122, +262,-30, +42,-15, +2,132, +19,72, +-20,-88, +-4,15, +22,35, +41,47, +20,72, +138,-29, +76,-52, +-69,-45, +-58,89, +19,-18, +33,-83, +-49,-52, +-106,199, +-11,106, +-94,39, +35,-152, +-147,-18, +91,19, +-1,-37, +0,-23, +13,-167, +-38,-79, +-15,-91, +35,48, +-84,-2, +99,11, +-12,127, +-42,-37, +-1,57, +-146,-119, +55,-74, +14,60, +-163,-240, +-12,26, +80,109, +64,-11, +-77,-41, +86,-25, +-95,105, +-9,-51, +-143,-53, +-3,-42, +13,-75, +82,-30, +-211,36, +37,59, +25,-191, +-125,51, +109,4, +-182,-6, +-78,-10, +158,-164, +159,102, +6,-58, +10,8, +-1,79, +-83,14, +39,41, +232,-1, +-9,86, +-49,-114, +-4,30, +-40,-85, +-37,47, +-9,-28, +-45,269, +-62,-78, +15,18, +-19,59, +-179,27, +-134,-68, +110,-86, +-9,-11, +21,-30, +-15,82, +50,132, +-158,69, +92,68, +-121,1, +118,-6, +130,124, +-51,-110, +-81,-163, +-128,-69, +-47,-23, +-65,93, +49,-115, +-13,17, +-60,1, +11,-73, +73,-58, +72,53, +-33,-49, +79,-48, +105,13, +50,74, +17,-16, +84,48, +-18,28, +-75,-42, +-34,150, +160,-9, +34,154, +13,56, +-95,0, +131,51, +59,-81, +-20,41, +43,-36, +14,-78, +-20,68, +73,-90, +38,-175, +109,-3, +-154,103, +29,-8, +-114,-30, +25,-32, +-23,-57, +7,94, +19,116, +-120,7, +-22,34, +85,57, +-3,-109, +-12,11, +-137,-15, +-17,116, +-20,-65, +38,-10, +11,21, +59,6, +-85,-48, +-59,-31, +40,78, +-65,60, +-15,-14, +-18,-122, +70,112, +9,-28, +83,138, +-33,-1, +4,84, +103,28, +-65,-12, +34,13, +63,3, +41,47, +45,54, +42,30, +7,58, +61,36, +-29,40, +-23,32, +1,-53, +6,4, +-24,25, +22,82, +-77,-17, +112,29, +-9,-104, +-3,85, +58,-66, +71,-38, +-12,138, +-61,15, +-24,55, +-30,-51, +-74,-93, +94,63, +-19,15, +-13,23, +39,-23, +57,120, +-25,-21, +62,0, +-3,49, +3,44, +29,6, +-92,15, +87,9, +-9,-12, +-25,-43, +11,56, +83,42, +30,15, +101,48, +56,40, +-12,133, +-18,138, +8,-52, +-74,-41, +34,-33, +-21,-27, +-37,-20, +22,2, +80,59, +-78,100, +84,61, +58,82, +13,29, +-17,-53, +-90,-113, +-12,-54, +-5,37, +68,-28, +23,3, +75,-31, +-32,9, +35,-104, +0,-23, +36,-91, +20,-39, +16,-25, +-18,42, +58,-32, +6,79, +-138,-70, +-36,2, +81,-42, +-46,32, +8,50, +-3,10, +-35,30, +45,-15, +-84,5, +-34,-3, +-44,28, +18,-34, +52,-70, +46,36, +-35,61, +-16,36, +104,98, +-24,27, +-34,11, +34,6, +71,-136, +40,-70, +5,-26, +6,-15, +-32,39, +-41,-17, +46,-70, +-10,12, +-78,4, +-9,44, +-33,6, +18,-27, +-13,-12, +-50,-18, +12,87, +-54,-18, +114,-13, +35,-146, +11,-40, +32,-76, +67,-52, +-97,0, +8,-22, +34,32, +6,-20, +-1,89, +-49,34, +-5,4, +-89,4, +-5,11, +-24,-8, +-49,-12, +1,40, +-4,-54, +-47,-1, +48,14, +48,-86, +9,-53, +88,-31, +-57,-17, +-3,-17, +6,-39, +-11,-83, +0,-10, +-5,-22, +-21,-5, +-57,-42, +49,-6, +-7,3, +-13,-51, +63,54, +25,34, +12,-66, +24,1, +47,19, +73,-17, +-16,-14, +-9,39, +9,61, +-19,-5, +-19,-1, +87,71, +20,-53, +14,2, +-29,8, +55,-1, +42,-30, +-22,13, +-36,29, +11,30, +-4,7, +-9,-78, +17,11, +21,42, +-26,-30, +33,2, +-7,36, +83,68, +17,53, +15,-28, +-28,-55, +-38,11, +3,48, +34,54, +37,34, +-43,-12, +-19,-28, +-23,-27, +38,32, +7,47, +-14,-11, +24,22, +33,11, +-41,2, +-13,-2, +66,-23, +-5,-46, +-36,-11, +0,90, +-104,-49, +24,-20, +14,32, +62,-42, +-23,-10, +-24,-24, +20,-5, +57,66, +-12,-66, +-7,10, +38,-17, +4,1, +-7,3, +-20,3, +-42,-1, +28,-40, +8,-33, +-18,4, +10,46, +8,19, +40,31, +32,0, +-57,4, +45,-21, +-1,-74, +-8,16, +11,3, +29,-49, +15,14, +-6,-21, +21,22, +30,-8, +32,36, +8,-21, +-23,3, +23,1, +17,16, +9,-50, +-48,-28, +-23,-6, +10,-12, +29,-4, +-41,-4, +7,-12, +-20,-35, +-38,-26, +-19,4, +-6,14, +4,1, +-6,39, +-36,-14, +43,67, +20,34, +32,-14, +53,-30, +34,-30, +8,13, +11,3, +-16,-13, +-12,39, +26,35, +23,-11, +-4,6, +-6,4, +2,10, +-13,4, +-1,8, +38,-21, +-6,15, +19,-5, +-3,8, +14,9, +-48,-1, +-2,23, +-17,28, +16,-4, +37,-15, +-22,6, +5,23, +13,-2, +14,-14, +-9,15, +-1,-17, +-21,-3, +4,16, +-24,16, +33,1, +3,1, +15,15, +-3,6, +-8,-3, +25,-5, +1,16, +-2,-9, +21,8, +1,5, +0,3, +-12,0, +-8,-4, +-12,-9, +21,11, +5,11, +-5,1, +-20,-5, +8,-21, +-27,17, +4,-7, +0,-16, +19,-1, +-1,-7, +6,-3, +-8,4, +10,-8, +14,4, +-5,7, +-5,1, +-1,0, +-7,-3, +5,-7, +7,5, +-7,5, +-3,3, +3,2, +-14,-1, +2,5, +10,-4, +-14,-2, +4,14, +-9,1, +-8,10, +5,0, +15,-12, +4,11, +0,4, +9,-1, +0,6, +3,10, +0,6, +-2,2, +6,2, +10,3, +-4,-3, +1,2, +0,0, +-10,4, +2,-5, +2,-2, +-3,-3, +4,-2, +6,-3, +-3,0, +1,-3, +3,-1, +-7,1, +2,-1, +3,-1, +-6,1, +2,0, +2,0, +-6,0, +3,-1, +3,0, +-6,0, +3,0, +3,1, +-6,0, +2,0, +2,0, +-6,-1, +3,1, +2,1, +-7,-1, +3,1, +1,3, +-3,0, +6,3, +4,2, +-3,3, +2,2, +2,5, +-10,-4, +0,0, +1,-2, +-4,3, +10,-3, +6,-2, +-2,-2, +0,-6, +3,-10, +0,-6, +9,1, +0,-4, +4,-11, +15,12, +5,0, +-8,-10, +-9,-1, +4,-14, +-14,2, +10,4, +2,-5, +-14,1, +3,-2, +-3,-3, +-7,-5, +7,-5, +5,7, +-7,3, +-1,0, +-5,-1, +-5,-7, +14,-4, +10,8, +-8,-4, +6,3, +-1,7, +19,1, +0,16, +4,7, +-27,-17, +8,21, +-20,5, +-5,-1, +5,-11, +21,-11, +-12,9, +-8,4, +-12,0, +0,-3, +1,-5, +21,-8, +-2,9, +1,-16, +25,5, +-8,3, +-3,-6, +15,-15, +3,-1, +33,-1, +-24,-16, +4,-16, +-21,3, +-1,17, +-9,-15, +14,14, +13,2, +5,-23, +-22,-6, +37,15, +16,4, +-17,-28, +-2,-23, +-48,1, +14,-9, +-3,-8, +19,5, +-6,-15, +38,21, +-1,-8, +-13,-4, +2,-10, +-6,-4, +-4,-6, +23,11, +26,-35, +-12,-39, +-16,13, +11,-3, +8,-13, +34,30, +53,30, +32,14, +20,-34, +43,-67, +-36,14, +-6,-39, +4,-1, +-6,-14, +-19,-4, +-38,26, +-20,35, +7,12, +-41,4, +29,4, +10,12, +-23,6, +-48,28, +9,50, +17,-16, +23,-1, +-23,-3, +8,21, +32,-36, +30,8, +21,-22, +-6,21, +15,-14, +29,49, +11,-3, +-8,-16, +-1,74, +45,21, +-57,-4, +32,0, +40,-31, +8,-19, +10,-46, +-18,-4, +8,33, +28,40, +-42,1, +-20,-3, +-7,-3, +4,-1, +38,17, +-7,-10, +-12,66, +57,-66, +20,5, +-24,24, +-23,10, +62,42, +14,-32, +24,20, +-104,49, +0,-90, +-36,11, +-5,46, +66,23, +-13,2, +-41,-2, +33,-11, +24,-22, +-14,11, +7,-47, +38,-32, +-23,27, +-19,28, +-43,12, +37,-34, +34,-54, +3,-48, +-38,-11, +-28,55, +15,28, +17,-53, +83,-68, +-7,-36, +33,-2, +-26,30, +21,-42, +17,-11, +-9,78, +-4,-7, +11,-30, +-36,-29, +-22,-13, +42,30, +55,1, +-29,-8, +14,-2, +20,53, +87,-71, +-19,1, +-19,5, +9,-61, +-9,-39, +-16,14, +73,17, +47,-19, +24,-1, +12,66, +25,-34, +63,-54, +-13,51, +-7,-3, +49,6, +-57,42, +-21,5, +-5,22, +0,10, +-11,83, +6,39, +-3,17, +-57,17, +88,31, +9,53, +48,86, +48,-14, +-47,1, +-4,54, +1,-40, +-49,12, +-24,8, +-5,-11, +-89,-4, +-5,-4, +-49,-34, +-1,-89, +6,20, +34,-32, +8,22, +-97,0, +67,52, +32,76, +11,40, +35,146, +114,13, +-54,18, +12,-87, +-50,18, +-13,12, +18,27, +-33,-6, +-9,-44, +-78,-4, +-10,-12, +46,70, +-41,17, +-32,-39, +6,15, +5,26, +40,70, +71,136, +34,-6, +-34,-11, +-24,-27, +104,-98, +-16,-36, +-35,-61, +46,-36, +52,70, +18,34, +-44,-28, +-34,3, +-84,-5, +45,15, +-35,-30, +-3,-10, +8,-50, +-46,-32, +81,42, +-36,-2, +-138,70, +6,-79, +58,32, +-18,-42, +16,25, +20,39, +36,91, +0,23, +35,104, +-32,-9, +75,31, +23,-3, +68,28, +-5,-37, +-12,54, +-90,113, +-17,53, +13,-29, +58,-82, +84,-61, +-78,-100, +80,-59, +22,-2, +-37,20, +-21,27, +34,33, +-74,41, +8,52, +-18,-138, +-12,-133, +56,-40, +101,-48, +30,-15, +83,-42, +11,-56, +-25,43, +-9,12, +87,-9, +-92,-15, +29,-6, +3,-44, +-3,-49, +62,0, +-25,21, +57,-120, +39,23, +-13,-23, +-19,-15, +94,-63, +-74,93, +-30,51, +-24,-55, +-61,-15, +-12,-138, +71,38, +58,66, +-3,-85, +-9,104, +112,-29, +-77,17, +22,-82, +-24,-25, +6,-4, +1,53, +-23,-32, +-29,-40, +61,-36, +7,-58, +42,-30, +45,-54, +41,-47, +63,-3, +34,-13, +-65,12, +103,-28, +4,-84, +-33,1, +83,-138, +9,28, +70,-112, +-18,122, +-15,14, +-65,-60, +40,-78, +-59,31, +-85,48, +59,-6, +11,-21, +38,10, +-20,65, +-17,-116, +-137,15, +-12,-11, +-3,109, +85,-57, +-22,-34, +-120,-7, +19,-116, +7,-94, +-23,57, +25,32, +-114,30, +29,8, +-154,-103, +109,3, +38,175, +73,90, +-20,-68, +14,78, +43,36, +-20,-41, +59,81, +131,-51, +-95,0, +13,-56, +34,-154, +160,9, +-34,-150, +-75,42, +-18,-28, +84,-48, +17,16, +50,-74, +105,-13, +79,48, +-33,49, +72,-53, +73,58, +11,73, +-60,-1, +-13,-17, +49,115, +-65,-93, +-47,23, +-128,69, +-81,163, +-51,110, +130,-124, +118,6, +-121,-1, +92,-68, +-158,-69, +50,-132, +-15,-82, +21,30, +-9,11, +110,86, +-134,68, +-179,-27, +-19,-59, +15,-18, +-62,78, +-45,-269, +-9,28, +-37,-47, +-40,85, +-4,-30, +-49,114, +-9,-86, +232,1, +39,-41, +-83,-14, +-1,-79, +10,-8, +6,58, +159,-102, +158,164, +-78,10, +-182,6, +109,-4, +-125,-51, +25,191, +37,-59, +-211,-36, +82,30, +13,75, +-3,42, +-143,53, +-9,51, +-95,-105, +86,25, +-77,41, +64,11, +80,-109, +-12,-26, +-163,240, +14,-60, +55,74, +-146,119, +-1,-57, +-42,37, +-12,-127, +99,-11, +-84,2, +35,-48, +-15,91, +-38,79, +13,167, +0,23, +-1,37, +91,-19, +-147,18, +35,152, +-94,-39, +-11,-106, +-106,-199, +-49,52, +33,83, +19,18, +-58,-89, +-69,45, +76,52, +138,29, +20,-72, +41,-47, +22,-35, +-4,-15, +-20,88, +19,-72, +2,-132, +42,15, +262,30, +38,-122, +66,-106, +95,108, +-36,-21, +53,65, +23,5, +35,-76, +-21,87, +-115,-53, +112,118, +-170,-69, +78,118, +2,-28, +-25,-118, +24,81, +-96,-76, +-9,-59, +46,-11, +148,-166, +-27,-127, +-28,-147, +151,34, +55,0, +-60,-21, +-27,38, +74,-42, +37,-27, +50,-50, +30,-107, +-129,-111, +15,74, +56,94, +6,-62, +-124,-14, +9,74, +112,52, +242,110, +-79,-30, +-78,132, +-57,-37, +8,87, +10,-117, +-103,7, +-90,72, +-196,-54, +9,23, +-35,93, +29,-128, +70,84, +-6,-44, +160,-57, +-113,191, +-66,12, +-4,-22, +-137,43, +-31,103, +-150,62, +172,-111, +72,-23, +-196,-47, +100,112, +61,-101, +-54,150, +-57,109, +-28,59, +-130,-155, +-24,145, +117,-10, +-104,101, +2,30, +-144,-88, +102,160, +41,16, +-182,153, +28,-142, +-88,-263, +73,13, +-43,19, +66,-40, +108,126, +-72,-66, +128,-243, +-18,-79, +-16,163, +-112,-47, +86,22, +-183,132, +239,-60, +76,57, +116,148, +-116,-98, +136,41, +39,302, +-132,53, +-49,-33, +-80,-56, +9,25, +95,-85, +142,143, +155,-94, +35,203, +-1,-92, +81,-38, +12,-161, +2,-27, +-283,225, +-165,77, +154,134, +-95,30, +12,-12, +-51,-27, +2,99, +-88,11, +-53,-164, +3,-24, +12,-18, +-121,-72, +45,-165, +71,-55, +43,-54, +-9,-73, +53,-28, +65,160, +-56,-14, +315,-136, +-22,-191, +127,168, +154,-51, +-173,-57, +79,-126, +4,-19, +-127,21, +4,-73, +24,-1, +-123,15, +-243,-248, +2,69, +109,-22, +36,217, +-49,-73, +-101,146, +-14,-37, +105,-65, +155,109, +63,51, +32,74, +22,-48, +-10,-161, +-198,185, +193,106, +4,77, +18,-15, +-79,34, +50,-158, +23,38, +-99,79, +-34,47, +119,53, +124,-16, +-115,109, +-4,-37, +-101,-17, +270,-167, +-50,31, +181,-37, +57,-59, +52,14, +13,-111, +-25,79, +52,-101, +49,-163, +85,-2, +100,-37, +28,-148, +108,50, +87,-26, +-27,12, +11,67, +-65,-20, +73,-71, +103,173, +96,-100, +-197,-14, +140,-89, +-124,52, +-9,-116, +29,-138, +12,62, +267,60, +-34,50, +-102,137, +-53,-38, +-33,22, +165,-90, +-84,45, +90,-42, +74,-85, +97,-85, +-89,85, +111,-135, +118,-41, +-37,165, +42,-120, +60,57, +-115,-61, +20,35, +41,-26, +80,-68, +93,-202, +2,-91, +138,-112, +270,-34, +181,46, +26,92, +-187,-48, +-22,99, +-29,-10, +-92,33, +35,-33, +136,-26, +141,-119, +195,117, +109,-255, +88,-97, +-115,231, +-242,14, +-82,83, +22,21, +26,-102, +-106,-212, +71,95, +-134,-150, +-57,16, +-199,18, +-75,-92, +-165,-123, +17,129, +-19,-90, +119,-138, +-91,131, +128,154, +-211,80, +5,8, +84,-161, +46,148, +81,48, +29,-138, +14,155, +-72,15, +96,142, +2,82, +-108,5, +-50,-202, +-18,-42, +137,104, +216,-82, +43,-85, +171,-65, +82,129, +-179,-71, +-111,-198, +-267,-67, +-114,-35, +99,-2, +-9,91, +-49,39, +-53,-21, +-125,-35, +127,147, +58,186, +11,-134, +-32,97, +-97,58, +73,-73, +37,250, +185,-110, +-276,-138, +-152,-162, +-271,39, +-96,-197, +-148,-4, +-82,65, +108,131, +-121,-171, +133,-21, +114,107, +145,-62, +-12,245, +35,43, +10,98, +-48,104, +72,37, +-59,38, +6,91, +-57,-38, +-36,-3, +-87,-107, +-280,-233, +-46,55, +-3,-94, +-104,125, +-124,-6, +-126,-26, +-202,41, +99,-9, +-111,124, +-109,27, +37,35, +-88,-99, +-44,20, +80,-46, +119,-246, +-127,44, +-131,-10, +182,-303, +-88,-74, +-125,-12, +264,-5, +90,24, +-48,70, +172,-53, +-17,-83, +33,-271, +-102,121, +61,-2, +-35,-138, +-30,-149, +-38,90, +126,86, +168,3, +-128,-10, +-103,29, +-38,-50, +93,-36, +28,-33, +-121,108, +178,-250, +268,-37, +105,-212, +-45,-11, +-176,118, +-37,115, +255,-11, +164,-136, +72,-52, +62,-6, +-197,259, +-73,-53, +175,-101, +70,5, +51,32, +36,-140, +56,-23, +-20,99, +47,-11, +-128,-99, +-234,-112, +162,102, +46,270, +82,-19, +-168,325, +-25,-327, +139,-161, +-307,98, +-49,121, +207,-191, +-136,-78, +139,-49, +-241,-4, +39,-21, +16,-163, +-36,67, +48,202, +-19,-22, +-161,52, +-168,-76, +67,-34, +128,143, +201,-163, +3,-225, +107,83, +14,-74, +-233,104, +-120,-178, +-115,73, +50,3, +-61,-201, +-242,-43, +219,26, +-129,-88, +96,-196, +81,-105, +35,-35, +-180,11, +205,60, +-63,-257, +-194,50, +-156,238, +-33,122, +-69,-141, +-36,52, +34,-59, +-134,193, +-160,29, +-106,133, +-51,253, +81,-54, +165,-77, +-106,226, +311,-40, +92,-46, +292,-225, +28,-172, +-367,-290, +-51,-224, +84,-65, +-87,-18, +33,39, +202,111, +170,-160, +38,-191, +-59,86, +84,-4, +28,-10, +83,138, +-61,-88, +27,-130, +-90,-126, +112,77, +-1,-243, +32,212, +87,30, +81,265, +223,2, +28,-151, +-208,-116, +120,-57, +168,172, +-88,-231, +17,-67, +-20,68, +-22,64, +-99,-6, +169,285, +140,-199, +-24,93, +45,-273, +107,-62, +66,105, +-55,-71, +43,-105, +-11,-66, +119,-3, +-84,-118, +108,-139, +79,146, +-84,-14, +-37,190, +21,50, +-56,-154, +219,-163, +84,255, +-310,-48, +87,203, +-48,44, +-28,168, +-91,-195, +-143,-12, +-21,-222, +5,126, +-66,11, +8,-162, +-15,-91, +96,10, +44,23, +-32,122, +-37,30, +-48,-116, +-16,-4, +176,52, +1,-34, +-37,144, +153,63, +-83,-34, +-22,19, +121,-69, +-45,207, +307,20, +82,209, +-120,-110, +35,-291, +-22,-95, +210,-86, +18,-52, +42,-154, +286,-14, +189,42, +0,4, +95,-240, +45,-91, +-34,-77, +-111,4, +238,149, +-82,112, +-41,78, +-157,-52, +-92,-6, +-193,-178, +23,-132, +-142,-42, +-139,-61, +-2,114, +-29,8, +-64,23, +20,35, +-22,49, +77,45, +21,158, +-74,68, +-19,-74, +-253,-61, +6,0, +196,-161, +-119,-111, +52,-90, +67,110, +230,98, +-158,68, +158,-50, +-150,39, +-135,-33, +-76,3, +-6,-12, +-30,20, +97,76, +-96,40, +141,1, +-95,-148, +114,-147, +235,77, +22,177, +-62,-85, +-180,-19, +171,-21, +-73,-7, +162,-5, +78,-215, +-116,290, +-126,148, +-151,73, +145,-62, +-23,50, +-32,-167, +60,-18, +137,88, +-113,-76, +30,40, +128,-53, +-67,-28, +-149,100, +138,102, +2,-42, +24,-24, +131,14, +71,-21, +8,148, +37,-89, +-133,-49, +150,144, +302,-119, +140,-19, +-73,80, +22,11, +58,37, +-62,-60, +-102,-351, +49,100, +-184,-100, +74,212, +183,-135, +-61,-18, +-130,281, +99,133, +13,-125, +-22,153, +-107,-122, +70,-126, +-251,-26, +-94,33, +19,-36, +-91,-4, +-130,-82, +67,88, +23,13, +84,43, +-99,-70, +-45,91, +92,-120, +134,91, +135,58, +-4,-5, +-175,-13, +-68,31, +7,293, +-78,232, +195,159, +16,-33, +70,233, +174,197, +-49,-51, +99,-4, +156,7, +162,153, +140,170, +13,118, +-255,13, +-10,-5, +102,-40, +-74,-120, +8,34, +-226,0, +102,-87, +193,-56, +47,-27, +-5,-276, +-13,65, +-10,-56, +22,163, +-97,81, +214,-109, +163,8, +150,21, +-223,34, +170,171, +-108,206, +135,4, +-198,3, +259,95, +210,-199, +175,-105, +50,139, +-61,-44, +180,-71, +-27,387, +47,11, +-48,177, +238,5, +-256,130, +-122,-96, +-34,-26, +-279,129, +-120,12, +195,-140, +-100,-190, +-134,-44, +-4,294, +-1,50, +-212,110, +199,70, +-107,82, +-169,174, +-144,136, +-44,-97, +-194,179, +-15,47, +29,-114, +22,-100, +-183,9, +222,-66, +54,-289, +-23,-153, +-21,76, +-121,-36, +88,24, +195,-10, +-189,-166, +89,42, +91,55, +224,-89, +-84,123, +-232,-23, +-20,110, +-67,157, +49,95, +-130,45, +80,-204, +-70,-70, +168,-102, +217,-108, +62,-126, +6,51, +-100,45, +16,10, +-70,103, +-85,-125, +150,1, +150,-85, +-155,135, +119,50, +39,-18, +-243,47, +-69,-16, +-98,-96, +-161,-102, +-209,-115, +-6,246, +-58,-137, +211,179, +-32,177, +40,52, +210,1, +-90,-142, +107,-57, +62,89, +99,-48, +-110,207, +-27,-185, +104,41, +-89,163, +149,189, +-21,101, +-94,135, +118,214, +-82,-161, +211,-26, +-240,261, +-21,-42, +185,-204, +40,53, +-13,-49, +-175,203, +-37,99, +-9,-90, +155,135, +170,-112, +88,165, +-174,-18, +112,2, +84,-133, +5,-227, +-66,17, +151,-38, +-149,-80, +154,-131, +19,-136, +-54,100, +-375,72, +172,74, +-22,135, +-121,-37, +-50,-8, +-88,-197, +89,-109, +-223,-1, +-140,-50, +-116,-215, +93,41, +-78,67, +-105,-19, +87,-186, +-124,-215, +-60,-32, +-169,-96, +-71,120, +174,-11, +-65,-111, +168,37, +-85,56, +18,-20, +286,-133, +174,-156, +29,-112, +199,23, +11,74, +-105,-104, +188,33, +-135,-129, +112,-154, +-215,75, +34,-62, +38,3, +-62,-121, +38,-60, +98,134, +-14,16, +-147,-57, +-122,-7, +-90,112, +247,59, +-80,191, +-49,47, +-254,35, +65,7, +-257,-9, +61,-24, +30,-13, +22,70, +63,-294, +-17,146, +-10,90, +15,107, +186,191, +48,176, +11,-42, +32,-7, +-80,-46, +34,-6, +128,48, +-150,-37, +249,-24, +31,-17, +-4,62, +-148,-164, +45,75, +70,125, +-151,-46, +156,-112, +-176,-112, +59,117, +-57,39, +-37,-103, +117,-152, +132,-127, +-123,-125, +17,137, +178,117, +68,120, +-218,34, +179,296, +-54,-44, +103,57, +71,24, +96,70, +167,30, +117,26, +-158,19, +-15,-94, +-78,110, +-11,-56, +-158,-111, +47,286, +-16,-75, +-31,-168, +-88,-22, +76,361, +-62,91, +-40,-258, +75,37, +-124,-81, +-98,6, +-80,-28, +82,110, +277,125, +-42,-71, +-175,134, +122,-46, +-106,-70, +-46,43, +-122,84, +-69,107, +-13,-46, +-49,73, +-142,136, +114,-108, +-5,-31, +37,53, +-193,44, +-342,-32, +73,-111, +-137,-118, +93,46, +70,155, +1,-119, +-205,-33, +96,-114, +-38,22, +-38,134, +-123,231, +-123,15, +-93,78, +120,-96, +130,-41, +14,72, +-247,-192, +-51,85, +-22,-35, +-33,146, +-99,63, +64,-113, +56,112, +111,52, +-82,106, +104,-180, +184,-65, +5,-37, +181,223, +-138,-26, +-22,303, +-61,-83, +2,6, +42,-72, +-123,-210, +-82,23, +77,37, +-10,81, +-163,102, +-90,189, +21,-105, +-294,2, +186,-115, +83,144, +-75,158, +75,190, +-32,-21, +47,-19, +26,-27, +-25,-155, +-172,-118, +50,-171, +170,-129, +65,-69, +-9,-16, +31,28, +-74,-174, +-219,-41, +87,61, +-5,121, +3,-104, +-71,99, +-102,171, +-59,39, +90,-33, +77,-23, +-20,33, +11,149, +15,120, +-18,22, +-122,-40, +10,104, +-105,-25, +5,-171, +9,-49, +-49,59, +0,15, +104,-102, +79,196, +-24,8, +87,163, +107,211, +173,-51, +152,236, +-6,-190, +26,80, +62,103, +114,21, +65,7, +39,75, +-57,-6, +6,71, +65,80, +-3,-24, +-29,108, +-29,138, +-105,-131, +15,-37, +-33,27, +57,-36, +100,-15, +75,131, +57,69, +-75,-47, +115,-235, +210,-13, +-84,88, +-113,-34, +-189,-82, +-57,331, +-22,94, +18,38, +142,134, +62,-107, +180,22, +108,-127, +-162,3, +11,149, +51,-74, +56,-6, +94,-11, +-34,-134, +-29,6, +93,-29, +2,3, +127,-63, +169,-41, +-20,113, +-71,96, +-48,16, +-41,83, +-127,-174, +170,21, +-132,-21, +48,26, +116,-13, +-18,-123, +-32,22, +53,12, +44,41, +81,-83, +31,-28, +-13,0, +-40,21, +-144,-157, +-21,11, +105,59, +17,-90, +121,-90, +-5,-127, +-79,39, +-146,186, +-18,43, +11,14, +8,-20, +-18,26, +77,76, +-7,-92, +90,-9, +-35,-48, +54,-93, +38,-84, +31,-6, +-39,-48, +55,134, +-135,28, +67,-6, +97,47, +-26,-140, +103,76, +-76,16, +-97,11, +-51,37, +-44,65, +-81,-65, +28,130, +-32,6, +72,-9, +7,13, +-64,35, +129,-72, +119,-83, +43,-112, +-71,26, +-167,54, +-10,115, +28,-4, +-28,23, +-55,-83, +-85,-148, +79,75, +-62,38, +-65,-26, +15,153, +72,15, +-78,-99, +-11,90, +-72,73, +10,-65, +73,104, +-128,-85, +6,44, +-63,-88, +96,-48, +69,-70, +63,27, +20,102, +-90,105, +-18,80, +58,-23, +-114,32, +-12,2, +-48,-9, +-58,119, +60,60, +-2,-98, +59,-3, +-39,10, +-165,138, +130,149, +-38,5, +39,88, +213,-20, +80,-108, +88,-65, +-83,-191, +47,12, +18,123, +-157,103, +-145,-22, +170,-28, +58,135, +-46,48, +35,17, +7,55, +-103,-85, +16,-14, +26,-46, +77,-40, +64,26, +-12,40, +52,-9, +79,-14, +-32,1, +28,71, +66,74, +40,71, +-17,-16, +92,38, +-149,86, +242,135, +50,114, +47,16, +194,28, +-34,34, +29,83, +-19,7, +45,-42, +-46,13, +-110,-18, +-21,-26, +47,-74, +22,0, +-31,-81, +112,38, +105,18, +23,-37, +-18,65, +-25,78, +36,-62, +120,-72, +49,-18, +-11,-63, +-6,78, +135,-20, +-91,-84, +-91,-107, +-6,54, +28,-8, +-92,16, +-74,165, +-83,-4, +-161,-105, +-32,-17, +-44,34, +-49,-32, +53,91, +71,-65, +148,0, +49,116, +17,-35, +-142,-2, +78,-137, +30,1, +91,-95, +66,-45, +42,67, +-67,-42, +-24,-92, +-111,9, +-53,41, +128,-54, +-45,-76, +199,58, +5,-70, +49,155, +-95,62, +-42,20, +-34,52, +142,-32, +-23,98, +-5,16, +11,-48, +67,-49, +73,36, +-107,-93, +62,-93, +-87,-44, +1,123, +20,43, +-79,-41, +111,-81, +102,-62, +75,-65, +8,57, +-10,-45, +-124,-26, +34,-67, +33,87, +30,-4, +-46,27, +-79,-111, +-30,-51, +44,-189, +35,-19, +-58,133, +-2,-90, +30,14, +53,-31, +5,-65, +4,5, +104,-41, +-8,-134, +-47,81, +27,-41, +-13,-61, +59,9, +-4,91, +78,93, +32,-48, +-90,-95, +61,-2, +-69,-20, +-81,8, +22,-18, +187,-16, +38,29, +-185,-84, +83,33, +38,5, +6,-57, +-27,-66, +1,57, +24,-116, +-45,-8, +37,46, +19,55, +14,80, +54,57, +-40,-36, +75,106, +43,-41, +110,-14, +-1,-19, +94,119, +40,-14, +-28,-40, +-97,55, +-57,55, +-47,-18, +10,5, +44,-57, +-6,47, +-120,-72, +21,47, +72,-31, +-27,25, +2,-24, +-31,-86, +21,125, +-25,-5, +3,42, +-5,-15, +11,36, +-1,-12, +-54,-27, +29,29, +66,35, +70,43, +61,56, +81,-44, +-42,17, +11,16, +-88,9, +51,40, +-6,-39, +-33,-5, +22,-105, +10,20, +33,-131, +44,49, +83,38, +2,23, +11,-101, +-14,-40, +3,-1, +32,24, +17,22, +-69,-8, +-38,-8, +65,2, +-63,-5, +-23,-109, +-19,123, +-67,-57, +32,2, +0,44, +-3,8, +-22,57, +-69,80, +-65,69, +0,37, +38,-4, +-20,-30, +-17,101, +3,-35, +-1,10, +30,-33, +-70,-99, +-53,31, +-72,-16, +-26,-29, +54,-11, +-18,3, +-48,-5, +-44,-100, +11,-21, +-44,-41, +-61,37, +-36,-60, +41,-51, +-4,49, +50,-29, +46,-35, +-16,-108, +1,80, +-65,-10, +-48,12, +28,-11, +-34,33, +-54,-39, +-53,55, +-10,16, +29,-29, +-14,-11, +64,99, +-62,25, +41,6, +30,-16, +4,-40, +75,-48, +-50,70, +-53,23, +18,-24, +44,4, +4,-57, +-24,97, +18,-41, +86,-16, +14,32, +49,-15, +81,27, +-32,0, +4,2, +-13,-27, +65,5, +-32,64, +0,-32, +-14,43, +-50,13, +51,20, +63,28, +-11,-4, +56,48, +-23,-42, +32,-46, +-54,-51, +-33,-11, +15,-53, +-3,-34, +0,-1, +23,9, +14,7, +15,-5, +-48,58, +16,-7, +-12,-46, +22,12, +16,-1, +-5,-47, +-12,56, +-43,52, +-17,9, +-32,39, +-27,-34, +-25,5, +57,-14, +30,11, +5,-40, +43,-26, +-22,-29, +12,26, +10,83, +-11,-49, +-12,10, +-19,22, +1,16, +12,-8, +-6,-23, +-21,-3, +-65,31, +-31,12, +23,9, +-35,-44, +-32,41, +38,-17, +0,-46, +15,-7, +11,-18, +36,-73, +29,28, +13,-5, +4,-13, +49,-17, +20,12, +18,-46, +-45,3, +-39,22, +16,-23, +18,-42, +-6,-20, +-9,-31, +5,-15, +39,-9, +-22,48, +67,-35, +19,22, +14,15, +-6,7, +8,-8, +-9,38, +-28,55, +-5,4, +19,25, +-2,-42, +26,42, +42,-22, +3,4, +0,-10, +1,57, +-7,13, +0,3, +25,-12, +21,10, +-41,-5, +6,-8, +-31,20, +-11,23, +3,5, +-8,-3, +-6,-41, +4,21, +-21,8, +-2,-19, +15,-10, +6,-16, +25,19, +26,35, +3,16, +-16,1, +13,20, +17,-1, +21,15, +21,20, +-5,-7, +43,18, +36,-10, +4,-15, +-9,-8, +11,-9, +4,14, +-4,25, +15,3, +-19,-6, +9,-1, +2,-6, +1,17, +1,-1, +10,-12, +-19,-8, +2,1, +11,-14, +-13,-13, +-15,-11, +9,9, +-14,-18, +8,10, +11,8, +14,-14, +8,-4, +-5,19, +-9,0, +30,-6, +-26,-6, +-9,1, +-10,-11, +-1,6, +7,4, +3,-9, +-5,12, +1,26, +-1,2, +4,0, +-4,-4, +-1,2, +12,7, +-7,6, +-3,0, +5,6, +-1,1, +6,-3, +4,-5, +-6,6, +-3,2, +8,-3, +-6,2, +0,8, +2,-5, +-10,1, +5,3, +2,-1, +5,-12, +6,0, +5,4, +-14,0, +6,7, +4,-3, +-12,1, +5,-6, +6,3, +-4,5, +0,2, +-1,1, +-6,-2, +5,4, +3,-3, +-5,1, +3,1, +2,-2, +-5,-2, +3,1, +3,-2, +-5,2, +4,0, +3,1, +-6,0, +2,0, +3,0, +-6,0, +3,0, +2,0, +-6,0, +3,-1, +4,0, +-5,-2, +3,2, +3,-1, +-5,2, +2,2, +3,-1, +-5,-1, +3,3, +5,-4, +-6,2, +-1,-1, +0,-2, +-4,-5, +6,-3, +5,6, +-12,-1, +4,3, +6,-7, +-14,0, +5,-4, +6,0, +5,12, +2,1, +5,-3, +-10,-1, +2,5, +0,-8, +-6,-2, +8,3, +-3,-2, +-6,-6, +4,5, +6,3, +-1,-1, +5,-6, +-3,0, +-7,-6, +12,-7, +-1,-2, +-4,4, +4,0, +-1,-2, +1,-26, +-5,-12, +3,9, +7,-4, +-1,-6, +-10,11, +-9,-1, +-26,6, +30,6, +-9,0, +-5,-19, +8,4, +14,14, +11,-8, +8,-10, +-14,18, +9,-9, +-15,11, +-13,13, +11,14, +2,-1, +-19,8, +10,12, +1,1, +1,-17, +2,6, +9,1, +-19,6, +15,-3, +-4,-25, +4,-14, +11,9, +-9,8, +4,15, +36,10, +43,-18, +-5,7, +21,-20, +21,-15, +17,1, +13,-20, +-16,-1, +3,-16, +26,-35, +25,-19, +6,16, +15,10, +-2,19, +-21,-8, +4,-21, +-6,41, +-8,3, +3,-5, +-11,-23, +-31,-20, +6,8, +-41,5, +21,-10, +25,12, +0,-3, +-7,-13, +1,-57, +0,10, +3,-4, +42,22, +26,-42, +-2,42, +19,-25, +-5,-4, +-28,-55, +-9,-38, +8,8, +-6,-7, +14,-15, +19,-22, +67,35, +-22,-48, +39,9, +5,15, +-9,31, +-6,20, +18,42, +16,23, +-39,-22, +-45,-3, +18,46, +20,-12, +49,17, +4,13, +13,5, +29,-28, +36,73, +11,18, +15,7, +0,46, +38,17, +-32,-41, +-35,44, +23,-9, +-31,-12, +-65,-31, +-21,3, +-6,23, +12,8, +1,-16, +-19,-22, +-12,-10, +-11,49, +10,-83, +12,-26, +-22,29, +43,26, +5,40, +30,-11, +57,14, +-25,-5, +-27,34, +-32,-39, +-17,-9, +-43,-52, +-12,-56, +-5,47, +16,1, +22,-12, +-12,46, +16,7, +-48,-58, +15,5, +14,-7, +23,-9, +0,1, +-3,34, +15,53, +-33,11, +-54,51, +32,46, +-23,42, +56,-48, +-11,4, +63,-28, +51,-20, +-50,-13, +-14,-43, +0,32, +-32,-64, +65,-5, +-13,27, +4,-2, +-32,0, +81,-27, +49,15, +14,-32, +86,16, +18,41, +-24,-97, +4,57, +44,-4, +18,24, +-53,-23, +-50,-70, +75,48, +4,40, +30,16, +41,-6, +-62,-25, +64,-99, +-14,11, +29,29, +-10,-16, +-53,-55, +-54,39, +-34,-33, +28,11, +-48,-12, +-65,10, +1,-80, +-16,108, +46,35, +50,29, +-4,-49, +41,51, +-36,60, +-61,-37, +-44,41, +11,21, +-44,100, +-48,5, +-18,-3, +54,11, +-26,29, +-72,16, +-53,-31, +-70,99, +30,33, +-1,-10, +3,35, +-17,-101, +-20,30, +38,4, +0,-37, +-65,-69, +-69,-80, +-22,-57, +-3,-8, +0,-44, +32,-2, +-67,57, +-19,-123, +-23,109, +-63,5, +65,-2, +-38,8, +-69,8, +17,-22, +32,-24, +3,1, +-14,40, +11,101, +2,-23, +83,-38, +44,-49, +33,131, +10,-20, +22,105, +-33,5, +-6,39, +51,-40, +-88,-9, +11,-16, +-42,-17, +81,44, +61,-56, +70,-43, +66,-35, +29,-29, +-54,27, +-1,12, +11,-36, +-5,15, +3,-42, +-25,5, +21,-125, +-31,86, +2,24, +-27,-25, +72,31, +21,-47, +-120,72, +-6,-47, +44,57, +10,-5, +-47,18, +-57,-55, +-97,-55, +-28,40, +40,14, +94,-119, +-1,19, +110,14, +43,41, +75,-106, +-40,36, +54,-57, +14,-80, +19,-55, +37,-46, +-45,8, +24,116, +1,-57, +-27,66, +6,57, +38,-5, +83,-33, +-185,84, +38,-29, +187,16, +22,18, +-81,-8, +-69,20, +61,2, +-90,95, +32,48, +78,-93, +-4,-91, +59,-9, +-13,61, +27,41, +-47,-81, +-8,134, +104,41, +4,-5, +5,65, +53,31, +30,-14, +-2,90, +-58,-133, +35,19, +44,189, +-30,51, +-79,111, +-46,-27, +30,4, +33,-87, +34,67, +-124,26, +-10,45, +8,-57, +75,65, +102,62, +111,81, +-79,41, +20,-43, +1,-123, +-87,44, +62,93, +-107,93, +73,-36, +67,49, +11,48, +-5,-16, +-23,-98, +142,32, +-34,-52, +-42,-20, +-95,-62, +49,-155, +5,70, +199,-58, +-45,76, +128,54, +-53,-41, +-111,-9, +-24,92, +-67,42, +42,-67, +66,45, +91,95, +30,-1, +78,137, +-142,2, +17,35, +49,-116, +148,0, +71,65, +53,-91, +-49,32, +-44,-34, +-32,17, +-161,105, +-83,4, +-74,-165, +-92,-16, +28,8, +-6,-54, +-91,107, +-91,84, +135,20, +-6,-78, +-11,63, +49,18, +120,72, +36,62, +-25,-78, +-18,-65, +23,37, +105,-18, +112,-38, +-31,81, +22,0, +47,74, +-21,26, +-110,18, +-46,-13, +45,42, +-19,-7, +29,-83, +-34,-34, +194,-28, +47,-16, +50,-114, +242,-135, +-149,-86, +92,-38, +-17,16, +40,-71, +66,-74, +28,-71, +-32,-1, +79,14, +52,9, +-12,-40, +64,-26, +77,40, +26,46, +16,14, +-103,85, +7,-55, +35,-17, +-46,-48, +58,-135, +170,28, +-145,22, +-157,-103, +18,-123, +47,-12, +-83,191, +88,65, +80,108, +213,20, +39,-88, +-38,-5, +130,-149, +-165,-138, +-39,-10, +59,3, +-2,98, +60,-60, +-58,-119, +-48,9, +-12,-2, +-114,-32, +58,23, +-18,-80, +-90,-105, +20,-102, +63,-27, +69,70, +96,48, +-63,88, +6,-44, +-128,85, +73,-104, +10,65, +-72,-73, +-11,-90, +-78,99, +72,-15, +15,-153, +-65,26, +-62,-38, +79,-75, +-85,148, +-55,83, +-28,-23, +28,4, +-10,-115, +-167,-54, +-71,-26, +43,112, +119,83, +129,72, +-64,-35, +7,-13, +72,9, +-32,-6, +28,-130, +-81,65, +-44,-65, +-51,-37, +-97,-11, +-76,-16, +103,-76, +-26,140, +97,-47, +67,6, +-135,-28, +55,-134, +-39,48, +31,6, +38,84, +54,93, +-35,48, +90,9, +-7,92, +77,-76, +-18,-26, +8,20, +11,-14, +-18,-43, +-146,-186, +-79,-39, +-5,127, +121,90, +17,90, +105,-59, +-21,-11, +-144,157, +-40,-21, +-13,0, +31,28, +81,83, +44,-41, +53,-12, +-32,-22, +-18,123, +116,13, +48,-26, +-132,21, +170,-21, +-127,174, +-41,-83, +-48,-16, +-71,-96, +-20,-113, +169,41, +127,63, +2,-3, +93,29, +-29,-6, +-34,134, +94,11, +56,6, +51,74, +11,-149, +-162,-3, +108,127, +180,-22, +62,107, +142,-134, +18,-38, +-22,-94, +-57,-331, +-189,82, +-113,34, +-84,-88, +210,13, +115,235, +-75,47, +57,-69, +75,-131, +100,15, +57,36, +-33,-27, +15,37, +-105,131, +-29,-138, +-29,-108, +-3,24, +65,-80, +6,-71, +-57,6, +39,-75, +65,-7, +114,-21, +62,-103, +26,-80, +-6,190, +152,-236, +173,51, +107,-211, +87,-163, +-24,-8, +79,-196, +104,102, +0,-15, +-49,-59, +9,49, +5,171, +-105,25, +10,-104, +-122,40, +-18,-22, +15,-120, +11,-149, +-20,-33, +77,23, +90,33, +-59,-39, +-102,-171, +-71,-99, +3,104, +-5,-121, +87,-61, +-219,41, +-74,174, +31,-28, +-9,16, +65,69, +170,129, +50,171, +-172,118, +-25,155, +26,27, +47,19, +-32,21, +75,-190, +-75,-158, +83,-144, +186,115, +-294,-2, +21,105, +-90,-189, +-163,-102, +-10,-81, +77,-37, +-82,-23, +-123,210, +42,72, +2,-6, +-61,83, +-22,-303, +-138,26, +181,-223, +5,37, +184,65, +104,180, +-82,-106, +111,-52, +56,-112, +64,113, +-99,-63, +-33,-146, +-22,35, +-51,-85, +-247,192, +14,-72, +130,41, +120,96, +-93,-78, +-123,-15, +-123,-231, +-38,-134, +-38,-22, +96,114, +-205,33, +1,119, +70,-155, +93,-46, +-137,118, +73,111, +-342,32, +-193,-44, +37,-53, +-5,31, +114,108, +-142,-136, +-49,-73, +-13,46, +-69,-107, +-122,-84, +-46,-43, +-106,70, +122,46, +-175,-134, +-42,71, +277,-125, +82,-110, +-80,28, +-98,-6, +-124,81, +75,-37, +-40,258, +-62,-91, +76,-361, +-88,22, +-31,168, +-16,75, +47,-286, +-158,111, +-11,56, +-78,-110, +-15,94, +-158,-19, +117,-26, +167,-30, +96,-70, +71,-24, +103,-57, +-54,44, +179,-296, +-218,-34, +68,-120, +178,-117, +17,-137, +-123,125, +132,127, +117,152, +-37,103, +-57,-39, +59,-117, +-176,112, +156,112, +-151,46, +70,-125, +45,-75, +-148,164, +-4,-62, +31,17, +249,24, +-150,37, +128,-48, +34,6, +-80,46, +32,7, +11,42, +48,-176, +186,-191, +15,-107, +-10,-90, +-17,-146, +63,294, +22,-70, +30,13, +61,24, +-257,9, +65,-7, +-254,-35, +-49,-47, +-80,-191, +247,-59, +-90,-112, +-122,7, +-147,57, +-14,-16, +98,-134, +38,60, +-62,121, +38,-3, +34,62, +-215,-75, +112,154, +-135,129, +188,-33, +-105,104, +11,-74, +199,-23, +29,112, +174,156, +286,133, +18,20, +-85,-56, +168,-37, +-65,111, +174,11, +-71,-120, +-169,96, +-60,32, +-124,215, +87,186, +-105,19, +-78,-67, +93,-41, +-116,215, +-140,50, +-223,1, +89,109, +-88,197, +-50,8, +-121,37, +-22,-135, +172,-74, +-375,-72, +-54,-100, +19,136, +154,131, +-149,80, +151,38, +-66,-17, +5,227, +84,133, +112,-2, +-174,18, +88,-165, +170,112, +155,-135, +-9,90, +-37,-99, +-175,-203, +-13,49, +40,-53, +185,204, +-21,42, +-240,-261, +211,26, +-82,161, +118,-214, +-94,-135, +-21,-101, +149,-189, +-89,-163, +104,-41, +-27,185, +-110,-207, +99,48, +62,-89, +107,57, +-90,142, +210,-1, +40,-52, +-32,-177, +211,-179, +-58,137, +-6,-246, +-209,115, +-161,102, +-98,96, +-69,16, +-243,-47, +39,18, +119,-50, +-155,-135, +150,85, +150,-1, +-85,125, +-70,-103, +16,-10, +-100,-45, +6,-51, +62,126, +217,108, +168,102, +-70,70, +80,204, +-130,-45, +49,-95, +-67,-157, +-20,-110, +-232,23, +-84,-123, +224,89, +91,-55, +89,-42, +-189,166, +195,10, +88,-24, +-121,36, +-21,-76, +-23,153, +54,289, +222,66, +-183,-9, +22,100, +29,114, +-15,-47, +-194,-179, +-44,97, +-144,-136, +-169,-174, +-107,-82, +199,-70, +-212,-110, +-1,-50, +-4,-294, +-134,44, +-100,190, +195,140, +-120,-12, +-279,-129, +-34,26, +-122,96, +-256,-130, +238,-5, +-48,-177, +47,-11, +-27,-387, +180,71, +-61,44, +50,-139, +175,105, +210,199, +259,-95, +-198,-3, +135,-4, +-108,-206, +170,-171, +-223,-34, +150,-21, +163,-8, +214,109, +-97,-81, +22,-163, +-10,56, +-13,-65, +-5,276, +47,27, +193,56, +102,87, +-226,0, +8,-34, +-74,120, +102,40, +-10,5, +-255,-13, +13,-118, +140,-170, +162,-153, +156,-7, +99,4, +-49,51, +174,-197, +70,-233, +16,33, +195,-159, +-78,-232, +7,-293, +-68,-31, +-175,13, +-4,5, +135,-58, +134,-91, +92,120, +-45,-91, +-99,70, +84,-43, +23,-13, +67,-88, +-130,82, +-91,4, +19,36, +-94,-33, +-251,26, +70,126, +-107,122, +-22,-153, +13,125, +99,-133, +-130,-281, +-61,18, +183,135, +74,-212, +-184,100, +49,-100, +-102,351, +-62,60, +58,-37, +22,-11, +-73,-80, +140,19, +302,119, +150,-144, +-133,49, +37,89, +8,-148, +71,21, +131,-14, +24,24, +2,42, +138,-102, +-149,-100, +-67,28, +128,53, +30,-40, +-113,76, +137,-88, +60,18, +-32,167, +-23,-50, +145,62, +-151,-73, +-126,-148, +-116,-290, +78,215, +162,5, +-73,7, +171,21, +-180,19, +-62,85, +22,-177, +235,-77, +114,147, +-95,148, +141,-1, +-96,-40, +97,-76, +-30,-20, +-6,12, +-76,-3, +-135,33, +-150,-39, +158,50, +-158,-68, +230,-98, +67,-110, +52,90, +-119,111, +196,161, +0,0, +81,22, +-33,207, +179,-47, +-109,18, +45,-18, +0,158, +-32,50, +-194,65, +-93,86, +-343,-132, +126,-125, +10,-94, +93,76, +-122,56, +-215,-138, +28,186, +100,51, +72,-7, +101,-193, +13,-183, +35,89, +-13,25, +238,425, +-16,46, +-128,-216, +207,35, +27,-94, +-92,-141, +73,-44, +75,93, +223,74, +-15,-30, +-98,5, +-113,-63, +182,-80, +-34,-19, +-126,-76, +19,-118, +-107,-17, +70,-67, +59,55, +7,74, +-43,-83, +22,10, +-105,273, +38,54, +-15,-142, +-298,116, +262,-278, +-86,106, +17,-17, +44,10, +-67,184, +-17,-194, +-92,15, +153,125, +-5,-36, +66,79, +-74,177, +-189,-181, +96,47, +-50,-62, +-144,74, +-72,-45, +55,9, +-45,110, +-160,162, +129,54, +107,-127, +290,86, +-125,131, +-20,31, +92,166, +-84,9, +-165,-7, +-45,-46, +7,-26, +-270,-304, +-32,96, +136,81, +-178,-146, +249,-47, +-57,-8, +-7,258, +11,-60, +94,29, +108,-182, +32,-190, +-93,232, +-70,-67, +-233,-162, +-176,-96, +-242,30, +-45,-28, +-161,-119, +130,72, +70,71, +144,-287, +-11,36, +-118,-201, +-82,-80, +-201,-8, +206,-101, +126,-241, +1,5, +-72,66, +-172,55, +-285,207, +198,62, +123,-1, +143,200, +14,-117, +41,28, +263,176, +-16,-125, +-235,-130, +-110,-186, +157,363, +-197,42, +244,-24, +-12,42, +-122,138, +-176,210, +0,133, +87,-105, +-205,-172, +-11,30, +92,74, +120,-129, +97,6, +37,145, +-77,-92, +-84,-19, +58,-78, +-4,-149, +-73,-28, +64,-81, +53,-13, +-5,-153, +200,-28, +-184,-92, +-78,-68, +85,284, +16,99, +-33,82, +4,233, +19,173, +-146,-204, +33,208, +116,-42, +59,52, +-164,100, +122,4, +-12,69, +134,-106, +12,-157, +71,19, +37,-198, +26,-25, +23,173, +121,-34, +-73,-125, +25,48, +190,11, +102,-52, +-37,-4, +-15,-48, +147,39, +-160,91, +0,193, +-85,-172, +229,109, +236,-34, +86,194, +-122,95, +47,27, +-29,49, +-28,-115, +-44,-22, +-82,-94, +25,126, +111,-152, +-72,-69, +-16,-190, +188,154, +117,173, +-194,-312, +-99,-161, +31,82, +-186,63, +-144,12, +-80,25, +121,11, +-46,58, +111,99, +59,-45, +62,-215, +-273,-72, +321,-194, +34,-136, +257,-61, +54,71, +86,87, +-38,135, +-88,86, +-48,39, +197,-29, +143,-111, +-24,242, +-53,-108, +-78,-199, +-164,151, +200,-88, +19,-40, +32,-192, +-107,-56, +-59,-114, +-21,-2, +49,-28, +-234,95, +-18,-185, +21,-52, +89,-138, +200,-57, +29,46, +52,164, +46,-95, +126,-69, +50,67, +93,-173, +36,-70, +-25,-15, +109,-125, +87,-94, +48,-106, +-12,-26, +3,-78, +35,38, +115,-152, +-35,109, +-188,191, +55,-88, +258,53, +42,-62, +-213,-56, +89,39, +-71,-35, +-31,134, +23,60, +79,-45, +-34,-124, +19,-55, +-136,101, +-111,-6, +22,152, +-142,45, +-158,123, +65,-60, +-165,105, +-159,53, +27,-27, +185,-115, +-141,241, +-266,-95, +-101,83, +-185,174, +-20,61, +79,115, +-1,-37, +-135,-16, +4,120, +147,-35, +-7,-82, +21,65, +-40,-26, +-86,-283, +121,-23, +-203,-58, +182,117, +159,-154, +-179,13, +38,122, +-152,24, +-174,0, +-168,-112, +-273,86, +-10,12, +190,8, +143,-177, +-45,-68, +163,-32, +287,-260, +-72,-83, +-45,316, +95,37, +-74,186, +-45,-193, +68,-155, +122,-64, +11,130, +-77,73, +-64,-63, +79,173, +37,-64, +214,4, +-80,178, +-36,-32, +-144,-91, +-74,-137, +-31,-54, +50,-67, +-24,95, +6,-152, +207,186, +-42,41, +102,-58, +-49,-84, +0,-219, +190,33, +-140,38, +-316,87, +-115,41, +8,29, +1,-142, +-64,133, +89,-102, +45,85, +-123,-144, +-45,-166, +-56,146, +215,42, +-68,123, +63,9, +-136,-44, +177,-145, +157,38, +33,-11, +54,102, +128,72, +-121,48, +173,216, +-109,54, +11,12, +54,-72, +-53,-9, +115,-60, +170,94, +59,-15, +264,-9, +-41,-33, +193,35, +-18,70, +-150,-14, +-6,-116, +148,233, +236,-87, +-132,49, +92,-187, +24,63, +-80,30, +39,163, +-95,-103, +75,-26, +90,-174, +21,-4, +152,84, +-192,-68, +52,21, +-89,-10, +-166,-86, +7,-24, +17,159, +-92,145, +69,11, +-108,-118, +64,-47, +-111,144, +97,47, +80,51, +-238,130, +-128,-57, +99,1, +134,-99, +-98,171, +27,285, +103,73, +85,132, +83,-61, +36,126, +-177,-9, +23,-55, +135,109, +-129,79, +30,-54, +-18,91, +70,-65, +32,54, +-99,-89, +8,-28, +-34,16, +18,14, +-102,77, +56,130, +-89,-98, +164,9, +-27,158, +0,101, +-49,104, +2,118, +-103,165, +6,57, +136,38, +-89,57, +52,245, +25,-34, +83,67, +57,175, +-28,-137, +8,157, +-22,131, +129,282, +-69,61, +41,79, +-21,-123, +-6,-94, +11,-98, +131,-51, +-97,-161, +-73,76, +0,-1, +-163,-33, +-102,37, +136,111, +-117,-66, +43,226, +-4,-138, +75,7, +28,-10, +-151,-25, +-50,107, +68,44, +119,126, +65,-104, +53,-79, +-54,-24, +31,1, +152,-1, +179,85, +23,-180, +-120,-130, +23,15, +-202,6, +20,-100, +47,140, +7,-83, +34,30, +116,-93, +35,-55, +120,18, +72,-69, +21,163, +-224,136, +74,10, +24,-105, +21,102, +64,80, +63,-98, +-28,-8, +52,89, +-150,-17, +-103,-24, +-170,168, +-111,20, +-78,88, +-34,-52, +14,-64, +17,91, +-81,-119, +153,18, +200,81, +84,-116, +121,-149, +8,-89, +-24,-16, +-96,84, +-15,-85, +61,-36, +-171,27, +51,-58, +41,-22, +63,-8, +-157,70, +-8,178, +-12,-3, +90,149, +-66,18, +-137,225, +144,70, +-194,23, +39,45, +-95,57, +-48,-4, +-155,-57, +127,67, +-99,-118, +-129,57, +61,-42, +59,10, +13,-146, +-24,179, +-58,184, +135,101, +245,37, +45,-99, +6,3, +-128,147, +89,-33, +-85,-118, +35,8, +-66,-49, +24,15, +-28,-170, +47,24, +55,-134, +9,64, +112,-136, +107,62, +189,-99, +-55,-24, +163,156, +70,-142, +94,-77, +14,11, +-68,126, +2,-102, +-18,11, +-29,-69, +-23,25, +-28,-50, +90,-97, +-119,81, +-192,51, +6,119, +-3,164, +-19,112, +43,2, +-102,-80, +49,76, +-12,-29, +-69,-122, +186,-58, +45,-115, +-4,-213, +14,27, +61,-76, +-27,16, +-50,76, +57,32, +61,-10, +-38,109, +-45,-58, +164,-72, +80,-84, +28,150, +-81,25, +7,85, +-38,81, +-119,13, +130,21, +-61,70, +16,-81, +-14,-23, +-3,-125, +-116,-3, +-88,-18, +-24,139, +84,153, +-42,-10, +-17,-5, +-57,5, +-58,77, +19,91, +165,53, +-48,-60, +58,-64, +16,-48, +-130,88, +103,63, +-46,-127, +120,102, +-1,-31, +48,-50, +-22,-68, +20,-71, +-6,-45, +-29,-11, +-133,3, +-5,84, +-116,-39, +-58,5, +11,-19, +127,45, +93,-22, +253,84, +-56,-53, +57,1, +27,39, +63,50, +54,62, +47,-49, +168,50, +-41,1, +45,41, +145,-41, +82,-71, +32,34, +141,-53, +70,43, +-15,14, +9,87, +2,-117, +103,39, +24,-35, +-36,-9, +4,-28, +-15,3, +-83,-53, +105,63, +-60,73, +18,-135, +67,56, +29,32, +-5,-23, +10,-32, +9,-44, +81,69, +-46,81, +160,56, +138,-9, +95,-8, +19,32, +-118,102, +72,-109, +23,-127, +35,17, +77,73, +35,-15, +7,-95, +-76,109, +-23,-108, +127,9, +89,35, +-24,-66, +-41,-59, +2,-27, +-29,-82, +21,46, +2,-68, +-1,121, +-46,35, +-127,-17, +59,57, +-1,-89, +94,7, +-34,43, +-12,-45, +-119,51, +129,28, +-31,162, +47,-32, +-50,-96, +24,30, +57,26, +-30,118, +-40,-12, +61,174, +-19,49, +18,17, +-31,74, +-26,-43, +-25,-21, +92,76, +49,-94, +86,95, +29,-5, +17,25, +68,57, +-51,82, +-36,42, +-46,42, +26,-111, +20,102, +109,6, +-16,52, +-28,-81, +-68,-35, +-49,14, +98,38, +-88,-6, +40,-41, +-36,46, +23,-87, +57,-177, +41,-32, +-52,41, +-16,43, +-129,-15, +-10,-24, +86,98, +-32,-5, +64,65, +-57,-8, +15,-21, +-38,33, +-59,-64, +-87,-62, +47,-48, +38,32, +6,-1, +23,128, +-3,-26, +53,-25, +-11,-7, +65,-24, +5,55, +-140,75, +-5,-74, +-25,-5, +146,49, +47,-49, +11,-5, +-109,119, +-70,85, +11,-23, +-75,64, +-62,108, +96,-47, +-32,-69, +-15,-125, +-14,-83, +27,-2, +33,-96, +15,22, +-30,37, +-47,24, +107,40, +-124,-89, +-77,55, +0,-31, +-7,-42, +-23,66, +14,21, +2,4, +22,-35, +7,-28, +-17,51, +95,-19, +53,-62, +-13,-75, +63,-78, +-14,-78, +42,62, +-58,61, +36,-131, +34,-16, +7,1, +-10,-66, +97,-45, +-9,-2, +45,-46, +20,-43, +-16,-12, +-56,8, +-13,9, +32,37, +20,-48, +44,16, +-42,-15, +-1,-35, +12,-21, +-60,120, +49,21, +35,-85, +17,-1, +11,39, +-59,9, +16,6, +-26,0, +-32,-1, +-56,60, +-16,16, +-23,1, +-44,19, +-12,20, +-31,32, +-1,34, +-12,32, +8,-9, +63,51, +-42,31, +-43,51, +-38,23, +-13,-57, +-45,-16, +63,-38, +-39,20, +-37,-25, +-15,-33, +-38,-17, +-90,67, +73,-10, +-32,11, +-43,-57, +7,-23, +0,14, +38,36, +-47,51, +10,16, +52,-57, +23,-1, +34,26, +26,38, +-16,16, +-64,126, +-26,-38, +-59,36, +-42,-56, +-23,47, +29,25, +20,7, +4,-7, +7,31, +0,-87, +25,-39, +25,14, +-66,-40, +-57,-54, +14,37, +58,57, +-27,-19, +-87,1, +38,17, +-31,5, +11,-8, +-24,-24, +-15,-15, +-15,20, +38,-21, +19,-9, +17,14, +67,71, +-59,40, +23,22, +15,-61, +38,15, +-1,-1, +8,14, +-23,-16, +-7,29, +19,47, +-13,1, +-20,-2, +6,6, +16,28, +5,-4, +-24,10, +-49,16, +9,19, +-33,-3, +-23,46, +58,-20, +-7,0, +-12,-10, +62,41, +-36,-1, +13,-25, +19,-7, +49,14, +21,-21, +39,14, +30,19, +17,-35, +-33,-5, +-18,0, +-4,35, +-37,-4, +12,6, +-25,3, +-25,-14, +-9,10, +-23,-3, +5,-32, +11,13, +7,26, +-18,11, +0,30, +17,-12, +-35,-27, +-27,-4, +33,25, +36,-48, +25,-36, +13,44, +-15,-22, +29,28, +29,-12, +18,-9, +-79,-38, +19,-2, +19,30, +-15,32, +18,-11, +-1,12, +16,59, +17,-13, +16,-14, +23,-38, +10,-19, +-11,7, +-25,29, +-24,6, +1,3, +-19,-41, +-10,-6, +-32,3, +0,6, +-22,32, +20,-5, +-3,1, +-28,-30, +19,-16, +-8,-39, +-47,-21, +22,-21, +7,-2, +-14,-3, +-22,13, +-10,20, +15,-3, +4,-12, +31,25, +-31,-15, +-9,21, +20,-6, +-13,-6, +-11,-14, +-20,-19, +2,5, +-5,-19, +10,-12, +4,11, +17,-4, +10,-3, +1,9, +0,40, +-5,-11, +18,-5, +17,-3, +-5,0, +-2,-4, +3,-15, +7,-2, +-20,-1, +11,-3, +-2,-16, +7,3, +11,15, +-2,-7, +-2,9, +5,-11, +-13,-1, +17,3, +6,-4, +-20,9, +14,-7, +-17,8, +-2,-21, +9,4, +11,8, +4,-16, +-4,5, +2,5, +4,-4, +0,4, +-6,6, +-3,-16, +-5,1, +-3,5, +-2,-6, +-4,7, +-1,-8, +1,-4, +1,11, +7,11, +-2,-9, +-9,3, +2,6, +-5,-5, +-5,6, +4,0, +8,-2, +10,11, +-5,-4, +-1,-3, +-5,8, +-4,2, +6,-2, +0,5, +0,-4, +-1,-9, +2,6, +-1,4, +-4,-8, +-1,5, +0,-5, +1,-6, +1,5, +1,0, +1,-5, +-1,6, +1,0, +0,-4, +0,5, +0,0, +0,-5, +0,4, +1,0, +-1,-6, +1,5, +1,0, +1,-5, +1,6, +0,5, +-1,-5, +-4,8, +-1,-4, +2,-6, +-1,9, +0,4, +0,-5, +6,2, +-4,-2, +-5,-8, +-1,3, +-5,4, +10,-11, +8,2, +4,0, +-5,-6, +-5,5, +2,-6, +-9,-3, +-2,9, +7,-11, +1,-11, +1,4, +-1,8, +-4,-7, +-2,6, +-3,-5, +-5,-1, +-3,16, +-6,-6, +0,-4, +4,4, +2,-5, +-4,-5, +4,16, +11,-8, +9,-4, +-2,21, +-17,-8, +14,7, +-20,-9, +6,4, +17,-3, +-13,1, +5,11, +-2,-9, +-2,7, +11,-15, +7,-3, +-2,16, +11,3, +-20,1, +7,2, +3,15, +-2,4, +-5,0, +17,3, +18,5, +-5,11, +0,-40, +1,-9, +10,3, +17,4, +4,-11, +10,12, +-5,19, +2,-5, +-20,19, +-11,14, +-13,6, +20,6, +-9,-21, +-31,15, +31,-25, +4,12, +15,3, +-10,-20, +-22,-13, +-14,3, +7,2, +22,21, +-47,21, +-8,39, +19,16, +-28,30, +-3,-1, +20,5, +-22,-32, +0,-6, +-32,-3, +-10,6, +-19,41, +1,-3, +-24,-6, +-25,-29, +-11,-7, +10,19, +23,38, +16,14, +17,13, +16,-59, +-1,-12, +18,11, +-15,-32, +19,-30, +19,2, +-79,38, +18,9, +29,12, +29,-28, +-15,22, +13,-44, +25,36, +36,48, +33,-25, +-27,4, +-35,27, +17,12, +0,-30, +-18,-11, +7,-26, +11,-13, +5,32, +-23,3, +-9,-10, +-25,14, +-25,-3, +12,-6, +-37,4, +-4,-35, +-18,0, +-33,5, +17,35, +30,-19, +39,-14, +21,21, +49,-14, +19,7, +13,25, +-36,1, +62,-41, +-12,10, +-7,0, +58,20, +-23,-46, +-33,3, +9,-19, +-49,-16, +-24,-10, +5,4, +16,-28, +6,-6, +-20,2, +-13,-1, +19,-47, +-7,-29, +-23,16, +8,-14, +-1,1, +38,-15, +15,61, +23,-22, +-59,-40, +67,-71, +17,-14, +19,9, +38,21, +-15,-20, +-15,15, +-24,24, +11,8, +-31,-5, +38,-17, +-87,-1, +-27,19, +58,-57, +14,-37, +-57,54, +-66,40, +25,-14, +25,39, +0,87, +7,-31, +4,7, +20,-7, +29,-25, +-23,-47, +-42,56, +-59,-36, +-26,38, +-64,-126, +-16,-16, +26,-38, +34,-26, +23,1, +52,57, +10,-16, +-47,-51, +38,-36, +0,-14, +7,23, +-43,57, +-32,-11, +73,10, +-90,-67, +-38,17, +-15,33, +-37,25, +-39,-20, +63,38, +-45,16, +-13,57, +-38,-23, +-43,-51, +-42,-31, +63,-51, +8,9, +-12,-32, +-1,-34, +-31,-32, +-12,-20, +-44,-19, +-23,-1, +-16,-16, +-56,-60, +-32,1, +-26,0, +16,-6, +-59,-9, +11,-39, +17,1, +35,85, +49,-21, +-60,-120, +12,21, +-1,35, +-42,15, +44,-16, +20,48, +32,-37, +-13,-9, +-56,-8, +-16,12, +20,43, +45,46, +-9,2, +97,45, +-10,66, +7,-1, +34,16, +36,131, +-58,-61, +42,-62, +-14,78, +63,78, +-13,75, +53,62, +95,19, +-17,-51, +7,28, +22,35, +2,-4, +14,-21, +-23,-66, +-7,42, +0,31, +-77,-55, +-124,89, +107,-40, +-47,-24, +-30,-37, +15,-22, +33,96, +27,2, +-14,83, +-15,125, +-32,69, +96,47, +-62,-108, +-75,-64, +11,23, +-70,-85, +-109,-119, +11,5, +47,49, +146,-49, +-25,5, +-5,74, +-140,-75, +5,-55, +65,24, +-11,7, +53,25, +-3,26, +23,-128, +6,1, +38,-32, +47,48, +-87,62, +-59,64, +-38,-33, +15,21, +-57,8, +64,-65, +-32,5, +86,-98, +-10,24, +-129,15, +-16,-43, +-52,-41, +41,32, +57,177, +23,87, +-36,-46, +40,41, +-88,6, +98,-38, +-49,-14, +-68,35, +-28,81, +-16,-52, +109,-6, +20,-102, +26,111, +-46,-42, +-36,-42, +-51,-82, +68,-57, +17,-25, +29,5, +86,-95, +49,94, +92,-76, +-25,21, +-26,43, +-31,-74, +18,-17, +-19,-49, +61,-174, +-40,12, +-30,-118, +57,-26, +24,-30, +-50,96, +47,32, +-31,-162, +129,-28, +-119,-51, +-12,45, +-34,-43, +94,-7, +-1,89, +59,-57, +-127,17, +-46,-35, +-1,-121, +2,68, +21,-46, +-29,82, +2,27, +-41,59, +-24,66, +89,-35, +127,-9, +-23,108, +-76,-109, +7,95, +35,15, +77,-73, +35,-17, +23,127, +72,109, +-118,-102, +19,-32, +95,8, +138,9, +160,-56, +-46,-81, +81,-69, +9,44, +10,32, +-5,23, +29,-32, +67,-56, +18,135, +-60,-73, +105,-63, +-83,53, +-15,-3, +4,28, +-36,9, +24,35, +103,-39, +2,117, +9,-87, +-15,-14, +70,-43, +141,53, +32,-34, +82,71, +145,41, +45,-41, +-41,-1, +168,-50, +47,49, +54,-62, +63,-50, +27,-39, +57,-1, +-56,53, +253,-84, +93,22, +127,-45, +11,19, +-58,-5, +-116,39, +-5,-84, +-133,-3, +-29,11, +-6,45, +20,71, +-22,68, +48,50, +-1,31, +120,-102, +-46,127, +103,-63, +-130,-88, +16,48, +58,64, +-48,60, +165,-53, +19,-91, +-58,-77, +-57,-5, +-17,5, +-42,10, +84,-153, +-24,-139, +-88,18, +-116,3, +-3,125, +-14,23, +16,81, +-61,-70, +130,-21, +-119,-13, +-38,-81, +7,-85, +-81,-25, +28,-150, +80,84, +164,72, +-45,58, +-38,-109, +61,10, +57,-32, +-50,-76, +-27,-16, +61,76, +14,-27, +-4,213, +45,115, +186,58, +-69,122, +-12,29, +49,-76, +-102,80, +43,-2, +-19,-112, +-3,-164, +6,-119, +-192,-51, +-119,-81, +90,97, +-28,50, +-23,-25, +-29,69, +-18,-11, +2,102, +-68,-126, +14,-11, +94,77, +70,142, +163,-156, +-55,24, +189,99, +107,-62, +112,136, +9,-64, +55,134, +47,-24, +-28,170, +24,-15, +-66,49, +35,-8, +-85,118, +89,33, +-128,-147, +6,-3, +45,99, +245,-37, +135,-101, +-58,-184, +-24,-179, +13,146, +59,-10, +61,42, +-129,-57, +-99,118, +127,-67, +-155,57, +-48,4, +-95,-57, +39,-45, +-194,-23, +144,-70, +-137,-225, +-66,-18, +90,-149, +-12,3, +-8,-178, +-157,-70, +63,8, +41,22, +51,58, +-171,-27, +61,36, +-15,85, +-96,-84, +-24,16, +8,89, +121,149, +84,116, +200,-81, +153,-18, +-81,119, +17,-91, +14,64, +-34,52, +-78,-88, +-111,-20, +-170,-168, +-103,24, +-150,17, +52,-89, +-28,8, +63,98, +64,-80, +21,-102, +24,105, +74,-10, +-224,-136, +21,-163, +72,69, +120,-18, +35,55, +116,93, +34,-30, +7,83, +47,-140, +20,100, +-202,-6, +23,-15, +-120,130, +23,180, +179,-85, +152,1, +31,-1, +-54,24, +53,79, +65,104, +119,-126, +68,-44, +-50,-107, +-151,25, +28,10, +75,-7, +-4,138, +43,-226, +-117,66, +136,-111, +-102,-37, +-163,33, +0,1, +-73,-76, +-97,161, +131,51, +11,98, +-6,94, +-21,123, +41,-79, +-69,-61, +129,-282, +-22,-131, +8,-157, +-28,137, +57,-175, +83,-67, +25,34, +52,-245, +-89,-57, +136,-38, +6,-57, +-103,-165, +2,-118, +-49,-104, +0,-101, +-27,-158, +164,-9, +-89,98, +56,-130, +-102,-77, +18,-14, +-34,-16, +8,28, +-99,89, +32,-54, +70,65, +-18,-91, +30,54, +-129,-79, +135,-109, +23,55, +-177,9, +36,-126, +83,61, +85,-132, +103,-73, +27,-285, +-98,-171, +134,99, +99,-1, +-128,57, +-238,-130, +80,-51, +97,-47, +-111,-144, +64,47, +-108,118, +69,-11, +-92,-145, +17,-159, +7,24, +-166,86, +-89,10, +52,-21, +-192,68, +152,-84, +21,4, +90,174, +75,26, +-95,103, +39,-163, +-80,-30, +24,-63, +92,187, +-132,-49, +236,87, +148,-233, +-6,116, +-150,14, +-18,-70, +193,-35, +-41,33, +264,9, +59,15, +170,-94, +115,60, +-53,9, +54,72, +11,-12, +-109,-54, +173,-216, +-121,-48, +128,-72, +54,-102, +33,11, +157,-38, +177,145, +-136,44, +63,-9, +-68,-123, +215,-42, +-56,-146, +-45,166, +-123,144, +45,-85, +89,102, +-64,-133, +1,142, +8,-29, +-115,-41, +-316,-87, +-140,-38, +190,-33, +0,219, +-49,84, +102,58, +-42,-41, +207,-186, +6,152, +-24,-95, +50,67, +-31,54, +-74,137, +-144,91, +-36,32, +-80,-178, +214,-4, +37,64, +79,-173, +-64,63, +-77,-73, +11,-130, +122,64, +68,155, +-45,193, +-74,-186, +95,-37, +-45,-316, +-72,83, +287,260, +163,32, +-45,68, +143,177, +190,-8, +-10,-12, +-273,-86, +-168,112, +-174,0, +-152,-24, +38,-122, +-179,-13, +159,154, +182,-117, +-203,58, +121,23, +-86,283, +-40,26, +21,-65, +-7,82, +147,35, +4,-120, +-135,16, +-1,37, +79,-115, +-20,-61, +-185,-174, +-101,-83, +-266,95, +-141,-241, +185,115, +27,27, +-159,-53, +-165,-105, +65,60, +-158,-123, +-142,-45, +22,-152, +-111,6, +-136,-101, +19,55, +-34,124, +79,45, +23,-60, +-31,-134, +-71,35, +89,-39, +-213,56, +42,62, +258,-53, +55,88, +-188,-191, +-35,-109, +115,152, +35,-38, +3,78, +-12,26, +48,106, +87,94, +109,125, +-25,15, +36,70, +93,173, +50,-67, +126,69, +46,95, +52,-164, +29,-46, +200,57, +89,138, +21,52, +-18,185, +-234,-95, +49,28, +-21,2, +-59,114, +-107,56, +32,192, +19,40, +200,88, +-164,-151, +-78,199, +-53,108, +-24,-242, +143,111, +197,29, +-48,-39, +-88,-86, +-38,-135, +86,-87, +54,-71, +257,61, +34,136, +321,194, +-273,72, +62,215, +59,45, +111,-99, +-46,-58, +121,-11, +-80,-25, +-144,-12, +-186,-63, +31,-82, +-99,161, +-194,312, +117,-173, +188,-154, +-16,190, +-72,69, +111,152, +25,-126, +-82,94, +-44,22, +-28,115, +-29,-49, +47,-27, +-122,-95, +86,-194, +236,34, +229,-109, +-85,172, +0,-193, +-160,-91, +147,-39, +-15,48, +-37,4, +102,52, +190,-11, +25,-48, +-73,125, +121,34, +23,-173, +26,25, +37,198, +71,-19, +12,157, +134,106, +-12,-69, +122,-4, +-164,-100, +59,-52, +116,42, +33,-208, +-146,204, +19,-173, +4,-233, +-33,-82, +16,-99, +85,-284, +-78,68, +-184,92, +200,28, +-5,153, +53,13, +64,81, +-73,28, +-4,149, +58,78, +-84,19, +-77,92, +37,-145, +97,-6, +120,129, +92,-74, +-11,-30, +-205,172, +87,105, +0,-133, +-176,-210, +-122,-138, +-12,-42, +244,24, +-197,-42, +157,-363, +-110,186, +-235,130, +-16,125, +263,-176, +41,-28, +14,117, +143,-200, +123,1, +198,-62, +-285,-207, +-172,-55, +-72,-66, +1,-5, +126,241, +206,101, +-201,8, +-82,80, +-118,201, +-11,-36, +144,287, +70,-71, +130,-72, +-161,119, +-45,28, +-242,-30, +-176,96, +-233,162, +-70,67, +-93,-232, +32,190, +108,182, +94,-29, +11,60, +-7,-258, +-57,8, +249,47, +-178,146, +136,-81, +-32,-96, +-270,304, +7,26, +-45,46, +-165,7, +-84,-9, +92,-166, +-20,-31, +-125,-131, +290,-86, +107,127, +129,-54, +-160,-162, +-45,-110, +55,-9, +-72,45, +-144,-74, +-50,62, +96,-47, +-189,181, +-74,-177, +66,-79, +-5,36, +153,-125, +-92,-15, +-17,194, +-67,-184, +44,-10, +17,17, +-86,-106, +262,278, +-298,-116, +-15,142, +38,-54, +-105,-273, +22,-10, +-43,83, +7,-74, +59,-55, +70,67, +-107,17, +19,118, +-126,76, +-34,19, +182,80, +-113,63, +-98,-5, +-15,30, +223,-74, +75,-93, +73,44, +-92,141, +27,94, +207,-35, +-128,216, +-16,-46, +238,-425, +-13,-25, +35,-89, +13,183, +101,193, +72,7, +100,-51, +28,-186, +-215,138, +-122,-56, +93,-76, +10,94, +126,125, +-343,132, +-93,-86, +-194,-65, +-32,-50, +0,-158, +45,18, +-109,-18, +179,47, +-33,-207, +81,-22, +6,0, +-78,-44, +135,-102, +410,105, +6,-215, +-95,-27, +-71,-157, +-22,-111, +35,-199, +128,-213, +-168,-6, +-50,-120, +-116,24, +-34,-119, +24,46, +161,40, +74,22, +-27,-187, +66,136, +24,104, +-24,-207, +-91,130, +34,-30, +96,52, +-13,25, +61,69, +82,-34, +-52,139, +97,77, +20,237, +19,-92, +20,79, +-90,-40, +-166,-44, +82,-63, +-76,141, +224,31, +61,-112, +149,-33, +-16,-43, +-64,-116, +-84,13, +128,-267, +-27,81, +55,-157, +80,5, +163,-36, +95,-117, +-51,-105, +-283,-190, +-113,-62, +0,29, +-113,-136, +38,-6, +-18,8, +226,92, +192,-361, +-90,-64, +117,-6, +-35,20, +-36,-92, +-110,135, +-207,187, +-52,150, +29,216, +-95,54, +2,45, +-133,94, +3,-82, +-170,-82, +45,67, +52,-139, +128,227, +208,-86, +-169,-41, +-44,-50, +39,-98, +-36,103, +-211,52, +-125,-55, +-55,98, +10,80, +-70,47, +-65,84, +139,-14, +-63,-50, +151,66, +-79,122, +-12,-1, +-120,-140, +171,82, +158,54, +-205,-188, +26,-20, +123,-20, +72,-93, +-62,66, +-80,72, +0,59, +97,-86, +199,140, +-151,-104, +-8,34, +-6,14, +16,100, +-68,-35, +-234,89, +-202,-75, +140,-36, +-42,76, +-134,-33, +108,-267, +-21,18, +368,117, +232,-31, +-44,-157, +-301,-29, +-78,271, +108,-69, +113,-222, +-64,-46, +45,-79, +72,-99, +-50,222, +39,6, +82,-211, +218,-57, +-99,202, +185,-32, +29,186, +-58,-129, +-16,-50, +-115,-20, +-66,202, +-146,-139, +-115,-244, +62,-53, +-68,141, +-86,185, +191,-62, +55,-138, +40,-10, +-14,83, +-74,52, +81,-46, +213,120, +-134,-200, +146,-40, +46,-131, +32,15, +80,319, +189,64, +135,89, +-69,68, +-79,-47, +76,-172, +142,124, +-64,-6, +23,116, +-8,71, +92,34, +186,29, +-97,-168, +194,474, +-39,-145, +-264,82, +345,-102, +-211,95, +-168,-9, +-107,109, +21,301, +103,76, +66,108, +91,278, +-2,-212, +-46,-110, +127,117, +73,-67, +-17,30, +40,-53, +69,111, +71,33, +-4,-255, +162,81, +-10,257, +-123,75, +-135,-26, +113,-1, +-72,63, +117,72, +114,-304, +-90,23, +-345,-231, +251,-83, +89,96, +242,23, +-16,144, +91,198, +-230,1, +-158,-29, +-44,-98, +165,23, +194,-46, +180,121, +179,14, +-1,62, +228,-107, +1,30, +-4,-62, +68,154, +-65,-163, +119,56, +-15,1, +71,30, +124,59, +200,6, +-112,-225, +-77,31, +-77,-311, +157,24, +28,187, +-6,-96, +-44,-33, +-85,101, +81,80, +-19,115, +-318,-124, +456,170, +-27,90, +-105,-155, +84,79, +129,-157, +38,132, +-99,-69, +-12,-159, +-29,-41, +74,-122, +-142,156, +54,-36, +144,-143, +138,-29, +24,46, +309,141, +51,-104, +93,181, +4,-22, +-97,34, +125,240, +-63,-9, +-8,84, +31,-25, +46,53, +213,-70, +181,19, +-36,10, +-160,-151, +143,-137, +-137,-81, +13,-40, +-67,67, +-84,126, +-1,85, +-54,82, +-293,113, +85,-106, +192,-2, +16,7, +181,-218, +-190,145, +-112,-28, +-108,44, +14,-121, +-92,-111, +-14,-31, +-43,-82, +-9,-19, +-2,-145, +-13,75, +-167,-139, +243,-200, +-6,-207, +-31,-27, +-120,95, +-110,217, +149,99, +-74,-24, +145,116, +-316,133, +33,84, +27,-52, +120,-68, +26,-7, +61,149, +38,125, +-146,-23, +60,13, +169,-71, +23,27, +89,-51, +-7,-62, +192,-77, +125,188, +83,-34, +-206,29, +41,258, +22,101, +-29,93, +172,44, +179,-44, +50,-28, +134,61, +-81,67, +37,-38, +116,-147, +174,-319, +-71,38, +165,106, +-222,44, +275,124, +-8,-72, +-85,-68, +37,156, +2,-86, +-24,-42, +-147,52, +149,-131, +70,-95, +12,-11, +-17,86, +99,-64, +-74,-108, +-8,109, +68,161, +-191,-15, +20,98, +-48,-253, +-29,-168, +2,144, +-114,-22, +83,88, +68,88, +-141,-20, +-81,-5, +95,149, +38,-93, +51,21, +159,374, +59,-75, +29,106, +-140,36, +-80,-42, +7,-70, +-10,-5, +-44,218, +-28,-119, +-139,-165, +-58,-127, +-134,-77, +70,-107, +-97,73, +2,158, +-170,66, +-64,-107, +32,97, +-195,-37, +87,-40, +38,-116, +53,-128, +203,133, +137,85, +-34,-90, +-30,67, +-87,24, +83,14, +52,-43, +-12,236, +-111,55, +40,-43, +43,-43, +-204,-219, +-110,-37, +-297,-34, +-113,4, +-141,72, +52,-124, +-11,-66, +-35,-96, +-51,-123, +-120,-131, +-44,-49, +-105,231, +124,-12, +78,109, +12,-47, +113,59, +-11,66, +29,103, +39,-97, +-89,102, +-96,207, +35,-44, +55,-145, +50,76, +-51,24, +13,-12, +-61,-32, +-32,-97, +22,-82, +0,-68, +-270,-44, +-38,-68, +-8,124, +-94,-96, +-61,13, +-76,97, +-118,-18, +-71,19, +45,-162, +64,-74, +235,-26, +13,-88, +-33,-111, +-87,-10, +-8,196, +-138,94, +-149,-106, +61,-165, +-117,46, +60,-154, +-55,20, +18,-21, +-34,87, +-40,-273, +-7,-26, +-18,-40, +16,-13, +14,-59, +124,14, +-128,-99, +-42,-8, +139,-76, +144,-5, +62,22, +108,44, +-26,-65, +-33,23, +-139,99, +91,-102, +100,128, +41,-101, +-97,35, +194,-137, +130,-27, +-30,26, +-45,82, +84,99, +45,120, +57,53, +-82,-8, +-59,-7, +4,116, +-21,40, +181,134, +-139,79, +-16,95, +115,49, +-228,-80, +46,-43, +23,110, +-95,-14, +101,-132, +50,-27, +73,48, +74,-47, +-97,29, +15,103, +-298,-31, +118,190, +-1,3, +17,35, +88,58, +76,-136, +12,-156, +-40,22, +-23,87, +-154,-93, +233,-117, +43,-82, +-95,36, +17,-60, +115,7, +-108,-6, +102,9, +35,-10, +37,-42, +-95,160, +119,181, +0,-92, +2,-73, +-8,-9, +201,-54, +-113,-110, +25,-237, +110,31, +106,-6, +-124,-138, +-86,-19, +-65,-102, +-57,101, +92,6, +51,82, +-88,-33, +-107,-67, +40,-97, +-11,53, +105,71, +-11,-19, +33,-93, +-164,-94, +-22,-65, +-29,20, +-62,194, +-62,-64, +-263,0, +13,51, +38,155, +-177,-140, +0,90, +154,69, +108,-42, +18,-69, +-40,201, +2,-86, +22,25, +-30,68, +-7,-1, +-38,-92, +10,123, +-176,53, +-64,40, +101,-154, +-4,19, +-163,10, +-54,61, +-16,76, +27,5, +114,75, +-13,-68, +142,-10, +9,-261, +11,125, +21,-24, +-3,23, +-24,178, +-92,-61, +-18,4, +67,50, +4,-108, +-85,8, +21,-67, +111,28, +78,-9, +45,-56, +140,188, +8,-103, +34,-76, +1,44, +26,-68, +98,93, +110,83, +39,-72, +36,-27, +-37,172, +-57,56, +-105,20, +120,-33, +-115,120, +84,34, +8,-41, +7,-129, +-1,81, +-10,25, +42,58, +-25,141, +-18,96, +-79,-64, +4,-23, +-53,-2, +-9,93, +-39,-29, +24,-6, +-127,-4, +-58,-25, +-105,-29, +139,-15, +-107,43, +-23,-92, +-48,64, +-49,-75, +-140,-57, +99,-98, +151,-53, +-17,-3, +-95,-93, +-28,85, +-56,94, +-64,122, +-41,-13, +-114,-42, +101,-76, +34,-60, +-52,-63, +54,-42, +-32,-8, +23,-79, +-54,-97, +-45,-107, +-77,84, +-37,-34, +-42,-63, +-29,13, +72,7, +-2,-44, +-78,111, +-19,1, +125,-99, +64,-9, +-19,0, +-1,-8, +115,66, +-17,-2, +33,51, +-20,69, +120,19, +25,16, +64,-110, +-126,-29, +-99,-54, +-19,-33, +-100,23, +-23,-15, +-11,-21, +43,-174, +-16,-78, +-93,-191, +-34,-43, +-124,-14, +-3,17, +95,-32, +43,-54, +77,72, +-57,17, +51,-10, +8,-74, +-11,22, +19,82, +73,93, +-20,75, +-141,31, +-15,-34, +54,24, +-72,-112, +49,4, +-3,-37, +73,-140, +82,82, +-60,-49, +-104,-38, +-8,-70, +-142,-28, +-55,-86, +97,16, +81,5, +-153,-44, +37,-16, +79,-52, +-117,-72, +177,130, +68,52, +35,0, +22,84, +-2,22, +28,-72, +14,-25, +30,10, +10,9, +90,26, +-21,-82, +-64,-1, +-77,41, +-71,-105, +107,1, +37,-21, +46,-1, +-15,-6, +-69,5, +44,42, +37,-42, +-118,82, +-7,41, +-5,-36, +-42,-71, +25,74, +-7,-46, +21,-34, +-25,79, +-10,-37, +103,116, +37,-121, +-46,86, +-53,54, +-166,61, +-1,-5, +74,32, +-9,-26, +-19,90, +22,91, +-11,39, +22,33, +134,11, +46,-38, +35,-13, +46,-44, +-13,122, +49,52, +-64,43, +-28,-15, +6,69, +11,51, +-63,18, +40,-24, +56,-37, +39,62, +30,21, +-40,6, +-37,98, +42,-93, +90,-23, +8,-70, +22,106, +49,-52, +69,25, +76,-63, +-24,-77, +-96,107, +-105,-8, +-12,14, +-47,-51, +16,10, +-63,-6, +-11,-4, +-27,-35, +-38,-9, +-51,-19, +-24,-20, +86,-101, +-67,8, +17,-35, +-44,99, +-26,58, +18,-15, +-7,-35, +53,-91, +47,8, +38,0, +28,-51, +-5,-36, +-42,53, +-64,-70, +-44,18, +-10,-26, +6,40, +-7,110, +-16,41, +42,-37, +-34,18, +72,23, +34,-55, +34,61, +28,-27, +-13,-26, +60,134, +-26,21, +61,53, +-20,55, +-67,54, +13,-16, +14,17, +19,-42, +-84,24, +-19,-5, +-8,-40, +-34,-12, +64,100, +-88,-7, +14,-67, +27,104, +12,-2, +35,40, +-38,-91, +79,28, +31,23, +-50,-67, +24,9, +29,46, +-12,-7, +-22,33, +-109,-69, +24,-12, +-41,48, +6,66, +41,-8, +2,35, +-40,-7, +44,25, +-45,-12, +43,6, +-21,29, +-13,15, +-15,70, +55,3, +-10,78, +17,77, +-9,21, +-14,15, +-40,-68, +39,-54, +38,-9, +34,63, +47,-19, +-9,128, +-25,-7, +-15,-49, +-89,-59, +8,57, +-46,8, +40,14, +16,-4, +-38,-7, +42,-61, +78,18, +-5,26, +-31,21, +-26,0, +39,33, +17,6, +-54,-5, +46,24, +-1,27, +-48,1, +1,-16, +10,31, +64,30, +31,-2, +38,35, +69,-29, +-9,-95, +-14,45, +50,-28, +-76,20, +67,-33, +16,5, +54,56, +-66,-23, +41,49, +32,21, +-23,-43, +60,27, +-13,17, +-28,12, +-6,-5, +16,-22, +-1,22, +58,63, +31,8, +25,-3, +-16,46, +-54,-18, +10,22, +-20,12, +19,30, +-1,-8, +21,-16, +0,9, +-35,32, +-5,8, +29,10, +39,-21, +-14,-6, +-57,5, +-16,-46, +23,-26, +23,11, +-46,-38, +19,-2, +-10,31, +34,-13, +14,34, +0,4, +-45,35, +9,0, +27,-3, +-2,5, +-24,11, +-11,-2, +-33,1, +-13,39, +34,-22, +22,-58, +-52,-5, +1,56, +36,26, +-24,48, +-25,-23, +-11,-9, +7,9, +-2,-7, +-5,-11, +-6,-41, +19,-23, +-4,12, +16,7, +-9,-27, +5,9, +-7,5, +17,26, +-13,0, +22,-14, +7,-10, +-13,11, +-2,25, +-7,-13, +-18,-7, +-3,6, +17,25, +-14,-1, +-15,-29, +31,20, +3,-8, +-13,16, +12,-2, +1,5, +5,-13, +21,-4, +-1,4, +0,-25, +9,-22, +1,-3, +1,5, +-12,-15, +-11,0, +11,3, +-7,27, +20,8, +-18,-11, +-1,3, +0,-19, +-5,1, +13,-11, +11,-1, +6,-3, +27,-5, +16,-14, +3,-18, +5,-2, +-9,6, +6,-9, +-13,13, +-16,5, +-14,15, +22,15, +-14,-16, +-8,3, +6,-1, +-7,-16, +-15,-13, +-7,-8, +-5,7, +-8,12, +1,8, +2,-3, +-19,7, +10,0, +-17,0, +-4,-7, +5,2, +-9,4, +-6,12, +8,0, +1,10, +-1,-7, +-1,-2, +0,-5, +-5,-2, +9,3, +-2,2, +10,-1, +4,4, +-1,-1, +0,2, +7,3, +-4,0, +3,2, +1,-1, +-2,-4, +-2,3, +7,1, +-3,-2, +-7,3, +9,4, +-3,0, +-4,-1, +4,0, +-2,-4, +-6,1, +4,0, +-5,1, +-5,0, +6,-1, +-4,-1, +-3,1, +5,1, +-3,1, +-3,0, +6,0, +-3,0, +-3,-1, +5,-1, +-3,-1, +-4,1, +6,1, +-5,0, +-5,-1, +4,0, +-6,-1, +-2,4, +4,0, +-4,1, +-3,0, +9,-4, +-7,-3, +-3,2, +7,-1, +-2,-3, +-2,4, +1,1, +3,-2, +-4,0, +7,-3, +0,-2, +-1,1, +4,-4, +10,1, +-2,-2, +9,-3, +-5,2, +0,5, +-1,2, +-1,7, +1,-10, +8,0, +-6,-12, +-9,-4, +5,-2, +-4,7, +-17,0, +10,0, +-19,-7, +2,3, +1,-8, +-8,-12, +-5,-7, +-7,8, +-15,13, +-7,16, +6,1, +-8,-3, +-14,16, +22,-15, +-14,-15, +-16,-5, +-13,-13, +6,9, +-9,-6, +5,2, +3,18, +16,14, +27,5, +6,3, +11,1, +13,11, +-5,-1, +0,19, +-1,-3, +-18,11, +20,-8, +-7,-27, +11,-3, +-11,0, +-12,15, +1,-5, +1,3, +9,22, +0,25, +-1,-4, +21,4, +5,13, +1,-5, +12,2, +-13,-16, +3,8, +31,-20, +-15,29, +-14,1, +17,-25, +-3,-6, +-18,7, +-7,13, +-2,-25, +-13,-11, +7,10, +22,14, +-13,0, +17,-26, +-7,-5, +5,-9, +-9,27, +16,-7, +-4,-12, +19,23, +-6,41, +-5,11, +-2,7, +7,-9, +-11,9, +-25,23, +-24,-48, +36,-26, +1,-56, +-52,5, +22,58, +34,22, +-13,-39, +-33,-1, +-11,2, +-24,-11, +-2,-5, +27,3, +9,0, +-45,-35, +0,-4, +14,-34, +34,13, +-10,-31, +19,2, +-46,38, +23,-11, +23,26, +-16,46, +-57,-5, +-14,6, +39,21, +29,-10, +-5,-8, +-35,-32, +0,-9, +21,16, +-1,8, +19,-30, +-20,-12, +10,-22, +-54,18, +-16,-46, +25,3, +31,-8, +58,-63, +-1,-22, +16,22, +-6,5, +-28,-12, +-13,-17, +60,-27, +-23,43, +32,-21, +41,-49, +-66,23, +54,-56, +16,-5, +67,33, +-76,-20, +50,28, +-14,-45, +-9,95, +69,29, +38,-35, +31,2, +64,-30, +10,-31, +1,16, +-48,-1, +-1,-27, +46,-24, +-54,5, +17,-6, +39,-33, +-26,0, +-31,-21, +-5,-26, +78,-18, +42,61, +-38,7, +16,4, +40,-14, +-46,-8, +8,-57, +-89,59, +-15,49, +-25,7, +-9,-128, +47,19, +34,-63, +38,9, +39,54, +-40,68, +-14,-15, +-9,-21, +17,-77, +-10,-78, +55,-3, +-15,-70, +-13,-15, +-21,-29, +43,-6, +-45,12, +44,-25, +-40,7, +2,-35, +41,8, +6,-66, +-41,-48, +24,12, +-109,69, +-22,-33, +-12,7, +29,-46, +24,-9, +-50,67, +31,-23, +79,-28, +-38,91, +35,-40, +12,2, +27,-104, +14,67, +-88,7, +64,-100, +-34,12, +-8,40, +-19,5, +-84,-24, +19,42, +14,-17, +13,16, +-67,-54, +-20,-55, +61,-53, +-26,-21, +60,-134, +-13,26, +28,27, +34,-61, +34,55, +72,-23, +-34,-18, +42,37, +-16,-41, +-7,-110, +6,-40, +-10,26, +-44,-18, +-64,70, +-42,-53, +-5,36, +28,51, +38,0, +47,-8, +53,91, +-7,35, +18,15, +-26,-58, +-44,-99, +17,35, +-67,-8, +86,101, +-24,20, +-51,19, +-38,9, +-27,35, +-11,4, +-63,6, +16,-10, +-47,51, +-12,-14, +-105,8, +-96,-107, +-24,77, +76,63, +69,-25, +49,52, +22,-106, +8,70, +90,23, +42,93, +-37,-98, +-40,-6, +30,-21, +39,-62, +56,37, +40,24, +-63,-18, +11,-51, +6,-69, +-28,15, +-64,-43, +49,-52, +-13,-122, +46,44, +35,13, +46,38, +134,-11, +22,-33, +-11,-39, +22,-91, +-19,-90, +-9,26, +74,-32, +-1,5, +-166,-61, +-53,-54, +-46,-86, +37,121, +103,-116, +-10,37, +-25,-79, +21,34, +-7,46, +25,-74, +-42,71, +-5,36, +-7,-41, +-118,-82, +37,42, +44,-42, +-69,-5, +-15,6, +46,1, +37,21, +107,-1, +-71,105, +-77,-41, +-64,1, +-21,82, +90,-26, +10,-9, +30,-10, +14,25, +28,72, +-2,-22, +22,-84, +35,0, +68,-52, +177,-130, +-117,72, +79,52, +37,16, +-153,44, +81,-5, +97,-16, +-55,86, +-142,28, +-8,70, +-104,38, +-60,49, +82,-82, +73,140, +-3,37, +49,-4, +-72,112, +54,-24, +-15,34, +-141,-31, +-20,-75, +73,-93, +19,-82, +-11,-22, +8,74, +51,10, +-57,-17, +77,-72, +43,54, +95,32, +-3,-17, +-124,14, +-34,43, +-93,191, +-16,78, +43,174, +-11,21, +-23,15, +-100,-23, +-19,33, +-99,54, +-126,29, +64,110, +25,-16, +120,-19, +-20,-69, +33,-51, +-17,2, +115,-66, +-1,8, +-19,0, +64,9, +125,99, +-19,-1, +-78,-111, +-2,44, +72,-7, +-29,-13, +-42,63, +-37,34, +-77,-84, +-45,107, +-54,97, +23,79, +-32,8, +54,42, +-52,63, +34,60, +101,76, +-114,42, +-41,13, +-64,-122, +-56,-94, +-28,-85, +-95,93, +-17,3, +151,53, +99,98, +-140,57, +-49,75, +-48,-64, +-23,92, +-107,-43, +139,15, +-105,29, +-58,25, +-127,4, +24,6, +-39,29, +-9,-93, +-53,2, +4,23, +-79,64, +-18,-96, +-25,-141, +42,-58, +-10,-25, +-1,-81, +7,129, +8,41, +84,-34, +-115,-120, +120,33, +-105,-20, +-57,-56, +-37,-172, +36,27, +39,72, +110,-83, +98,-93, +26,68, +1,-44, +34,76, +8,103, +140,-188, +45,56, +78,9, +111,-28, +21,67, +-85,-8, +4,108, +67,-50, +-18,-4, +-92,61, +-24,-178, +-3,-23, +21,24, +11,-125, +9,261, +142,10, +-13,68, +114,-75, +27,-5, +-16,-76, +-54,-61, +-163,-10, +-4,-19, +101,154, +-64,-40, +-176,-53, +10,-123, +-38,92, +-7,1, +-30,-68, +22,-25, +2,86, +-40,-201, +18,69, +108,42, +154,-69, +0,-90, +-177,140, +38,-155, +13,-51, +-263,0, +-62,64, +-62,-194, +-29,-20, +-22,65, +-164,94, +33,93, +-11,19, +105,-71, +-11,-53, +40,97, +-107,67, +-88,33, +51,-82, +92,-6, +-57,-101, +-65,102, +-86,19, +-124,138, +106,6, +110,-31, +25,237, +-113,110, +201,54, +-8,9, +2,73, +0,92, +119,-181, +-95,-160, +37,42, +35,10, +102,-9, +-108,6, +115,-7, +17,60, +-95,-36, +43,82, +233,117, +-154,93, +-23,-87, +-40,-22, +12,156, +76,136, +88,-58, +17,-35, +-1,-3, +118,-190, +-298,31, +15,-103, +-97,-29, +74,47, +73,-48, +50,27, +101,132, +-95,14, +23,-110, +46,43, +-228,80, +115,-49, +-16,-95, +-139,-79, +181,-134, +-21,-40, +4,-116, +-59,7, +-82,8, +57,-53, +45,-120, +84,-99, +-45,-82, +-30,-26, +130,27, +194,137, +-97,-35, +41,101, +100,-128, +91,102, +-139,-99, +-33,-23, +-26,65, +108,-44, +62,-22, +144,5, +139,76, +-42,8, +-128,99, +124,-14, +14,59, +16,13, +-18,40, +-7,26, +-40,273, +-34,-87, +18,21, +-55,-20, +60,154, +-117,-46, +61,165, +-149,106, +-138,-94, +-8,-196, +-87,10, +-33,111, +13,88, +235,26, +64,74, +45,162, +-71,-19, +-118,18, +-76,-97, +-61,-13, +-94,96, +-8,-124, +-38,68, +-270,44, +0,68, +22,82, +-32,97, +-61,32, +13,12, +-51,-24, +50,-76, +55,145, +35,44, +-96,-207, +-89,-102, +39,97, +29,-103, +-11,-66, +113,-59, +12,47, +78,-109, +124,12, +-105,-231, +-44,49, +-120,131, +-51,123, +-35,96, +-11,66, +52,124, +-141,-72, +-113,-4, +-297,34, +-110,37, +-204,219, +43,43, +40,43, +-111,-55, +-12,-236, +52,43, +83,-14, +-87,-24, +-30,-67, +-34,90, +137,-85, +203,-133, +53,128, +38,116, +87,40, +-195,37, +32,-97, +-64,107, +-170,-66, +2,-158, +-97,-73, +70,107, +-134,77, +-58,127, +-139,165, +-28,119, +-44,-218, +-10,5, +7,70, +-80,42, +-140,-36, +29,-106, +59,75, +159,-374, +51,-21, +38,93, +95,-149, +-81,5, +-141,20, +68,-88, +83,-88, +-114,22, +2,-144, +-29,168, +-48,253, +20,-98, +-191,15, +68,-161, +-8,-109, +-74,108, +99,64, +-17,-86, +12,11, +70,95, +149,131, +-147,-52, +-24,42, +2,86, +37,-156, +-85,68, +-8,72, +275,-124, +-222,-44, +165,-106, +-71,-38, +174,319, +116,147, +37,38, +-81,-67, +134,-61, +50,28, +179,44, +172,-44, +-29,-93, +22,-101, +41,-258, +-206,-29, +83,34, +125,-188, +192,77, +-7,62, +89,51, +23,-27, +169,71, +60,-13, +-146,23, +38,-125, +61,-149, +26,7, +120,68, +27,52, +33,-84, +-316,-133, +145,-116, +-74,24, +149,-99, +-110,-217, +-120,-95, +-31,27, +-6,207, +243,200, +-167,139, +-13,-75, +-2,145, +-9,19, +-43,82, +-14,31, +-92,111, +14,121, +-108,-44, +-112,28, +-190,-145, +181,218, +16,-7, +192,2, +85,106, +-293,-113, +-54,-82, +-1,-85, +-84,-126, +-67,-67, +13,40, +-137,81, +143,137, +-160,151, +-36,-10, +181,-19, +213,70, +46,-53, +31,25, +-8,-84, +-63,9, +125,-240, +-97,-34, +4,22, +93,-181, +51,104, +309,-141, +24,-46, +138,29, +144,143, +54,36, +-142,-156, +74,122, +-29,41, +-12,159, +-99,69, +38,-132, +129,157, +84,-79, +-105,155, +-27,-90, +456,-170, +-318,124, +-19,-115, +81,-80, +-85,-101, +-44,33, +-6,96, +28,-187, +157,-24, +-77,311, +-77,-31, +-112,225, +200,-6, +124,-59, +71,-30, +-15,-1, +119,-56, +-65,163, +68,-154, +-4,62, +1,-30, +228,107, +-1,-62, +179,-14, +180,-121, +194,46, +165,-23, +-44,98, +-158,29, +-230,-1, +91,-198, +-16,-144, +242,-23, +89,-96, +251,83, +-345,231, +-90,-23, +114,304, +117,-72, +-72,-63, +113,1, +-135,26, +-123,-75, +-10,-257, +162,-81, +-4,255, +71,-33, +69,-111, +40,53, +-17,-30, +73,67, +127,-117, +-46,110, +-2,212, +91,-278, +66,-108, +103,-76, +21,-301, +-107,-109, +-168,9, +-211,-95, +345,102, +-264,-82, +-39,145, +194,-474, +-97,168, +186,-29, +92,-34, +-8,-71, +23,-116, +-64,6, +142,-124, +76,172, +-79,47, +-69,-68, +135,-89, +189,-64, +80,-319, +32,-15, +46,131, +146,40, +-134,200, +213,-120, +81,46, +-74,-52, +-14,-83, +40,10, +55,138, +191,62, +-86,-185, +-68,-141, +62,53, +-115,244, +-146,139, +-66,-202, +-115,20, +-16,50, +-58,129, +29,-186, +185,32, +-99,-202, +218,57, +82,211, +39,-6, +-50,-222, +72,99, +45,79, +-64,46, +113,222, +108,69, +-78,-271, +-301,29, +-44,157, +232,31, +368,-117, +-21,-18, +108,267, +-134,33, +-42,-76, +140,36, +-202,75, +-234,-89, +-68,35, +16,-100, +-6,-14, +-8,-34, +-151,104, +199,-140, +97,86, +0,-59, +-80,-72, +-62,-66, +72,93, +123,20, +26,20, +-205,188, +158,-54, +171,-82, +-120,140, +-12,1, +-79,-122, +151,-66, +-63,50, +139,14, +-65,-84, +-70,-47, +10,-80, +-55,-98, +-125,55, +-211,-52, +-36,-103, +39,98, +-44,50, +-169,41, +208,86, +128,-227, +52,139, +45,-67, +-170,82, +3,82, +-133,-94, +2,-45, +-95,-54, +29,-216, +-52,-150, +-207,-187, +-110,-135, +-36,92, +-35,-20, +117,6, +-90,64, +192,361, +226,-92, +-18,-8, +38,6, +-113,136, +0,-29, +-113,62, +-283,190, +-51,105, +95,117, +163,36, +80,-5, +55,157, +-27,-81, +128,267, +-84,-13, +-64,116, +-16,43, +149,33, +61,112, +224,-31, +-76,-141, +82,63, +-166,44, +-90,40, +20,-79, +19,92, +20,-237, +97,-77, +-52,-139, +82,34, +61,-69, +-13,-25, +96,-52, +34,30, +-91,-130, +-24,207, +24,-104, +66,-136, +-27,187, +74,-22, +161,-40, +24,-46, +-34,119, +-116,-24, +-50,120, +-168,6, +128,213, +35,199, +-22,111, +-71,157, +-95,27, +6,215, +410,-105, +135,102, +-78,44, +6,0, +253,-132, +14,-32, +-81,-255, +-251,37, +92,67, +-90,118, +-93,-160, +163,-244, +-2,25, +-10,105, +-35,57, +-47,77, +70,27, +231,125, +-114,206, +134,49, +-213,274, +-4,-57, +246,-44, +-44,111, +-112,86, +-235,60, +291,-109, +-49,-136, +-97,176, +-33,179, +34,-134, +-78,169, +-2,-66, +-125,175, +-106,157, +-192,-66, +207,65, +26,140, +-267,-115, +-125,121, +174,182, +-93,162, +-29,-115, +66,-46, +200,71, +20,-104, +-18,28, +-20,-66, +33,-264, +-75,-256, +-134,91, +-10,-23, +6,-50, +-14,-244, +-156,-31, +63,-49, +-158,-53, +-155,36, +163,84, +-62,123, +-166,-63, +5,-30, +136,-115, +91,-168, +44,175, +-43,-180, +-78,-163, +-270,23, +-78,32, +-135,-13, +32,-36, +104,94, +296,61, +-106,-89, +46,-149, +-234,-127, +150,5, +57,33, +-33,-136, +11,110, +-40,-187, +-192,344, +-148,-6, +74,226, +198,79, +91,-207, +79,166, +283,57, +-46,162, +82,-240, +-8,314, +-49,36, +-14,166, +-132,-7, +-12,79, +45,40, +-229,-87, +72,-233, +-1,174, +168,99, +75,-152, +-133,163, +-136,242, +32,-226, +12,216, +-183,-111, +-52,-112, +-174,-299, +117,80, +91,-68, +95,-171, +14,222, +-225,41, +-153,-15, +195,60, +18,37, +166,-47, +37,280, +-17,147, +24,-151, +-167,161, +-82,-15, +10,-177, +61,-75, +257,30, +-22,141, +-19,-117, +-101,103, +2,-248, +27,-275, +11,65, +-123,77, +67,75, +-70,-10, +-105,-86, +-9,73, +-263,212, +-48,-304, +247,-39, +-137,236, +189,72, +-3,-190, +-134,-91, +140,56, +15,147, +18,-30, +-1,-102, +-143,23, +-233,229, +183,-155, +-2,-80, +-61,74, +-75,52, +122,23, +-14,-110, +86,-139, +-91,-12, +126,-108, +-6,67, +70,88, +-112,90, +37,-15, +-159,-84, +1,-43, +-191,-168, +-72,-14, +101,-51, +232,-197, +27,-219, +37,33, +-98,32, +37,52, +-64,64, +2,178, +-41,104, +149,-56, +-21,-8, +-57,35, +72,187, +1,-113, +120,-103, +-175,63, +-127,44, +70,134, +28,56, +-42,-125, +-62,2, +145,-29, +-180,-112, +118,-35, +352,-38, +-167,-26, +-44,85, +115,-120, +206,-97, +2,21, +69,31, +80,20, +234,182, +127,3, +92,-274, +245,71, +156,99, +-270,84, +180,-17, +-211,-161, +234,115, +39,272, +44,121, +-28,-112, +-77,151, +-48,-233, +-53,-54, +90,-178, +23,100, +108,-267, +182,-17, +-97,-86, +33,-195, +-149,-303, +-211,143, +-43,-29, +-37,4, +42,97, +116,180, +-141,145, +126,79, +18,-16, +43,-40, +-166,160, +-214,-73, +247,24, +27,-147, +158,-98, +-68,-31, +-165,-98, +0,-6, +-20,130, +258,-15, +-163,-250, +-84,-45, +-80,-40, +-120,-22, +-111,177, +-124,39, +106,141, +-42,53, +-168,41, +-49,191, +-196,79, +-158,30, +52,-174, +-57,-111, +100,148, +-113,-3, +5,108, +-54,128, +40,140, +-95,-8, +-199,153, +170,9, +169,105, +157,-196, +59,3, +-60,149, +-141,91, +6,-52, +-128,1, +-231,14, +76,103, +2,-151, +310,-226, +-165,86, +30,192, +-79,8, +11,13, +115,-56, +-59,-123, +-50,-27, +-65,23, +6,-111, +132,77, +-42,-114, +-10,69, +8,95, +-32,-3, +85,47, +-1,49, +-3,-11, +-122,106, +-165,36, +31,-5, +-114,132, +-1,-100, +-34,79, +68,-30, +72,109, +-200,69, +34,39, +-51,-43, +-11,-18, +82,188, +299,77, +172,156, +80,-105, +51,28, +121,-52, +-38,9, +-31,110, +-28,-75, +-6,-59, +-37,120, +4,-174, +59,-231, +32,81, +136,-41, +140,-52, +206,33, +-21,110, +67,121, +-22,-178, +87,22, +186,-165, +5,-114, +-5,182, +209,-115, +210,-206, +17,-79, +112,-200, +76,136, +26,149, +-83,79, +58,117, +73,101, +186,220, +77,-289, +30,86, +-29,-40, +-192,16, +177,77, +-196,108, +20,-40, +59,150, +-7,45, +-2,-16, +7,71, +90,134, +-90,2, +11,-128, +99,10, +-43,-76, +-30,-142, +20,111, +-163,-23, +244,64, +163,-199, +13,-13, +-92,14, +66,-65, +17,-71, +110,70, +79,-70, +184,-102, +-11,-27, +-100,-7, +100,-50, +58,137, +177,124, +-49,95, +-164,-34, +-87,0, +251,39, +176,28, +-100,25, +-37,13, +94,-25, +2,105, +-47,55, +242,-58, +91,41, +112,175, +-100,241, +112,-6, +-62,44, +-98,132, +8,3, +44,0, +-162,29, +-78,-38, +-262,-182, +18,27, +174,-68, +3,-60, +-44,136, +35,109, +114,-71, +55,129, +101,-44, +-81,211, +31,22, +-90,-12, +-66,53, +158,-43, +88,-59, +170,152, +68,-36, +-30,141, +103,-64, +115,-76, +-156,3, +36,-87, +31,-121, +104,-37, +108,-70, +112,-63, +-36,128, +-71,-27, +-70,19, +-203,-72, +-87,-36, +-2,-116, +-38,80, +25,26, +-139,-139, +24,32, +9,-16, +-70,-141, +74,-147, +40,99, +-19,21, +-1,214, +110,70, +117,-27, +62,193, +155,-9, +-120,42, +4,207, +-4,-70, +23,178, +-15,-20, +109,79, +-48,-16, +-156,-50, +-113,-107, +-72,-23, +49,33, +-68,-18, +49,126, +-67,78, +39,19, +83,108, +31,-72, +116,-20, +154,-125, +-110,-194, +52,-9, +-107,-120, +-144,192, +44,92, +-85,107, +-75,16, +111,-10, +-115,-155, +-105,-6, +25,46, +-80,-58, +120,21, +-18,115, +60,-94, +51,43, +167,-16, +87,54, +-120,-109, +1,71, +-7,-98, +42,-20, +-38,77, +124,-90, +-80,13, +-61,2, +102,-72, +164,65, +25,-92, +-128,-39, +14,124, +-47,64, +3,27, +19,-1, +-49,-17, +-111,-136, +-198,-34, +40,-23, +23,145, +-80,45, +-32,51, +-222,-20, +158,-137, +52,86, +37,-46, +-125,34, +102,3, +-41,47, +104,76, +-3,-81, +25,143, +1,-16, +-79,-32, +-51,-152, +14,-86, +17,164, +-195,-176, +-42,126, +92,-16, +-110,-42, +124,-11, +6,169, +48,-114, +-60,103, +64,-3, +-76,-81, +114,-82, +-111,-75, +70,46, +-146,-43, +-155,-75, +158,-26, +-25,39, +48,50, +-13,-41, +85,150, +22,-73, +-53,-5, +96,-48, +-73,163, +-6,-34, +-78,18, +34,-225, +118,15, +25,54, +93,-71, +-119,-69, +-80,-174, +-26,-24, +3,28, +-5,-26, +122,5, +47,-58, +-21,-35, +-14,-41, +-73,168, +57,119, +-34,-110, +-64,-7, +57,41, +-40,50, +-9,-66, +13,100, +-93,-81, +52,-66, +-65,72, +77,136, +-61,60, +26,8, +13,90, +50,-67, +-24,114, +-5,-89, +5,-109, +-85,33, +-94,-54, +97,-1, +30,-8, +134,-95, +65,-29, +55,-58, +-190,-106, +-25,93, +-127,7, +-114,108, +102,88, +-47,7, +61,30, +113,23, +10,-82, +57,65, +10,-49, +-45,-9, +-54,-105, +-53,-138, +-4,-6, +12,44, +119,31, +-74,-25, +178,52, +1,-79, +57,15, +102,8, +-16,131, +97,57, +54,75, +52,27, +173,-41, +-46,54, +-62,23, +-106,-9, +-8,-22, +-20,-6, +-35,-13, +-29,-109, +48,74, +-13,-24, +-127,-124, +35,-60, +-51,-109, +37,-59, +31,21, +16,40, +-84,89, +-39,73, +-48,64, +-85,-76, +-18,18, +-14,-10, +-44,80, +3,41, +158,-12, +-82,105, +57,167, +3,-25, +-74,33, +70,-31, +63,-102, +-33,84, +197,-17, +-82,53, +9,98, +107,24, +46,-75, +-41,66, +10,88, +-59,-30, +-64,-67, +-53,-184, +34,-7, +-23,-13, +34,1, +66,-52, +18,-19, +40,-4, +100,59, +163,-69, +-1,183, +-30,75, +42,6, +50,-5, +13,60, +-25,-30, +38,-51, +21,105, +0,147, +20,-23, +-10,-149, +8,21, +149,54, +29,102, +-12,-9, +6,-5, +-24,-22, +-83,70, +4,137, +-3,-29, +-24,72, +-32,26, +4,-63, +-43,-11, +-27,175, +-92,20, +115,31, +-25,-68, +-44,-8, +-42,13, +-21,16, +-39,14, +-35,-17, +104,-10, +38,69, +-37,-49, +80,16, +24,55, +24,-66, +38,26, +57,-74, +-24,53, +56,-112, +-83,22, +4,106, +-42,22, +186,94, +-5,16, +44,-43, +143,-9, +-25,96, +-6,-2, +-110,48, +-106,115, +-6,89, +13,10, +2,22, +-86,60, +-67,69, +34,11, +-61,-35, +127,78, +26,34, +-99,113, +68,55, +-17,27, +-115,13, +-47,20, +6,-24, +0,-19, +-26,14, +15,-44, +40,1, +-22,43, +-44,51, +45,6, +-28,119, +122,125, +45,52, +7,-24, +-19,21, +11,-63, +47,-4, +23,-36, +43,53, +-48,19, +52,-73, +-24,24, +44,-47, +24,-43, +2,-65, +49,-18, +-1,37, +1,-11, +46,30, +15,-15, +5,-25, +35,31, +-78,5, +35,36, +-16,-24, +-38,-60, +-20,25, +-29,10, +-30,16, +51,-2, +63,-71, +17,58, +-60,-22, +-81,148, +13,-67, +71,-66, +-56,-32, +-8,-42, +62,-29, +40,-29, +-17,16, +-9,59, +-60,110, +97,9, +8,-26, +19,-63, +44,1, +81,23, +-4,-57, +52,19, +17,-29, +-23,47, +-68,-34, +-11,-44, +74,-54, +24,-70, +56,-22, +19,-23, +8,3, +95,16, +-4,-97, +19,-27, +12,-8, +-74,-87, +-50,12, +-14,14, +31,77, +12,-71, +-25,-26, +-41,-6, +-19,-16, +-28,115, +-61,-11, +58,-13, +-7,-75, +11,-15, +-2,68, +19,-33, +50,27, +72,-16, +36,34, +-26,9, +41,-61, +-12,-39, +-48,-41, +-112,-49, +10,49, +-49,2, +-33,46, +-42,43, +35,-18, +-123,11, +24,-19, +-28,-31, +6,-11, +26,17, +91,42, +23,-17, +-21,85, +-36,-111, +31,38, +65,7, +-36,51, +-34,70, +-17,31, +40,36, +35,79, +-6,-15, +4,5, +-24,68, +-24,53, +-7,-72, +26,29, +-21,48, +-30,36, +-3,-1, +-19,-30, +-23,39, +5,-36, +-11,8, +29,26, +51,-40, +-19,-36, +-24,1, +2,50, +0,-27, +52,2, +-20,15, +-16,-6, +34,34, +45,-26, +20,-6, +2,-3, +29,4, +-14,-34, +-43,47, +-53,40, +-12,25, +-14,-16, +-19,-30, +-38,-47, +-2,22, +-8,-45, +13,5, +38,0, +-5,21, +-1,-11, +-29,35, +-14,-32, +-27,27, +-13,21, +37,-14, +7,-36, +-36,45, +5,-11, +10,-18, +30,-36, +-27,-14, +-11,8, +29,29, +27,-18, +-36,10, +-36,4, +23,-17, +45,54, +-25,-14, +-23,5, +-4,-20, +45,-54, +-18,9, +-20,-4, +27,-27, +27,18, +-17,-18, +-29,2, +-42,11, +-22,-16, +38,-29, +-25,35, +31,12, +-11,32, +-52,0, +21,-28, +9,-11, +-12,-15, +17,8, +49,11, +2,6, +-11,41, +28,-4, +-15,-5, +15,-35, +27,-18, +-12,33, +-27,19, +15,-11, +-23,15, +-71,-44, +51,-14, +-28,6, +3,-4, +27,-19, +17,-12, +-13,3, +14,19, +15,26, +-17,-29, +-27,4, +15,-14, +5,-3, +9,-2, +2,-20, +41,2, +-5,6, +19,-10, +-25,22, +44,10, +-5,27, +-9,7, +3,19, +19,19, +30,-25, +-9,-24, +36,2, +-35,-6, +8,-3, +4,16, +-11,-4, +-6,3, +-15,-27, +-17,19, +10,8, +13,26, +-9,-5, +-3,-8, +14,-16, +-10,-14, +-16,-22, +1,8, +-13,1, +8,4, +-17,20, +-14,-3, +11,-20, +0,7, +7,2, +7,-8, +-6,-8, +-6,-6, +-2,0, +-10,-10, +-21,5, +16,-3, +-3,-9, +-19,-5, +-14,0, +-4,2, +-7,-4, +5,4, +-3,10, +-4,9, +0,-9, +3,3, +15,3, +3,-4, +0,-14, +0,1, +7,7, +0,-1, +0,-15, +11,2, +5,-3, +-11,-4, +13,2, +0,0, +1,-8, +7,5, +-10,3, +-3,0, +14,-11, +-3,6, +-4,3, +9,-1, +-3,0, +4,-5, +8,5, +0,1, +-1,2, +6,0, +-1,-1, +-1,-1, +5,2, +-5,0, +-5,0, +6,0, +-1,-1, +-4,0, +5,-1, +-3,1, +-3,0, +6,0, +-3,0, +-3,-1, +5,1, +-4,0, +-1,1, +6,0, +-5,0, +-5,0, +5,-2, +-1,1, +-1,1, +6,0, +-1,-2, +0,-1, +8,-5, +4,5, +-3,0, +9,1, +-4,-3, +-3,-6, +14,11, +-3,0, +-10,-3, +7,-5, +1,8, +0,0, +13,-2, +-11,4, +5,3, +11,-2, +0,15, +0,1, +7,-7, +0,-1, +0,14, +3,4, +15,-3, +3,-3, +0,9, +-4,-9, +-3,-10, +5,-4, +-7,4, +-4,-2, +-14,0, +-19,5, +-3,9, +16,3, +-21,-5, +-10,10, +-2,0, +-6,6, +-6,8, +7,8, +7,-2, +0,-7, +11,20, +-14,3, +-17,-20, +8,-4, +-13,-1, +1,-8, +-16,22, +-10,14, +14,16, +-3,8, +-9,5, +13,-26, +10,-8, +-17,-19, +-15,27, +-6,-3, +-11,4, +4,-16, +8,3, +-35,6, +36,-2, +-9,24, +30,25, +19,-19, +3,-19, +-9,-7, +-5,-27, +44,-10, +-25,-22, +19,10, +-5,-6, +41,-2, +2,20, +9,2, +5,3, +15,14, +-27,-4, +-17,29, +15,-26, +14,-19, +-13,-3, +17,12, +27,19, +3,4, +-28,-6, +51,14, +-71,44, +-23,-15, +15,11, +-27,-19, +-12,-33, +27,18, +15,35, +-15,5, +28,4, +-11,-41, +2,-6, +49,-11, +17,-8, +-12,15, +9,11, +21,28, +-52,0, +-11,-32, +31,-12, +-25,-35, +38,29, +-22,16, +-42,-11, +-29,-2, +-17,18, +27,-18, +27,27, +-20,4, +-18,-9, +45,54, +-4,20, +-23,-5, +-25,14, +45,-54, +23,17, +-36,-4, +-36,-10, +27,18, +29,-29, +-11,-8, +-27,14, +30,36, +10,18, +5,11, +-36,-45, +7,36, +37,14, +-13,-21, +-27,-27, +-14,32, +-29,-35, +-1,11, +-5,-21, +38,0, +13,-5, +-8,45, +-2,-22, +-38,47, +-19,30, +-14,16, +-12,-25, +-53,-40, +-43,-47, +-14,34, +29,-4, +2,3, +20,6, +45,26, +34,-34, +-16,6, +-20,-15, +52,-2, +0,27, +2,-50, +-24,-1, +-19,36, +51,40, +29,-26, +-11,-8, +5,36, +-23,-39, +-19,30, +-3,1, +-30,-36, +-21,-48, +26,-29, +-7,72, +-24,-53, +-24,-68, +4,-5, +-6,15, +35,-79, +40,-36, +-17,-31, +-34,-70, +-36,-51, +65,-7, +31,-38, +-36,111, +-21,-85, +23,17, +91,-42, +26,-17, +6,11, +-28,31, +24,19, +-123,-11, +35,18, +-42,-43, +-33,-46, +-49,-2, +10,-49, +-112,49, +-48,41, +-12,39, +41,61, +-26,-9, +36,-34, +72,16, +50,-27, +19,33, +-2,-68, +11,15, +-7,75, +58,13, +-61,11, +-28,-115, +-19,16, +-41,6, +-25,26, +12,71, +31,-77, +-14,-14, +-50,-12, +-74,87, +12,8, +19,27, +-4,97, +95,-16, +8,-3, +19,23, +56,22, +24,70, +74,54, +-11,44, +-68,34, +-23,-47, +17,29, +52,-19, +-4,57, +81,-23, +44,-1, +19,63, +8,26, +97,-9, +-60,-110, +-9,-59, +-17,-16, +40,29, +62,29, +-8,42, +-56,32, +71,66, +13,67, +-81,-148, +-60,22, +17,-58, +63,71, +51,2, +-30,-16, +-29,-10, +-20,-25, +-38,60, +-16,24, +35,-36, +-78,-5, +35,-31, +5,25, +15,15, +46,-30, +1,11, +-1,-37, +49,18, +2,65, +24,43, +44,47, +-24,-24, +52,73, +-48,-19, +43,-53, +23,36, +47,4, +11,63, +-19,-21, +7,24, +45,-52, +122,-125, +-28,-119, +45,-6, +-44,-51, +-22,-43, +40,-1, +15,44, +-26,-14, +0,19, +6,24, +-47,-20, +-115,-13, +-17,-27, +68,-55, +-99,-113, +26,-34, +127,-78, +-61,35, +34,-11, +-67,-69, +-86,-60, +2,-22, +13,-10, +-6,-89, +-106,-115, +-110,-48, +-6,2, +-25,-96, +143,9, +44,43, +-5,-16, +186,-94, +-42,-22, +4,-106, +-83,-22, +56,112, +-24,-53, +57,74, +38,-26, +24,66, +24,-55, +80,-16, +-37,49, +38,-69, +104,10, +-35,17, +-39,-14, +-21,-16, +-42,-13, +-44,8, +-25,68, +115,-31, +-92,-20, +-27,-175, +-43,11, +4,63, +-32,-26, +-24,-72, +-3,29, +4,-137, +-83,-70, +-24,22, +6,5, +-12,9, +29,-102, +149,-54, +8,-21, +-10,149, +20,23, +0,-147, +21,-105, +38,51, +-25,30, +13,-60, +50,5, +42,-6, +-30,-75, +-1,-183, +163,69, +100,-59, +40,4, +18,19, +66,52, +34,-1, +-23,13, +34,7, +-53,184, +-64,67, +-59,30, +10,-88, +-41,-66, +46,75, +107,-24, +9,-98, +-82,-53, +197,17, +-33,-84, +63,102, +70,31, +-74,-33, +3,25, +57,-167, +-82,-105, +158,12, +3,-41, +-44,-80, +-14,10, +-18,-18, +-85,76, +-48,-64, +-39,-73, +-84,-89, +16,-40, +31,-21, +37,59, +-51,109, +35,60, +-127,124, +-13,24, +48,-74, +-29,109, +-35,13, +-20,6, +-8,22, +-106,9, +-62,-23, +-46,-54, +173,41, +52,-27, +54,-75, +97,-57, +-16,-131, +102,-8, +57,-15, +1,79, +178,-52, +-74,25, +119,-31, +12,-44, +-4,6, +-53,138, +-54,105, +-45,9, +10,49, +57,-65, +10,82, +113,-23, +61,-30, +-47,-7, +102,-88, +-114,-108, +-127,-7, +-25,-93, +-190,106, +55,58, +65,29, +134,95, +30,8, +97,1, +-94,54, +-85,-33, +5,109, +-5,89, +-24,-114, +50,67, +13,-90, +26,-8, +-61,-60, +77,-136, +-65,-72, +52,66, +-93,81, +13,-100, +-9,66, +-40,-50, +57,-41, +-64,7, +-34,110, +57,-119, +-73,-168, +-14,41, +-21,35, +47,58, +122,-5, +-5,26, +3,-28, +-26,24, +-80,174, +-119,69, +93,71, +25,-54, +118,-15, +34,225, +-78,-18, +-6,34, +-73,-163, +96,48, +-53,5, +22,73, +85,-150, +-13,41, +48,-50, +-25,-39, +158,26, +-155,75, +-146,43, +70,-46, +-111,75, +114,82, +-76,81, +64,3, +-60,-103, +48,114, +6,-169, +124,11, +-110,42, +92,16, +-42,-126, +-195,176, +17,-164, +14,86, +-51,152, +-79,32, +1,16, +25,-143, +-3,81, +104,-76, +-41,-47, +102,-3, +-125,-34, +37,46, +52,-86, +158,137, +-222,20, +-32,-51, +-80,-45, +23,-145, +40,23, +-198,34, +-111,136, +-49,17, +19,1, +3,-27, +-47,-64, +14,-124, +-128,39, +25,92, +164,-65, +102,72, +-61,-2, +-80,-13, +124,90, +-38,-77, +42,20, +-7,98, +1,-71, +-120,109, +87,-54, +167,16, +51,-43, +60,94, +-18,-115, +120,-21, +-80,58, +25,-46, +-105,6, +-115,155, +111,10, +-75,-16, +-85,-107, +44,-92, +-144,-192, +-107,120, +52,9, +-110,194, +154,125, +116,20, +31,72, +83,-108, +39,-19, +-67,-78, +49,-126, +-68,18, +49,-33, +-72,23, +-113,107, +-156,50, +-48,16, +109,-79, +-15,20, +23,-178, +-4,70, +4,-207, +-120,-42, +155,9, +62,-193, +117,27, +110,-70, +-1,-214, +-19,-21, +40,-99, +74,147, +-70,141, +9,16, +24,-32, +-139,139, +25,-26, +-38,-80, +-2,116, +-87,36, +-203,72, +-70,-19, +-71,27, +-36,-128, +112,63, +108,70, +104,37, +31,121, +36,87, +-156,-3, +115,76, +103,64, +-30,-141, +68,36, +170,-152, +88,59, +158,43, +-66,-53, +-90,12, +31,-22, +-81,-211, +101,44, +55,-129, +114,71, +35,-109, +-44,-136, +3,60, +174,68, +18,-27, +-262,182, +-78,38, +-162,-29, +44,0, +8,-3, +-98,-132, +-62,-44, +112,6, +-100,-241, +112,-175, +91,-41, +242,58, +-47,-55, +2,-105, +94,25, +-37,-13, +-100,-25, +176,-28, +251,-39, +-87,0, +-164,34, +-49,-95, +177,-124, +58,-137, +100,50, +-100,7, +-11,27, +184,102, +79,70, +110,-70, +17,71, +66,65, +-92,-14, +13,13, +163,199, +244,-64, +-163,23, +20,-111, +-30,142, +-43,76, +99,-10, +11,128, +-90,-2, +90,-134, +7,-71, +-2,16, +-7,-45, +59,-150, +20,40, +-196,-108, +177,-77, +-192,-16, +-29,40, +30,-86, +77,289, +186,-220, +73,-101, +58,-117, +-83,-79, +26,-149, +76,-136, +112,200, +17,79, +210,206, +209,115, +-5,-182, +5,114, +186,165, +87,-22, +-22,178, +67,-121, +-21,-110, +206,-33, +140,52, +136,41, +32,-81, +59,231, +4,174, +-37,-120, +-6,59, +-28,75, +-31,-110, +-38,-9, +121,52, +51,-28, +80,105, +172,-156, +299,-77, +82,-188, +-11,18, +-51,43, +34,-39, +-200,-69, +72,-109, +68,30, +-34,-79, +-1,100, +-114,-132, +31,5, +-165,-36, +-122,-106, +-3,11, +-1,-49, +85,-47, +-32,3, +8,-95, +-10,-69, +-42,114, +132,-77, +6,111, +-65,-23, +-50,27, +-59,123, +115,56, +11,-13, +-79,-8, +30,-192, +-165,-86, +310,226, +2,151, +76,-103, +-231,-14, +-128,-1, +6,52, +-141,-91, +-60,-149, +59,-3, +157,196, +169,-105, +170,-9, +-199,-153, +-95,8, +40,-140, +-54,-128, +5,-108, +-113,3, +100,-148, +-57,111, +52,174, +-158,-30, +-196,-79, +-49,-191, +-168,-41, +-42,-53, +106,-141, +-124,-39, +-111,-177, +-120,22, +-80,40, +-84,45, +-163,250, +258,15, +-20,-130, +0,6, +-165,98, +-68,31, +158,98, +27,147, +247,-24, +-214,73, +-166,-160, +43,40, +18,16, +126,-79, +-141,-145, +116,-180, +42,-97, +-37,-4, +-43,29, +-211,-143, +-149,303, +33,195, +-97,86, +182,17, +108,267, +23,-100, +90,178, +-53,54, +-48,233, +-77,-151, +-28,112, +44,-121, +39,-272, +234,-115, +-211,161, +180,17, +-270,-84, +156,-99, +245,-71, +92,274, +127,-3, +234,-182, +80,-20, +69,-31, +2,-21, +206,97, +115,120, +-44,-85, +-167,26, +352,38, +118,35, +-180,112, +145,29, +-62,-2, +-42,125, +28,-56, +70,-134, +-127,-44, +-175,-63, +120,103, +1,113, +72,-187, +-57,-35, +-21,8, +149,56, +-41,-104, +2,-178, +-64,-64, +37,-52, +-98,-32, +37,-33, +27,219, +232,197, +101,51, +-72,14, +-191,168, +1,43, +-159,84, +37,15, +-112,-90, +70,-88, +-6,-67, +126,108, +-91,12, +86,139, +-14,110, +122,-23, +-75,-52, +-61,-74, +-2,80, +183,155, +-233,-229, +-143,-23, +-1,102, +18,30, +15,-147, +140,-56, +-134,91, +-3,190, +189,-72, +-137,-236, +247,39, +-48,304, +-263,-212, +-9,-73, +-105,86, +-70,10, +67,-75, +-123,-77, +11,-65, +27,275, +2,248, +-101,-103, +-19,117, +-22,-141, +257,-30, +61,75, +10,177, +-82,15, +-167,-161, +24,151, +-17,-147, +37,-280, +166,47, +18,-37, +195,-60, +-153,15, +-225,-41, +14,-222, +95,171, +91,68, +117,-80, +-174,299, +-52,112, +-183,111, +12,-216, +32,226, +-136,-242, +-133,-163, +75,152, +168,-99, +-1,-174, +72,233, +-229,87, +45,-40, +-12,-79, +-132,7, +-14,-166, +-49,-36, +-8,-314, +82,240, +-46,-162, +283,-57, +79,-166, +91,207, +198,-79, +74,-226, +-148,6, +-192,-344, +-40,187, +11,-110, +-33,136, +57,-33, +150,-5, +-234,127, +46,149, +-106,89, +296,-61, +104,-94, +32,36, +-135,13, +-78,-32, +-270,-23, +-78,163, +-43,180, +44,-175, +91,168, +136,115, +5,30, +-166,63, +-62,-123, +163,-84, +-155,-36, +-158,53, +63,49, +-156,31, +-14,244, +6,50, +-10,23, +-134,-91, +-75,256, +33,264, +-20,66, +-18,-28, +20,104, +200,-71, +66,46, +-29,115, +-93,-162, +174,-182, +-125,-121, +-267,115, +26,-140, +207,-65, +-192,66, +-106,-157, +-125,-175, +-2,66, +-78,-169, +34,134, +-33,-179, +-97,-176, +-49,136, +291,109, +-235,-60, +-112,-86, +-44,-111, +246,44, +-4,57, +-213,-274, +134,-49, +-114,-206, +231,-125, +70,-27, +-47,-77, +-35,-57, +-10,-105, +-2,-25, +163,244, +-93,160, +-90,-118, +92,-67, +-251,-37, +-81,255, +14,32, +253,132, +11,0, +-60,117, +-135,-57, +325,20, +-105,163, +59,-48, +102,-24, +-103,61, +-11,-32, +-119,69, +87,-46, +-80,-34, +317,107, +28,77, +-90,82, +59,-22, +47,181, +-136,-41, +37,-97, +80,2, +-195,133, +-3,-223, +-37,62, +-67,-3, +-309,-108, +5,186, +-28,-23, +2,128, +100,-3, +-176,-56, +-78,-124, +-115,53, +101,-119, +82,103, +130,-58, +149,-85, +-104,-133, +83,114, +47,152, +-27,128, +-5,183, +45,52, +232,-78, +157,-82, +86,-74, +-140,-82, +39,219, +-103,-93, +128,35, +-5,-100, +-85,-45, +261,-66, +-7,-147, +-181,-85, +-171,80, +255,-117, +93,152, +138,14, +43,-120, +-224,-259, +59,-89, +-73,-137, +-272,-128, +-193,-14, +-16,9, +-170,-84, +89,-490, +93,116, +168,326, +82,190, +82,44, +155,224, +246,40, +-206,101, +-47,-127, +-35,38, +59,-136, +-51,76, +74,-62, +-170,222, +-176,-20, +10,167, +-29,-103, +64,55, +-158,15, +-111,109, +54,-77, +-130,-41, +-89,157, +110,-18, +61,-117, +115,-97, +161,-62, +-14,283, +-45,-62, +12,-16, +27,32, +141,104, +-70,-57, +59,-89, +-72,-94, +-102,-123, +-276,-138, +70,26, +-202,-3, +-30,-217, +48,116, +-140,-2, +-89,68, +-25,-48, +14,114, +-65,10, +78,-64, +77,209, +-52,151, +-102,104, +19,60, +-21,-56, +-41,59, +97,114, +-95,-172, +-364,330, +162,-116, +133,35, +103,-136, +49,-124, +-62,164, +4,46, +225,28, +-62,-86, +52,-9, +-33,-83, +-82,-123, +-17,116, +21,-90, +54,161, +-38,280, +206,171, +167,-28, +36,105, +45,18, +22,-300, +17,-38, +107,99, +-92,20, +117,-86, +-114,-40, +-38,-47, +54,18, +24,-113, +152,-122, +308,181, +155,-200, +-67,-24, +-92,-5, +-44,237, +-54,-79, +-30,147, +222,-183, +50,216, +-150,-96, +175,52, +235,-58, +37,-199, +15,-32, +231,-242, +-123,-65, +-22,32, +131,-48, +24,174, +34,-141, +164,-28, +-72,123, +-142,13, +49,-132, +0,-167, +123,-67, +-120,-4, +92,72, +-35,86, +105,-54, +-41,-42, +71,88, +-12,125, +178,158, +152,267, +128,109, +-141,13, +29,-47, +45,28, +50,85, +37,199, +-90,-125, +25,70, +-99,121, +130,-8, +-191,-13, +-31,-145, +-30,114, +120,-70, +-177,93, +-122,32, +-52,97, +-138,-47, +-21,-90, +103,18, +100,-86, +144,37, +-10,21, +95,76, +35,6, +-39,-77, +71,56, +1,159, +-21,-86, +134,50, +-75,64, +6,83, +102,64, +133,-37, +120,-146, +235,55, +-186,-14, +34,39, +-62,-150, +41,42, +168,-171, +-144,-35, +52,180, +-92,-32, +0,-190, +-82,11, +109,-138, +-144,-79, +10,65, +-17,9, +-14,80, +2,97, +6,-16, +-56,-76, +72,-48, +-41,81, +-5,-54, +30,-221, +88,153, +-41,-98, +53,-38, +-138,222, +-68,-48, +-141,5, +-92,-296, +-157,14, +101,5, +-220,-148, +-233,39, +59,87, +-12,-4, +144,-125, +-5,-28, +-57,-200, +14,5, +20,-12, +70,-65, +-58,-37, +72,-124, +74,122, +-307,-3, +45,-151, +95,43, +69,233, +10,10, +-73,-198, +83,108, +209,10, +23,-5, +34,171, +28,-161, +-93,84, +342,22, +51,182, +-151,-73, +-22,-101, +151,94, +1,68, +73,88, +-232,-30, +-228,119, +132,174, +-83,-87, +185,42, +-40,130, +177,114, +81,-94, +68,40, +194,-100, +-202,180, +-86,180, +-20,-9, +-97,80, +-77,-68, +78,-39, +150,-18, +-130,34, +-31,103, +-136,-156, +-13,36, +-97,-135, +-77,26, +-220,174, +98,37, +-93,-28, +29,-192, +100,163, +-108,130, +41,-7, +-138,63, +23,21, +-228,-49, +-162,293, +-70,84, +-11,119, +27,26, +95,-24, +43,56, +-171,-143, +-32,-85, +114,203, +145,91, +119,106, +42,-23, +-92,21, +-8,-28, +-7,-105, +44,21, +6,37, +82,-97, +4,42, +-220,45, +72,-1, +-29,66, +145,169, +166,-168, +106,189, +-165,37, +-4,96, +-76,27, +-90,177, +72,240, +-94,-130, +-246,-79, +68,175, +-124,-122, +-39,-186, +49,64, +37,-10, +38,-101, +-19,-41, +-28,131, +89,68, +-131,-55, +168,40, +18,-45, +55,80, +2,100, +84,-9, +200,205, +200,83, +19,36, +-246,136, +48,37, +-45,17, +-291,-92, +-140,-236, +-32,9, +30,141, +59,32, +101,100, +109,-26, +-108,40, +-62,159, +-77,30, +-99,-16, +-100,58, +-225,41, +-179,25, +52,176, +28,-77, +94,-198, +-23,-52, +-161,-35, +-63,126, +-82,-57, +33,-47, +32,25, +-18,-49, +-230,-44, +178,-88, +-5,-83, +-27,-207, +-213,190, +-202,96, +80,-27, +-40,-222, +44,-111, +206,135, +79,61, +-11,-9, +-70,40, +-95,-110, +-161,158, +42,-59, +8,-17, +-82,41, +67,-46, +-53,11, +-131,-15, +66,-69, +-19,-85, +8,57, +125,122, +-47,128, +-172,-41, +118,59, +-105,40, +61,-99, +104,-43, +3,94, +-22,158, +-65,33, +35,70, +130,-136, +69,160, +-153,35, +-108,-41, +236,195, +-10,33, +-49,92, +7,-64, +-17,-72, +153,131, +-53,-104, +-115,-53, +-17,-23, +142,-145, +-2,172, +20,-52, +184,25, +120,-44, +-100,40, +160,1, +-103,-136, +200,231, +-40,-130, +348,109, +-118,29, +10,105, +1,-136, +-23,-118, +-125,61, +-206,24, +-13,-27, +-4,-49, +-81,-29, +133,-7, +155,121, +67,122, +-18,-2, +8,-93, +-11,-104, +-4,-122, +-75,-43, +12,131, +177,-74, +-78,75, +-117,20, +59,-14, +-103,114, +-29,-15, +-164,14, +174,179, +9,-71, +283,17, +61,105, +-31,33, +56,100, +144,26, +42,-110, +107,-59, +1,-51, +201,-80, +69,-86, +-41,-60, +61,-253, +-25,13, +120,123, +-202,100, +-31,25, +114,-46, +22,-144, +-7,158, +27,143, +-87,149, +50,-47, +-166,29, +66,-60, +-34,-166, +-164,-145, +-25,154, +121,190, +-128,-78, +-47,9, +-160,88, +107,73, +140,-24, +-85,-253, +11,73, +139,5, +148,-27, +-94,-90, +-228,-72, +-4,-18, +-7,50, +-7,-211, +65,108, +272,-27, +-11,-73, +-7,116, +-93,79, +-4,-107, +136,-30, +135,-76, +-93,145, +-89,-65, +-173,21, +-44,84, +-51,83, +-66,164, +-86,-61, +-34,131, +-14,132, +49,3, +135,-12, +14,136, +-11,76, +80,239, +-18,-62, +111,34, +32,-180, +-43,46, +116,-54, +10,-69, +-64,-14, +129,44, +-37,105, +14,-80, +-74,-71, +-145,80, +-62,-35, +19,-38, +79,98, +102,144, +29,33, +-67,37, +-20,-57, +-23,-53, +20,-67, +31,-202, +-66,-4, +-124,82, +28,-144, +175,97, +-133,55, +144,250, +-36,-152, +55,212, +-90,-79, +47,11, +23,93, +-104,134, +130,2, +-49,42, +41,76, +-100,-3, +-64,-98, +29,7, +-47,9, +57,120, +-66,-68, +-30,-81, +206,130, +-21,36, +53,-6, +69,-110, +-23,4, +78,127, +-91,38, +97,-58, +111,-56, +64,80, +-43,36, +-44,-17, +5,95, +32,-115, +28,-7, +14,-27, +156,5, +21,68, +-81,22, +-29,-65, +-1,2, +-46,-43, +41,-41, +-17,46, +-33,-28, +58,-30, +-39,-14, +76,-139, +-79,-43, +28,12, +77,66, +30,95, +-23,79, +-163,-7, +-79,-51, +181,-8, +0,-212, +-30,-94, +-132,188, +-26,-95, +-50,-7, +-9,-67, +-15,18, +-17,16, +-6,-2, +-4,-129, +94,-44, +-125,-19, +-119,6, +11,101, +21,-27, +85,-103, +21,-129, +1,-100, +19,-42, +38,-50, +48,-70, +69,-18, +5,9, +-26,117, +128,20, +40,-4, +-33,36, +-56,-152, +-135,-152, +7,-13, +107,-32, +-13,-72, +60,-61, +108,165, +12,123, +99,30, +26,36, +11,-10, +48,78, +-43,2, +1,54, +35,-81, +73,72, +-9,-20, +-92,-41, +40,106, +-4,-3, +-103,-83, +-33,60, +36,-101, +2,-68, +-66,-45, +71,-21, +186,-3, +-11,-32, +-14,-74, +177,-8, +-76,-1, +54,126, +16,52, +57,51, +6,-68, +31,-10, +-6,-70, +-13,52, +-10,51, +14,-37, +-34,41, +-47,-25, +23,-43, +17,13, +-13,78, +142,72, +35,64, +-18,-24, +-45,-70, +-43,-13, +56,84, +-3,4, +6,-22, +160,-7, +28,-117, +62,-86, +-9,-49, +-2,32, +44,-115, +56,66, +36,-4, +-1,-22, +-123,59, +94,-73, +73,-20, +-29,-90, +10,-18, +-71,-51, +6,0, +-19,-93, +67,0, +-27,34, +-45,62, +33,-55, +-46,-37, +60,0, +79,-88, +32,-19, +46,4, +-73,98, +14,29, +30,28, +78,98, +-12,-67, +9,116, +34,-51, +72,-69, +14,-65, +-17,-58, +90,87, +8,33, +-42,-24, +-10,-49, +33,53, +91,57, +-74,87, +52,-77, +-22,18, +35,83, +38,11, +-28,62, +-18,15, +-24,-70, +90,62, +43,91, +-77,-93, +-3,-18, +43,-32, +-9,29, +-85,18, +28,-18, +-5,43, +-63,-14, +12,-18, +-86,15, +-28,8, +12,75, +27,-50, +-10,-69, +-7,-48, +-35,-49, +-20,28, +-19,-92, +-138,-41, +104,-36, +28,-20, +-28,-44, +27,51, +-24,-3, +-15,13, +-62,7, +36,-2, +9,-19, +-71,34, +26,-27, +36,-10, +-4,22, +51,-9, +-3,-43, +-44,32, +0,-46, +-53,25, +-42,-26, +0,-5, +35,-44, +2,44, +-36,-31, +-48,51, +24,21, +-53,-93, +41,50, +-9,4, +-32,67, +-25,57, +26,25, +29,-15, +28,20, +-8,-7, +15,25, +8,2, +44,-5, +-19,20, +-24,-1, +43,12, +20,41, +-33,-1, +28,63, +-32,32, +-23,-29, +5,-17, +2,-30, +37,-50, +-1,-22, +23,-10, +-28,42, +26,-62, +-60,-4, +20,-20, +53,31, +-21,-48, +12,12, +18,-7, +54,11, +-8,34, +-4,-21, +-3,-9, +40,6, +66,74, +59,23, +25,26, +29,-11, +-8,23, +-23,-8, +27,32, +28,-23, +-15,22, +-10,-23, +-38,47, +-59,-12, +28,-39, +26,0, +-29,23, +11,17, +-12,13, +35,26, +-13,-12, +-28,-3, +-23,17, +-61,42, +-4,-11, +-33,62, +-12,47, +46,-34, +-45,1, +55,63, +-43,1, +31,-38, +24,16, +37,-32, +-61,-29, +19,62, +-15,57, +2,29, +-25,30, +-16,-8, +9,-14, +-17,11, +-21,-30, +4,31, +33,-6, +-29,9, +-45,14, +-9,0, +25,9, +0,43, +26,32, +75,7, +11,-7, +11,24, +-8,-20, +0,-13, +-28,8, +-6,-23, +-1,28, +-18,13, +37,14, +4,-7, +-5,-2, +-23,20, +-29,47, +46,-9, +-22,-26, +41,-45, +-18,20, +11,10, +14,-23, +-13,10, +23,-7, +45,-29, +8,28, +11,13, +-3,-19, +6,6, +17,7, +-17,-40, +28,1, +-8,1, +-11,-23, +-18,4, +10,-30, +-16,-11, +-32,-36, +-3,3, +-18,-7, +-12,11, +19,-2, +10,21, +-22,-3, +23,-13, +6,10, +18,14, +-25,15, +-20,18, +11,3, +8,-7, +1,-11, +-7,-8, +3,-2, +19,-19, +-13,-10, +9,23, +-5,-19, +27,-20, +-3,-5, +20,-14, +-14,11, +3,0, +-14,1, +6,-18, +-10,2, +24,-1, +11,35, +11,9, +18,-2, +39,23, +-2,21, +-27,-17, +-33,8, +18,-12, +-5,-25, +-20,-16, +-1,-5, +-16,-13, +-21,4, +-12,-10, +8,6, +-2,28, +10,1, +-10,-3, +-1,-18, +-7,4, +-13,8, +-1,10, +1,-9, +-15,2, +14,13, +0,-19, +2,3, +-7,5, +-6,8, +-5,13, +5,12, +10,-10, +8,1, +9,10, +5,-7, +-5,3, +-9,6, +4,5, +-4,6, +4,4, +-5,-3, +-2,-12, +-4,4, +2,-5, +-1,2, +8,5, +-2,-9, +2,-5, +0,-5, +-3,0, +1,-4, +-3,1, +4,-3, +-4,1, +-1,1, +3,-4, +2,2, +-2,2, +5,-2, +1,3, +-1,7, +1,-7, +-1,2, +1,2, +1,-4, +-1,1, +0,4, +1,-4, +0,0, +0,5, +0,-5, +0,0, +0,5, +0,-5, +0,0, +1,4, +0,-4, +-1,-1, +1,4, +1,-2, +-1,-2, +1,7, +-1,-7, +1,-3, +5,2, +-2,-2, +2,-2, +3,4, +-1,-1, +-4,-1, +4,3, +-3,-1, +1,4, +-3,0, +0,5, +2,5, +-2,9, +8,-5, +-1,-2, +2,5, +-4,-4, +-2,12, +-5,3, +4,-4, +-4,-6, +4,-5, +-9,-6, +-5,-3, +5,7, +9,-10, +8,-1, +10,10, +5,-12, +-5,-13, +-6,-8, +-7,-5, +2,-3, +0,19, +14,-13, +-15,-2, +1,9, +-1,-10, +-13,-8, +-7,-4, +-1,18, +-10,3, +10,-1, +-2,-28, +8,-6, +-12,10, +-21,-4, +-16,13, +-1,5, +-20,16, +-5,25, +18,12, +-33,-8, +-27,17, +-2,-21, +39,-23, +18,2, +11,-9, +11,-35, +24,1, +-10,-2, +6,18, +-14,-1, +3,0, +-14,-11, +20,14, +-3,5, +27,20, +-5,19, +9,-23, +-13,10, +19,19, +3,2, +-7,8, +1,11, +8,7, +11,-3, +-20,-18, +-25,-15, +18,-14, +6,-10, +23,13, +-22,3, +10,-21, +19,2, +-12,-11, +-18,7, +-3,-3, +-32,36, +-16,11, +10,30, +-18,-4, +-11,23, +-8,-1, +28,-1, +-17,40, +17,-7, +6,-6, +-3,19, +11,-13, +8,-28, +45,29, +23,7, +-13,-10, +14,23, +11,-10, +-18,-20, +41,45, +-22,26, +46,9, +-29,-47, +-23,-20, +-5,2, +4,7, +37,-14, +-18,-13, +-1,-28, +-6,23, +-28,-8, +0,13, +-8,20, +11,-24, +11,7, +75,-7, +26,-32, +0,-43, +25,-9, +-9,0, +-45,-14, +-29,-9, +33,6, +4,-31, +-21,30, +-17,-11, +9,14, +-16,8, +-25,-30, +2,-29, +-15,-57, +19,-62, +-61,29, +37,32, +24,-16, +31,38, +-43,-1, +55,-63, +-45,-1, +46,34, +-12,-47, +-33,-62, +-4,11, +-61,-42, +-23,-17, +-28,3, +-13,12, +35,-26, +-12,-13, +11,-17, +-29,-23, +26,0, +28,39, +-59,12, +-38,-47, +-10,23, +-15,-22, +28,23, +27,-32, +-23,8, +-8,-23, +29,11, +25,-26, +59,-23, +66,-74, +40,-6, +-3,9, +-4,21, +-8,-34, +54,-11, +18,7, +12,-12, +-21,48, +53,-31, +20,20, +-60,4, +26,62, +-28,-42, +23,10, +-1,22, +37,50, +2,30, +5,17, +-23,29, +-32,-32, +28,-63, +-33,1, +20,-41, +43,-12, +-24,1, +-19,-20, +44,5, +8,-2, +15,-25, +-8,7, +28,-20, +29,15, +26,-25, +-25,-57, +-32,-67, +-9,-4, +41,-50, +-53,93, +24,-21, +-48,-51, +-36,31, +2,-44, +35,44, +0,5, +-42,26, +-53,-25, +0,46, +-44,-32, +-3,43, +51,9, +-4,-22, +36,10, +26,27, +-71,-34, +9,19, +36,2, +-62,-7, +-15,-13, +-24,3, +27,-51, +-28,44, +28,20, +104,36, +-138,41, +-19,92, +-20,-28, +-35,49, +-7,48, +-10,69, +27,50, +12,-75, +-28,-8, +-86,-15, +12,18, +-63,14, +-5,-43, +28,18, +-85,-18, +-9,-29, +43,32, +-3,18, +-77,93, +43,-91, +90,-62, +-24,70, +-18,-15, +-28,-62, +38,-11, +35,-83, +-22,-18, +52,77, +-74,-87, +91,-57, +33,-53, +-10,49, +-42,24, +8,-33, +90,-87, +-17,58, +14,65, +72,69, +34,51, +9,-116, +-12,67, +78,-98, +30,-28, +14,-29, +-73,-98, +46,-4, +32,19, +79,88, +60,0, +-46,37, +33,55, +-45,-62, +-27,-34, +67,0, +-19,93, +6,0, +-71,51, +10,18, +-29,90, +73,20, +94,73, +-123,-59, +-1,22, +36,4, +56,-66, +44,115, +-2,-32, +-9,49, +62,86, +28,117, +160,7, +6,22, +-3,-4, +56,-84, +-43,13, +-45,70, +-18,24, +35,-64, +142,-72, +-13,-78, +17,-13, +23,43, +-47,25, +-34,-41, +14,37, +-10,-51, +-13,-52, +-6,70, +31,10, +6,68, +57,-51, +16,-52, +54,-126, +-76,1, +177,8, +-14,74, +-11,32, +186,3, +71,21, +-66,45, +2,68, +36,101, +-33,-60, +-103,83, +-4,3, +40,-106, +-92,41, +-9,20, +73,-72, +35,81, +1,-54, +-43,-2, +48,-78, +11,10, +26,-36, +99,-30, +12,-123, +108,-165, +60,61, +-13,72, +107,32, +7,13, +-135,152, +-56,152, +-33,-36, +40,4, +128,-20, +-26,-117, +5,-9, +69,18, +48,70, +38,50, +19,42, +1,100, +21,129, +85,103, +21,27, +11,-101, +-119,-6, +-125,19, +94,44, +-4,129, +-6,2, +-17,-16, +-15,-18, +-9,67, +-50,7, +-26,95, +-132,-188, +-30,94, +0,212, +181,8, +-79,51, +-163,7, +-23,-79, +30,-95, +77,-66, +28,-12, +-79,43, +76,139, +-39,14, +58,30, +-33,28, +-17,-46, +41,41, +-46,43, +-1,-2, +-29,65, +-81,-22, +21,-68, +156,-5, +14,27, +28,7, +32,115, +5,-95, +-44,17, +-43,-36, +64,-80, +111,56, +97,58, +-91,-38, +78,-127, +-23,-4, +69,110, +53,6, +-21,-36, +206,-130, +-30,81, +-66,68, +57,-120, +-47,-9, +29,-7, +-64,98, +-100,3, +41,-76, +-49,-42, +130,-2, +-104,-134, +23,-93, +47,-11, +-90,79, +55,-212, +-36,152, +144,-250, +-133,-55, +175,-97, +28,144, +-124,-82, +-66,4, +31,202, +20,67, +-23,53, +-20,57, +-67,-37, +29,-33, +102,-144, +79,-98, +19,38, +-62,35, +-145,-80, +-74,71, +14,80, +-37,-105, +129,-44, +-64,14, +10,69, +116,54, +-43,-46, +32,180, +111,-34, +-18,62, +80,-239, +-11,-76, +14,-136, +135,12, +49,-3, +-14,-132, +-34,-131, +-86,61, +-66,-164, +-51,-83, +-44,-84, +-173,-21, +-89,65, +-93,-145, +135,76, +136,30, +-4,107, +-93,-79, +-7,-116, +-11,73, +272,27, +65,-108, +-7,211, +-7,-50, +-4,18, +-228,72, +-94,90, +148,27, +139,-5, +11,-73, +-85,253, +140,24, +107,-73, +-160,-88, +-47,-9, +-128,78, +121,-190, +-25,-154, +-164,145, +-34,166, +66,60, +-166,-29, +50,47, +-87,-149, +27,-143, +-7,-158, +22,144, +114,46, +-31,-25, +-202,-100, +120,-123, +-25,-13, +61,253, +-41,60, +69,86, +201,80, +1,51, +107,59, +42,110, +144,-26, +56,-100, +-31,-33, +61,-105, +283,-17, +9,71, +174,-179, +-164,-14, +-29,15, +-103,-114, +59,14, +-117,-20, +-78,-75, +177,74, +12,-131, +-75,43, +-4,122, +-11,104, +8,93, +-18,2, +67,-122, +155,-121, +133,7, +-81,29, +-4,49, +-13,27, +-206,-24, +-125,-61, +-23,118, +1,136, +10,-105, +-118,-29, +348,-109, +-40,130, +200,-231, +-103,136, +160,-1, +-100,-40, +120,44, +184,-25, +20,52, +-2,-172, +142,145, +-17,23, +-115,53, +-53,104, +153,-131, +-17,72, +7,64, +-49,-92, +-10,-33, +236,-195, +-108,41, +-153,-35, +69,-160, +130,136, +35,-70, +-65,-33, +-22,-158, +3,-94, +104,43, +61,99, +-105,-40, +118,-59, +-172,41, +-47,-128, +125,-122, +8,-57, +-19,85, +66,69, +-131,15, +-53,-11, +67,46, +-82,-41, +8,17, +42,59, +-161,-158, +-95,110, +-70,-40, +-11,9, +79,-61, +206,-135, +44,111, +-40,222, +80,27, +-202,-96, +-213,-190, +-27,207, +-5,83, +178,88, +-230,44, +-18,49, +32,-25, +33,47, +-82,57, +-63,-126, +-161,35, +-23,52, +94,198, +28,77, +52,-176, +-179,-25, +-225,-41, +-100,-58, +-99,16, +-77,-30, +-62,-159, +-108,-40, +109,26, +101,-100, +59,-32, +30,-141, +-32,-9, +-140,236, +-291,92, +-45,-17, +48,-37, +-246,-136, +19,-36, +200,-83, +200,-205, +84,9, +2,-100, +55,-80, +18,45, +168,-40, +-131,55, +89,-68, +-28,-131, +-19,41, +38,101, +37,10, +49,-64, +-39,186, +-124,122, +68,-175, +-246,79, +-94,130, +72,-240, +-90,-177, +-76,-27, +-4,-96, +-165,-37, +106,-189, +166,168, +145,-169, +-29,-66, +72,1, +-220,-45, +4,-42, +82,97, +6,-37, +44,-21, +-7,105, +-8,28, +-92,-21, +42,23, +119,-106, +145,-91, +114,-203, +-32,85, +-171,143, +43,-56, +95,24, +27,-26, +-11,-119, +-70,-84, +-162,-293, +-228,49, +23,-21, +-138,-63, +41,7, +-108,-130, +100,-163, +29,192, +-93,28, +98,-37, +-220,-174, +-77,-26, +-97,135, +-13,-36, +-136,156, +-31,-103, +-130,-34, +150,18, +78,39, +-77,68, +-97,-80, +-20,9, +-86,-180, +-202,-180, +194,100, +68,-40, +81,94, +177,-114, +-40,-130, +185,-42, +-83,87, +132,-174, +-228,-119, +-232,30, +73,-88, +1,-68, +151,-94, +-22,101, +-151,73, +51,-182, +342,-22, +-93,-84, +28,161, +34,-171, +23,5, +209,-10, +83,-108, +-73,198, +10,-10, +69,-233, +95,-43, +45,151, +-307,3, +74,-122, +72,124, +-58,37, +70,65, +20,12, +14,-5, +-57,200, +-5,28, +144,125, +-12,4, +59,-87, +-233,-39, +-220,148, +101,-5, +-157,-14, +-92,296, +-141,-5, +-68,48, +-138,-222, +53,38, +-41,98, +88,-153, +30,221, +-5,54, +-41,-81, +72,48, +-56,76, +6,16, +2,-97, +-14,-80, +-17,-9, +10,-65, +-144,79, +109,138, +-82,-11, +0,190, +-92,32, +52,-180, +-144,35, +168,171, +41,-42, +-62,150, +34,-39, +-186,14, +235,-55, +120,146, +133,37, +102,-64, +6,-83, +-75,-64, +134,-50, +-21,86, +1,-159, +71,-56, +-39,77, +35,-6, +95,-76, +-10,-21, +144,-37, +100,86, +103,-18, +-21,90, +-138,47, +-52,-97, +-122,-32, +-177,-93, +120,70, +-30,-114, +-31,145, +-191,13, +130,8, +-99,-121, +25,-70, +-90,125, +37,-199, +50,-85, +45,-28, +29,47, +-141,-13, +128,-109, +152,-267, +178,-158, +-12,-125, +71,-88, +-41,42, +105,54, +-35,-86, +92,-72, +-120,4, +123,67, +0,167, +49,132, +-142,-13, +-72,-123, +164,28, +34,141, +24,-174, +131,48, +-22,-32, +-123,65, +231,242, +15,32, +37,199, +235,58, +175,-52, +-150,96, +50,-216, +222,183, +-30,-147, +-54,79, +-44,-237, +-92,5, +-67,24, +155,200, +308,-181, +152,122, +24,113, +54,-18, +-38,47, +-114,40, +117,86, +-92,-20, +107,-99, +17,38, +22,300, +45,-18, +36,-105, +167,28, +206,-171, +-38,-280, +54,-161, +21,90, +-17,-116, +-82,123, +-33,83, +52,9, +-62,86, +225,-28, +4,-46, +-62,-164, +49,124, +103,136, +133,-35, +162,116, +-364,-330, +-95,172, +97,-114, +-41,-59, +-21,56, +19,-60, +-102,-104, +-52,-151, +77,-209, +78,64, +-65,-10, +14,-114, +-25,48, +-89,-68, +-140,2, +48,-116, +-30,217, +-202,3, +70,-26, +-276,138, +-102,123, +-72,94, +59,89, +-70,57, +141,-104, +27,-32, +12,16, +-45,62, +-14,-283, +161,62, +115,97, +61,117, +110,18, +-89,-157, +-130,41, +54,77, +-111,-109, +-158,-15, +64,-55, +-29,103, +10,-167, +-176,20, +-170,-222, +74,62, +-51,-76, +59,136, +-35,-38, +-47,127, +-206,-101, +246,-40, +155,-224, +82,-44, +82,-190, +168,-326, +93,-116, +89,490, +-170,84, +-16,-9, +-193,14, +-272,128, +-73,137, +59,89, +-224,259, +43,120, +138,-14, +93,-152, +255,117, +-171,-80, +-181,85, +-7,147, +261,66, +-85,45, +-5,100, +128,-35, +-103,93, +39,-219, +-140,82, +86,74, +157,82, +232,78, +45,-52, +-5,-183, +-27,-128, +47,-152, +83,-114, +-104,133, +149,85, +130,58, +82,-103, +101,119, +-115,-53, +-78,124, +-176,56, +100,3, +2,-128, +-28,23, +5,-186, +-309,108, +-67,3, +-37,-62, +-3,223, +-195,-133, +80,-2, +37,97, +-136,41, +47,-181, +59,22, +-90,-82, +28,-77, +317,-107, +-80,34, +87,46, +-119,-69, +-11,32, +-103,-61, +102,24, +59,48, +-105,-163, +325,-20, +-135,57, +-60,-117, +6,0, +-62,-83, +-1,-178, +44,-93, +-27,127, +-191,29, +-79,-108, +209,-144, +136,55, +-102,60, +45,-14, +-44,-28, +158,155, +-33,171, +-54,-181, +72,139, +145,-62, +97,-274, +-141,-118, +-111,179, +-67,86, +18,32, +184,99, +-7,-65, +42,3, +143,53, +65,40, +5,194, +343,-23, +108,-125, +5,150, +36,-98, +174,-105, +100,-61, +-36,-111, +46,135, +-51,-276, +-144,-245, +28,131, +49,36, +15,255, +-49,-25, +86,-79, +-160,58, +8,49, +-3,69, +213,-305, +58,-154, +204,-166, +148,64, +-209,-39, +106,45, +27,-134, +-128,149, +24,-30, +151,6, +-10,-30, +-10,190, +-115,-70, +1,109, +-185,-137, +-128,-111, +-73,44, +-89,-34, +-35,-126, +-41,289, +-108,199, +-54,-107, +9,-164, +19,-98, +127,-93, +-11,-97, +28,123, +18,-305, +-190,165, +-105,34, +-79,-212, +-252,3, +-85,-55, +102,-136, +235,91, +36,138, +-81,87, +236,44, +-38,95, +36,-51, +-48,177, +-98,-111, +53,-280, +-36,43, +215,-124, +146,81, +-62,-81, +-179,131, +-136,123, +42,70, +204,47, +4,-97, +231,132, +-149,149, +134,-21, +-133,-12, +-100,360, +4,-9, +-137,3, +-58,161, +-89,-376, +225,-141, +-123,-7, +72,-168, +122,-31, +101,150, +-206,82, +30,-52, +83,-19, +-54,-32, +-112,39, +56,26, +-164,-106, +180,-65, +-81,268, +98,-57, +-23,79, +-9,135, +-9,293, +64,-43, +74,-232, +17,-15, +-100,-57, +173,44, +288,120, +-139,151, +101,-90, +137,-112, +10,88, +135,99, +45,11, +-44,308, +-29,51, +195,37, +182,-99, +-197,-8, +64,266, +60,72, +-142,-32, +24,-63, +-65,-26, +34,-59, +23,16, +127,44, +141,171, +-374,148, +288,-161, +100,113, +65,-3, +-180,199, +-208,-142, +-60,-19, +-94,-70, +-17,140, +35,-31, +135,125, +184,-172, +-131,48, +51,-77, +68,51, +-59,98, +209,51, +-41,69, +33,106, +-52,62, +-160,170, +206,-2, +431,-42, +325,-107, +195,-161, +27,24, +-6,28, +-28,93, +-23,-35, +-35,-19, +-126,24, +10,146, +60,77, +71,98, +147,86, +-87,-243, +-170,146, +-28,166, +-7,44, +131,78, +104,-30, +224,-55, +14,-102, +41,-79, +-28,-45, +-112,-25, +-11,-54, +79,39, +-193,28, +-305,249, +-98,89, +-143,-57, +13,-66, +-47,7, +28,-84, +206,-17, +87,-14, +-88,-177, +38,-107, +127,334, +-141,-127, +-28,-36, +112,124, +111,127, +-12,97, +-23,-36, +80,-13, +-117,211, +44,-127, +293,130, +-90,-31, +113,175, +43,37, +-119,-83, +-74,-24, +-52,-2, +115,164, +-49,93, +176,207, +-40,-106, +-17,-103, +-41,9, +-93,-17, +182,29, +-164,102, +-29,191, +151,-150, +7,12, +138,-34, +59,-370, +75,-137, +170,-76, +133,4, +-129,42, +-70,186, +15,-216, +-48,-24, +31,73, +-66,-52, +-42,105, +-124,23, +85,41, +50,-8, +69,-114, +-100,99, +42,15, +66,-149, +74,-70, +-255,-18, +113,18, +22,-82, +-21,16, +-142,-68, +7,-61, +-40,-44, +7,233, +55,15, +-181,-112, +-22,-47, +161,127, +-108,-102, +57,46, +219,-179, +-135,99, +-42,-79, +213,174, +-38,175, +101,243, +-39,32, +89,-106, +79,-158, +62,76, +29,-14, +55,3, +-84,19, +32,43, +131,-92, +-52,25, +65,23, +51,66, +-192,169, +-24,-84, +-138,240, +185,55, +-115,-135, +-48,-4, +-126,151, +205,8, +-78,-101, +-205,103, +-164,16, +127,124, +-3,-237, +75,73, +-44,-110, +135,35, +-40,-162, +57,5, +-122,83, +-34,-118, +-182,-68, +194,-183, +-60,-86, +72,24, +-111,22, +-22,-14, +2,-27, +-177,-19, +108,-6, +-255,10, +-31,94, +88,-144, +189,-40, +-168,-23, +30,-10, +95,-15, +0,30, +53,-62, +80,44, +256,128, +155,-41, +-2,36, +84,-168, +-161,-95, +3,-68, +-24,72, +-86,-9, +18,49, +-23,-364, +-38,-251, +176,127, +-61,-162, +72,-15, +-85,-33, +-80,-152, +-1,10, +-142,105, +158,43, +-57,-33, +-107,-50, +13,11, +76,163, +-300,-191, +-80,31, +-104,0, +131,-48, +-6,52, +106,-50, +96,-3, +-323,-169, +-70,-69, +-55,92, +96,-116, +-142,0, +102,91, +-169,26, +5,-155, +-79,134, +-16,-36, +-60,259, +-124,-54, +103,-59, +-97,-75, +-168,-144, +-45,14, +45,-147, +54,-13, +136,-71, +-133,-181, +81,-59, +92,-36, +189,86, +276,47, +-128,85, +-157,-183, +-26,-31, +-14,-45, +-13,-140, +30,-20, +-101,106, +-76,-36, +26,69, +67,34, +17,-87, +13,120, +-167,-132, +-72,107, +-68,-117, +11,182, +90,17, +119,-89, +112,33, +232,98, +173,-31, +66,-113, +263,91, +78,210, +53,60, +152,-105, +107,-137, +90,59, +-27,18, +-54,118, +157,10, +104,-73, +198,-20, +20,-37, +40,176, +123,-106, +61,74, +-134,67, +-198,-136, +-75,-37, +-27,-186, +-117,84, +-84,-122, +-112,-107, +-47,157, +153,-101, +43,44, +31,111, +43,-76, +-20,189, +-72,-94, +-19,14, +-44,-43, +-57,132, +68,271, +48,-39, +161,59, +-113,66, +-144,52, +-79,-78, +-62,16, +-31,-144, +16,78, +-14,-96, +-183,-16, +-40,-91, +-192,58, +99,15, +132,-153, +-83,-57, +121,-40, +-5,97, +-50,43, +115,-59, +-39,-22, +-179,-14, +95,-22, +17,117, +-64,163, +-11,-48, +-86,51, +97,166, +62,17, +-44,-89, +65,-31, +-75,79, +-159,-36, +-112,40, +57,-100, +121,154, +91,-26, +-309,-158, +-44,18, +15,-25, +37,-84, +-127,17, +62,4, +13,-9, +70,43, +-88,-163, +13,-15, +-117,66, +20,-4, +-59,-156, +-53,7, +3,-81, +11,229, +-16,-86, +-12,-42, +65,-27, +106,69, +19,-167, +17,6, +-65,88, +177,23, +-55,232, +50,-9, +-18,34, +157,104, +-65,70, +-42,86, +107,-63, +-53,-116, +23,-127, +10,68, +-53,-16, +-83,-8, +5,26, +135,28, +-47,88, +-18,-113, +79,-72, +-61,63, +-31,-53, +-144,36, +-62,24, +55,0, +149,-30, +16,37, +32,157, +128,-145, +-6,122, +223,27, +24,52, +-97,-75, +22,84, +-82,67, +39,60, +-76,12, +26,-41, +-10,25, +209,5, +-216,-69, +-69,-15, +42,-49, +7,-10, +-58,-110, +4,49, +-131,-52, +65,105, +63,-17, +-106,-46, +-10,-47, +32,120, +-116,-174, +-43,-123, +5,-60, +-19,203, +115,21, +-121,-123, +38,-112, +56,-43, +-14,-33, +-117,75, +60,-3, +133,27, +3,78, +25,-162, +91,-8, +105,109, +6,-89, +-31,-29, +-29,-26, +-20,-17, +19,67, +56,6, +35,-50, +-134,131, +-58,-1, +-15,22, +25,39, +-6,-252, +-121,-21, +60,-23, +-88,-36, +23,1, +-94,-19, +4,-118, +3,-108, +92,-14, +-19,-9, +68,171, +105,-16, +181,-47, +-27,3, +-105,-41, +135,-63, +-94,8, +132,25, +14,-4, +-33,93, +85,54, +-52,5, +10,-89, +-57,-94, +-88,-47, +64,-54, +-211,-45, +0,-138, +47,-123, +-29,63, +60,93, +-22,5, +101,63, +-92,78, +-38,162, +45,26, +18,32, +88,-44, +-19,30, +-57,156, +-101,41, +55,45, +151,131, +56,65, +-65,153, +-39,91, +84,120, +14,152, +-66,44, +43,48, +46,45, +68,-50, +-135,-113, +135,-11, +-99,-78, +29,37, +36,74, +-28,-14, +54,-65, +36,-9, +-24,-42, +-68,8, +-31,28, +-67,-62, +-37,-114, +-39,1, +111,59, +2,208, +15,80, +-73,-68, +-88,75, +-60,-37, +-33,80, +-21,53, +-103,-71, +19,-102, +-110,-12, +-66,-24, +91,12, +-25,-92, +173,-18, +-64,22, +-20,-119, +-7,39, +69,-78, +-34,35, +-9,-48, +-11,70, +-6,-157, +-87,-81, +-71,-36, +66,103, +-55,37, +13,-34, +25,90, +-76,-195, +26,-76, +-42,-6, +93,25, +-37,-81, +-72,14, +80,2, +62,35, +-60,-108, +-5,2, +-44,-12, +-88,-73, +64,114, +-76,-23, +-91,35, +-139,4, +-113,-48, +120,1, +-14,-13, +-41,-59, +-54,11, +-38,-58, +-89,70, +86,70, +20,103, +2,116, +26,-40, +-28,33, +-4,71, +10,-48, +-7,-9, +-71,26, +2,115, +-22,-93, +43,-30, +-7,-81, +-18,45, +-11,-90, +-7,-4, +17,19, +1,-93, +-43,109, +-64,-21, +-102,5, +16,-104, +-5,19, +-7,-47, +-15,48, +-86,5, +61,46, +-85,-39, +9,76, +-65,2, +115,-44, +-12,-127, +-36,1, +19,29, +65,41, +-15,-135, +-49,45, +43,-1, +40,29, +80,-119, +-34,8, +88,-28, +31,8, +-55,56, +21,-19, +-9,36, +6,14, +4,-59, +20,64, +-21,42, +-11,-11, +-88,52, +25,56, +107,-95, +105,119, +13,39, +66,-59, +-72,26, +31,41, +-72,9, +27,22, +3,7, +14,1, +-69,-36, +24,-33, +73,32, +26,-4, +-81,-37, +19,-18, +-20,-50, +-27,62, +3,-28, +13,-16, +-67,-52, +-27,81, +3,-7, +0,-24, +21,-2, +-56,67, +18,-15, +68,-12, +-43,-45, +42,3, +27,-26, +-66,19, +-2,-10, +3,-44, +55,-13, +-18,22, +-2,69, +-103,44, +-85,22, +-49,14, +-6,74, +-1,-4, +-2,-9, +97,12, +-15,-48, +-8,64, +16,-48, +-52,-46, +-19,64, +40,-12, +88,36, +0,3, +45,22, +-28,-71, +-35,-13, +34,28, +29,-23, +43,60, +-38,24, +62,48, +-27,-19, +52,-26, +-6,43, +-21,-24, +98,22, +34,74, +-68,-46, +55,-25, +17,36, +18,11, +-65,-31, +-22,38, +7,54, +-19,15, +-19,-4, +-1,-27, +-29,-3, +35,-69, +63,-77, +41,-57, +-28,7, +15,14, +-18,-42, +-24,-10, +-7,12, +-37,20, +-33,33, +25,78, +-12,-5, +29,26, +68,-16, +-7,-58, +-6,-9, +-29,27, +52,32, +32,14, +12,-1, +36,-24, +-21,-27, +-7,10, +22,-16, +26,-9, +-26,29, +-11,27, +-45,106, +-23,122, +32,30, +9,-10, +41,-31, +22,-9, +11,42, +24,-14, +22,39, +3,1, +9,-12, +-34,16, +15,0, +-31,58, +47,12, +-5,-26, +11,2, +-33,-35, +5,-41, +-8,-38, +66,-12, +-36,82, +7,-17, +13,9, +41,-47, +22,69, +-12,15, +-2,-37, +-11,38, +-13,-32, +-12,-21, +32,24, +33,-9, +24,-17, +-29,15, +-14,61, +60,-13, +10,-20, +40,37, +13,-4, +4,22, +-6,35, +-20,-12, +14,16, +47,24, +-8,44, +-3,-5, +-10,-22, +-33,32, +-22,10, +55,-11, +54,4, +-36,7, +43,-16, +15,37, +-4,-24, +-12,18, +1,-20, +-3,-8, +10,-12, +-10,16, +-16,-2, +25,-19, +27,-6, +-25,47, +-4,-14, +-6,7, +-51,7, +-12,18, +-17,-42, +13,4, +22,-11, +16,-22, +31,4, +-15,-18, +19,24, +24,-12, +-7,39, +-11,6, +27,13, +14,-13, +6,-37, +16,-2, +-25,26, +20,12, +-25,19, +-23,-15, +-9,-1, +1,-4, +20,-11, +-6,21, +10,2, +13,12, +19,-6, +1,25, +-6,28, +-6,-28, +-15,-18, +-5,-10, +0,-21, +-4,-10, +10,-5, +-31,2, +15,7, +-11,3, +-21,10, +-10,-2, +-9,-7, +16,-8, +25,-7, +1,-4, +-18,-6, +9,-10, +-6,-11, +-16,-12, +1,-12, +18,6, +-13,-15, +17,6, +-5,14, +-3,-4, +6,-7, +8,7, +-21,-5, +15,1, +-1,0, +-13,16, +-15,13, +-7,1, +-16,14, +19,-11, +1,-2, +-13,-1, +11,3, +6,-4, +10,6, +0,0, +-7,-8, +-17,-3, +-2,2, +12,0, +-19,2, +-3,11, +9,2, +-13,-4, +5,12, +4,7, +-6,5, +12,2, +3,5, +-10,2, +7,2, +3,2, +-6,4, +8,-3, +6,-5, +-10,-1, +-3,0, +3,5, +-7,1, +5,-2, +2,1, +-2,1, +4,2, +1,-2, +-4,0, +4,1, +1,2, +-7,0, +4,-2, +3,0, +-6,1, +2,0, +3,0, +-6,0, +3,0, +2,0, +-6,-1, +3,0, +4,2, +-7,0, +1,-2, +4,-1, +-4,0, +1,2, +4,-2, +-2,-1, +2,-1, +5,2, +-7,-1, +3,-5, +-3,0, +-10,1, +6,5, +8,3, +-6,-4, +3,-2, +7,-2, +-10,-2, +3,-5, +12,-2, +-6,-5, +4,-7, +5,-12, +-13,4, +9,-2, +-3,-11, +-19,-2, +12,0, +-2,-2, +-17,3, +-7,8, +0,0, +10,-6, +6,4, +11,-3, +-13,1, +1,2, +19,11, +-16,-14, +-7,-1, +-15,-13, +-13,-16, +-1,0, +15,-1, +-21,5, +8,-7, +6,7, +-3,4, +-5,-14, +17,-6, +-13,15, +18,-6, +1,12, +-16,12, +-6,11, +9,10, +-18,6, +1,4, +25,7, +16,8, +-9,7, +-10,2, +-21,-10, +-11,-3, +15,-7, +-31,-2, +10,5, +-4,10, +0,21, +-5,10, +-15,18, +-6,28, +-6,-28, +1,-25, +19,6, +13,-12, +10,-2, +-6,-21, +20,11, +1,4, +-9,1, +-23,15, +-25,-19, +20,-12, +-25,-26, +16,2, +6,37, +14,13, +27,-13, +-11,-6, +-7,-39, +24,12, +19,-24, +-15,18, +31,-4, +16,22, +22,11, +13,-4, +-17,42, +-12,-18, +-51,-7, +-6,-7, +-4,14, +-25,-47, +27,6, +25,19, +-16,2, +-10,-16, +10,12, +-3,8, +1,20, +-12,-18, +-4,24, +15,-37, +43,16, +-36,-7, +54,-4, +55,11, +-22,-10, +-33,-32, +-10,22, +-3,5, +-8,-44, +47,-24, +14,-16, +-20,12, +-6,-35, +4,-22, +13,4, +40,-37, +10,20, +60,13, +-14,-61, +-29,-15, +24,17, +33,9, +32,-24, +-12,21, +-13,32, +-11,-38, +-2,37, +-12,-15, +22,-69, +41,47, +13,-9, +7,17, +-36,-82, +66,12, +-8,38, +5,41, +-33,35, +11,-2, +-5,26, +47,-12, +-31,-58, +15,0, +-34,-16, +9,12, +3,-1, +22,-39, +24,14, +11,-42, +22,9, +41,31, +9,10, +32,-30, +-23,-122, +-45,-106, +-11,-27, +-26,-29, +26,9, +22,16, +-7,-10, +-21,27, +36,24, +12,1, +32,-14, +52,-32, +-29,-27, +-6,9, +-7,58, +68,16, +29,-26, +-12,5, +25,-78, +-33,-33, +-37,-20, +-7,-12, +-24,10, +-18,42, +15,-14, +-28,-7, +41,57, +63,77, +35,69, +-29,3, +-1,27, +-19,4, +-19,-15, +7,-54, +-22,-38, +-65,31, +18,-11, +17,-36, +55,25, +-68,46, +34,-74, +98,-22, +-21,24, +-6,-43, +52,26, +-27,19, +62,-48, +-38,-24, +43,-60, +29,23, +34,-28, +-35,13, +-28,71, +45,-22, +0,-3, +88,-36, +40,12, +-19,-64, +-52,46, +16,48, +-8,-64, +-15,48, +97,-12, +-2,9, +-1,4, +-6,-74, +-49,-14, +-85,-22, +-103,-44, +-2,-69, +-18,-22, +55,13, +3,44, +-2,10, +-66,-19, +27,26, +42,-3, +-43,45, +68,12, +18,15, +-56,-67, +21,2, +0,24, +3,7, +-27,-81, +-67,52, +13,16, +3,28, +-27,-62, +-20,50, +19,18, +-81,37, +26,4, +73,-32, +24,33, +-69,36, +14,-1, +3,-7, +27,-22, +-72,-9, +31,-41, +-72,-26, +66,59, +13,-39, +105,-119, +107,95, +25,-56, +-88,-52, +-11,11, +-21,-42, +20,-64, +4,59, +6,-14, +-9,-36, +21,19, +-55,-56, +31,-8, +88,28, +-34,-8, +80,119, +40,-29, +43,1, +-49,-45, +-15,135, +65,-41, +19,-29, +-36,-1, +-12,127, +115,44, +-65,-2, +9,-76, +-85,39, +61,-46, +-86,-5, +-15,-48, +-7,47, +-5,-19, +16,104, +-102,-5, +-64,21, +-43,-109, +1,93, +17,-19, +-7,4, +-11,90, +-18,-45, +-7,81, +43,30, +-22,93, +2,-115, +-71,-26, +-7,9, +10,48, +-4,-71, +-28,-33, +26,40, +2,-116, +20,-103, +86,-70, +-89,-70, +-38,58, +-54,-11, +-41,59, +-14,13, +120,-1, +-113,48, +-139,-4, +-91,-35, +-76,23, +64,-114, +-88,73, +-44,12, +-5,-2, +-60,108, +62,-35, +80,-2, +-72,-14, +-37,81, +93,-25, +-42,6, +26,76, +-76,195, +25,-90, +13,34, +-55,-37, +66,-103, +-71,36, +-87,81, +-6,157, +-11,-70, +-9,48, +-34,-35, +69,78, +-7,-39, +-20,119, +-64,-22, +173,18, +-25,92, +91,-12, +-66,24, +-110,12, +19,102, +-103,71, +-21,-53, +-33,-80, +-60,37, +-88,-75, +-73,68, +15,-80, +2,-208, +111,-59, +-39,-1, +-37,114, +-67,62, +-31,-28, +-68,-8, +-24,42, +36,9, +54,65, +-28,14, +36,-74, +29,-37, +-99,78, +135,11, +-135,113, +68,50, +46,-45, +43,-48, +-66,-44, +14,-152, +84,-120, +-39,-91, +-65,-153, +56,-65, +151,-131, +55,-45, +-101,-41, +-57,-156, +-19,-30, +88,44, +18,-32, +45,-26, +-38,-162, +-92,-78, +101,-63, +-22,-5, +60,-93, +-29,-63, +47,123, +0,138, +-211,45, +64,54, +-88,47, +-57,94, +10,89, +-52,-5, +85,-54, +-33,-93, +14,4, +132,-25, +-94,-8, +135,63, +-105,41, +-27,-3, +181,47, +105,16, +68,-171, +-19,9, +92,14, +3,108, +4,118, +-94,19, +23,-1, +-88,36, +60,23, +-121,21, +-6,252, +25,-39, +-15,-22, +-58,1, +-134,-131, +35,50, +56,-6, +19,-67, +-20,17, +-29,26, +-31,29, +6,89, +105,-109, +91,8, +25,162, +3,-78, +133,-27, +60,3, +-117,-75, +-14,33, +56,43, +38,112, +-121,123, +115,-21, +-19,-203, +5,60, +-43,123, +-116,174, +32,-120, +-10,47, +-106,46, +63,17, +65,-105, +-131,52, +4,-49, +-58,110, +7,10, +42,49, +-69,15, +-216,69, +209,-5, +-10,-25, +26,41, +-76,-12, +39,-60, +-82,-67, +22,-84, +-97,75, +24,-52, +223,-27, +-6,-122, +128,145, +32,-157, +16,-37, +149,30, +55,0, +-62,-24, +-144,-36, +-31,53, +-61,-63, +79,72, +-18,113, +-47,-88, +135,-28, +5,-26, +-83,8, +-53,16, +10,-68, +23,127, +-53,116, +107,63, +-42,-86, +-65,-70, +157,-104, +-18,-34, +50,9, +-55,-232, +177,-23, +-65,-88, +17,-6, +19,167, +106,-69, +65,27, +-12,42, +-16,86, +11,-229, +3,81, +-53,-7, +-59,156, +20,4, +-117,-66, +13,15, +-88,163, +70,-43, +13,9, +62,-4, +-127,-17, +37,84, +15,25, +-44,-18, +-309,158, +91,26, +121,-154, +57,100, +-112,-40, +-159,36, +-75,-79, +65,31, +-44,89, +62,-17, +97,-166, +-86,-51, +-11,48, +-64,-163, +17,-117, +95,22, +-179,14, +-39,22, +115,59, +-50,-43, +-5,-97, +121,40, +-83,57, +132,153, +99,-15, +-192,-58, +-40,91, +-183,16, +-14,96, +16,-78, +-31,144, +-62,-16, +-79,78, +-144,-52, +-113,-66, +161,-59, +48,39, +68,-271, +-57,-132, +-44,43, +-19,-14, +-72,94, +-20,-189, +43,76, +31,-111, +43,-44, +153,101, +-47,-157, +-112,107, +-84,122, +-117,-84, +-27,186, +-75,37, +-198,136, +-134,-67, +61,-74, +123,106, +40,-176, +20,37, +198,20, +104,73, +157,-10, +-54,-118, +-27,-18, +90,-59, +107,137, +152,105, +53,-60, +78,-210, +263,-91, +66,113, +173,31, +232,-98, +112,-33, +119,89, +90,-17, +11,-182, +-68,117, +-72,-107, +-167,132, +13,-120, +17,87, +67,-34, +26,-69, +-76,36, +-101,-106, +30,20, +-13,140, +-14,45, +-26,31, +-157,183, +-128,-85, +276,-47, +189,-86, +92,36, +81,59, +-133,181, +136,71, +54,13, +45,147, +-45,-14, +-168,144, +-97,75, +103,59, +-124,54, +-60,-259, +-16,36, +-79,-134, +5,155, +-169,-26, +102,-91, +-142,0, +96,116, +-55,-92, +-70,69, +-323,169, +96,3, +106,50, +-6,-52, +131,48, +-104,0, +-80,-31, +-300,191, +76,-163, +13,-11, +-107,50, +-57,33, +158,-43, +-142,-105, +-1,-10, +-80,152, +-85,33, +72,15, +-61,162, +176,-127, +-38,251, +-23,364, +18,-49, +-86,9, +-24,-72, +3,68, +-161,95, +84,168, +-2,-36, +155,41, +256,-128, +80,-44, +53,62, +0,-30, +95,15, +30,10, +-168,23, +189,40, +88,144, +-31,-94, +-255,-10, +108,6, +-177,19, +2,27, +-22,14, +-111,-22, +72,-24, +-60,86, +194,183, +-182,68, +-34,118, +-122,-83, +57,-5, +-40,162, +135,-35, +-44,110, +75,-73, +-3,237, +127,-124, +-164,-16, +-205,-103, +-78,101, +205,-8, +-126,-151, +-48,4, +-115,135, +185,-55, +-138,-240, +-24,84, +-192,-169, +51,-66, +65,-23, +-52,-25, +131,92, +32,-43, +-84,-19, +55,-3, +29,14, +62,-76, +79,158, +89,106, +-39,-32, +101,-243, +-38,-175, +213,-174, +-42,79, +-135,-99, +219,179, +57,-46, +-108,102, +161,-127, +-22,47, +-181,112, +55,-15, +7,-233, +-40,44, +7,61, +-142,68, +-21,-16, +22,82, +113,-18, +-255,18, +74,70, +66,149, +42,-15, +-100,-99, +69,114, +50,8, +85,-41, +-124,-23, +-42,-105, +-66,52, +31,-73, +-48,24, +15,216, +-70,-186, +-129,-42, +133,-4, +170,76, +75,137, +59,370, +138,34, +7,-12, +151,150, +-29,-191, +-164,-102, +182,-29, +-93,17, +-41,-9, +-17,103, +-40,106, +176,-207, +-49,-93, +115,-164, +-52,2, +-74,24, +-119,83, +43,-37, +113,-175, +-90,31, +293,-130, +44,127, +-117,-211, +80,13, +-23,36, +-12,-97, +111,-127, +112,-124, +-28,36, +-141,127, +127,-334, +38,107, +-88,177, +87,14, +206,17, +28,84, +-47,-7, +13,66, +-143,57, +-98,-89, +-305,-249, +-193,-28, +79,-39, +-11,54, +-112,25, +-28,45, +41,79, +14,102, +224,55, +104,30, +131,-78, +-7,-44, +-28,-166, +-170,-146, +-87,243, +147,-86, +71,-98, +60,-77, +10,-146, +-126,-24, +-35,19, +-23,35, +-28,-93, +-6,-28, +27,-24, +195,161, +325,107, +431,42, +206,2, +-160,-170, +-52,-62, +33,-106, +-41,-69, +209,-51, +-59,-98, +68,-51, +51,77, +-131,-48, +184,172, +135,-125, +35,31, +-17,-140, +-94,70, +-60,19, +-208,142, +-180,-199, +65,3, +100,-113, +288,161, +-374,-148, +141,-171, +127,-44, +23,-16, +34,59, +-65,26, +24,63, +-142,32, +60,-72, +64,-266, +-197,8, +182,99, +195,-37, +-29,-51, +-44,-308, +45,-11, +135,-99, +10,-88, +137,112, +101,90, +-139,-151, +288,-120, +173,-44, +-100,57, +17,15, +74,232, +64,43, +-9,-293, +-9,-135, +-23,-79, +98,57, +-81,-268, +180,65, +-164,106, +56,-26, +-112,-39, +-54,32, +83,19, +30,52, +-206,-82, +101,-150, +122,31, +72,168, +-123,7, +225,141, +-89,376, +-58,-161, +-137,-3, +4,9, +-100,-360, +-133,12, +134,21, +-149,-149, +231,-132, +4,97, +204,-47, +42,-70, +-136,-123, +-179,-131, +-62,81, +146,-81, +215,124, +-36,-43, +53,280, +-98,111, +-48,-177, +36,51, +-38,-95, +236,-44, +-81,-87, +36,-138, +235,-91, +102,136, +-85,55, +-252,-3, +-79,212, +-105,-34, +-190,-165, +18,305, +28,-123, +-11,97, +127,93, +19,98, +9,164, +-54,107, +-108,-199, +-41,-289, +-35,126, +-89,34, +-73,-44, +-128,111, +-185,137, +1,-109, +-115,70, +-10,-190, +-10,30, +151,-6, +24,30, +-128,-149, +27,134, +106,-45, +-209,39, +148,-64, +204,166, +58,154, +213,305, +-3,-69, +8,-49, +-160,-58, +86,79, +-49,25, +15,-255, +49,-36, +28,-131, +-144,245, +-51,276, +46,-135, +-36,111, +100,61, +174,105, +36,98, +5,-150, +108,125, +343,23, +5,-194, +65,-40, +143,-53, +42,-3, +-7,65, +184,-99, +18,-32, +-67,-86, +-111,-179, +-141,118, +97,274, +145,62, +72,-139, +-54,181, +-33,-171, +158,-155, +-44,28, +45,14, +-102,-60, +136,-55, +209,144, +-79,108, +-191,-29, +-27,-127, +44,93, +-1,178, +-62,83, +6,0, +-68,-143, +-225,39, +-2,-97, +-261,-204, +145,175, +-207,-111, +-6,-132, +137,-123, +-140,-113, +31,21, +-12,-426, +-27,85, +-68,-56, +-352,118, +82,145, +-387,201, +-2,106, +111,154, +44,-17, +273,-76, +-65,-20, +99,52, +-314,-54, +-104,353, +-122,64, +-61,-113, +-211,36, +-41,30, +-81,-135, +103,-174, +86,-8, +-71,-54, +9,150, +137,-45, +200,37, +-180,81, +125,135, +163,-50, +164,-6, +57,183, +-60,97, +-113,-208, +155,-114, +-146,145, +-26,45, +-24,-22, +-31,-167, +291,-85, +-194,92, +-112,-36, +-96,218, +-273,97, +-62,62, +26,-109, +69,67, +-70,90, +60,43, +104,236, +121,-34, +-66,134, +169,-66, +186,188, +-51,-78, +-32,54, +-2,-9, +29,-289, +259,-121, +-6,106, +-23,49, +-128,15, +-57,-33, +-28,-19, +-2,189, +-57,-2, +226,136, +18,167, +-10,48, +29,34, +78,64, +79,-54, +22,101, +-185,83, +115,-232, +158,-22, +31,112, +-44,-61, +-100,-104, +-107,95, +34,-82, +-219,-79, +-48,193, +179,68, +-167,-105, +212,-117, +151,-63, +235,-130, +114,76, +57,188, +54,43, +-148,-44, +-214,4, +99,-57, +68,-118, +32,2, +-78,99, +174,213, +205,55, +14,-58, +109,-85, +61,55, +110,-83, +114,229, +219,39, +48,55, +-87,181, +137,106, +-124,-48, +176,-12, +38,-65, +-153,57, +-84,125, +-37,-2, +200,32, +-66,-148, +-106,-101, +-196,175, +-93,6, +65,40, +4,-87, +171,57, +12,16, +-135,-63, +-176,-70, +-88,-34, +-11,-55, +144,52, +-21,246, +139,-117, +83,-69, +9,-36, +-161,-17, +34,-36, +-156,85, +-28,140, +162,-27, +308,18, +-86,-62, +-55,95, +112,-241, +-55,-75, +-18,24, +278,64, +60,104, +-127,107, +-116,-86, +101,-412, +-139,113, +-286,-88, +-85,84, +-41,314, +155,-190, +-74,99, +186,-54, +100,88, +343,158, +-154,26, +-93,-9, +-126,230, +-162,-104, +41,-125, +71,144, +-29,62, +-14,-55, +-74,203, +-86,-32, +-61,32, +-62,168, +14,49, +-152,-194, +-21,-64, +-236,172, +-116,-5, +84,-117, +30,-63, +-93,160, +213,281, +-112,186, +97,-27, +188,-35, +421,-74, +2,51, +-90,-27, +-45,26, +302,86, +188,68, +97,106, +12,39, +80,42, +-64,103, +125,34, +-85,-265, +-19,12, +59,-36, +79,-111, +6,-44, +80,163, +-88,-80, +20,40, +-2,218, +-7,0, +0,27, +-1,76, +-182,31, +155,50, +-71,-159, +-11,-63, +4,188, +34,62, +-109,94, +-72,-124, +-12,132, +77,-132, +22,95, +-17,-76, +47,-69, +-174,-92, +66,-222, +3,-122, +-28,-189, +1,48, +-16,24, +-27,-80, +161,79, +-8,-172, +-173,144, +128,-40, +-167,-52, +-65,107, +-106,-135, +-39,-81, +-154,32, +-87,-244, +105,-14, +-99,-52, +-32,-141, +-30,-13, +94,-46, +73,-53, +-54,200, +74,-79, +50,82, +-264,188, +238,7, +61,132, +206,72, +-171,47, +-179,52, +-26,-12, +-87,47, +193,93, +41,-120, +-10,94, +237,-117, +-68,-86, +-61,-25, +-3,198, +248,160, +60,-55, +-49,-92, +-1,-18, +-100,51, +123,2, +16,27, +65,46, +155,50, +7,-6, +-19,-50, +108,52, +50,183, +-164,51, +-18,-71, +34,-9, +223,-168, +66,93, +-25,65, +-12,72, +-37,-16, +55,73, +69,-131, +-191,-37, +83,54, +-119,33, +-21,-6, +-141,86, +35,-61, +18,-179, +51,-34, +90,-158, +-24,9, +-129,60, +57,-38, +213,-183, +153,82, +78,-34, +87,-26, +69,138, +53,39, +-126,-19, +-191,186, +-40,-61, +8,-144, +124,104, +70,-115, +141,294, +6,58, +107,93, +14,-96, +65,206, +149,-134, +-6,8, +11,307, +38,49, +108,-26, +-26,59, +3,62, +-119,-64, +-102,188, +294,-129, +85,61, +-58,-72, +-145,-46, +52,43, +37,-46, +178,59, +-58,-124, +-164,-3, +-53,73, +82,138, +50,19, +-216,-71, +-62,95, +122,12, +-141,174, +-124,-186, +41,154, +-81,-88, +6,67, +155,17, +61,97, +140,-108, +-44,18, +120,185, +24,-82, +118,-1, +-143,104, +-49,128, +25,67, +-196,-21, +-133,-214, +-64,40, +-50,-36, +-162,27, +0,47, +-69,104, +142,-15, +-82,-63, +-174,-71, +118,74, +-45,117, +-121,-120, +-144,-24, +65,43, +59,-116, +-63,-232, +49,56, +10,39, +5,43, +40,-61, +42,107, +-190,103, +-91,-20, +81,-103, +68,47, +45,85, +178,22, +3,110, +96,143, +-49,86, +2,-71, +-79,30, +213,-28, +-172,58, +3,-66, +42,20, +59,133, +-22,87, +28,-11, +208,25, +115,263, +-34,47, +82,38, +-10,-331, +-36,19, +-148,-142, +-154,-29, +33,-159, +-51,-121, +-8,-111, +-16,236, +162,-163, +-73,197, +222,-52, +105,-35, +67,-91, +-66,-129, +50,145, +-43,128, +71,-211, +-107,119, +80,-21, +-85,92, +-83,-54, +85,-99, +-58,70, +64,72, +-37,27, +-6,119, +15,181, +-140,34, +-56,28, +-132,101, +204,-207, +-109,140, +26,52, +146,-99, +-5,-62, +-56,199, +-51,-29, +87,8, +19,69, +81,-43, +294,221, +-30,87, +165,-97, +-75,21, +-92,10, +-18,-33, +-97,14, +56,-22, +-25,77, +3,86, +15,37, +-169,76, +-116,-79, +-83,-52, +-183,-101, +-56,-34, +70,73, +-149,15, +-36,209, +47,-130, +-3,157, +-43,265, +81,-78, +61,-152, +-133,-155, +-89,-50, +115,46, +-54,61, +-121,-64, +-139,-172, +28,80, +-190,220, +109,-67, +-77,-41, +-1,-46, +-12,-30, +-56,-121, +-62,-17, +13,82, +105,98, +-74,-162, +37,18, +-66,60, +-115,71, +-17,99, +190,-133, +-91,-7, +-27,57, +72,100, +-141,182, +114,15, +-19,-92, +195,-116, +173,-17, +-128,-97, +9,-101, +13,15, +2,20, +154,-77, +11,-44, +-59,5, +-48,-186, +54,187, +33,111, +25,5, +-119,-181, +49,-110, +28,35, +-28,11, +-8,-54, +-51,22, +11,-63, +-17,-7, +13,51, +-60,-22, +-202,-11, +-50,-85, +258,105, +-22,38, +9,-70, +-111,-52, +-14,71, +-49,27, +-12,117, +23,-8, +-88,-104, +-95,67, +-36,21, +-70,167, +-137,182, +66,-188, +120,116, +134,-29, +45,-90, +-57,63, +-11,44, +-44,49, +155,-124, +67,-38, +-100,-32, +15,33, +-40,-1, +121,73, +4,-77, +-133,-54, +-55,14, +51,-61, +-153,49, +30,-81, +159,39, +65,-159, +-132,-4, +-76,-159, +76,-29, +12,77, +-30,-37, +-102,-155, +-225,65, +51,96, +161,-79, +82,14, +69,79, +-61,-119, +210,-27, +-25,-5, +-50,-42, +-13,-113, +-111,-114, +-20,-92, +20,-90, +86,-66, +24,55, +59,2, +55,-61, +-92,68, +29,-126, +50,-69, +-97,58, +15,-72, +88,194, +38,77, +142,135, +-42,25, +-34,12, +115,34, +25,-117, +7,51, +-73,99, +60,-27, +-3,37, +34,-21, +-110,90, +108,-199, +64,-19, +45,-14, +150,-25, +39,23, +1,-30, +68,59, +-23,-41, +-106,1, +49,-43, +146,-55, +-171,92, +79,-109, +-2,68, +42,3, +53,-37, +-169,2, +-63,189, +145,4, +-121,106, +143,-4, +-30,65, +47,-59, +-159,19, +-67,-38, +-80,-60, +2,-119, +-150,-59, +-25,60, +-183,-16, +189,29, +112,65, +26,123, +2,65, +72,-57, +60,47, +29,84, +-8,-117, +-50,44, +84,-21, +-51,82, +-24,-94, +57,37, +112,-5, +32,83, +58,40, +46,84, +-1,32, +-19,39, +-42,-47, +63,-109, +80,-21, +-12,83, +-55,-35, +136,18, +-48,30, +-125,-26, +-56,3, +14,73, +-47,-83, +-5,-149, +8,90, +64,-40, +-8,-54, +-95,-20, +22,-12, +69,77, +20,-93, +-13,-54, +63,-48, +-91,-20, +-35,-123, +-56,-63, +35,-28, +96,-31, +73,-34, +-51,-19, +22,117, +51,-25, +34,62, +-43,1, +-1,106, +95,50, +-66,0, +74,-3, +-54,-30, +48,-50, +-55,-52, +140,6, +-36,16, +-6,-119, +25,-36, +40,131, +78,-75, +-26,-119, +-43,50, +-22,10, +64,76, +-71,12, +17,-66, +15,-84, +-114,142, +110,56, +-35,11, +20,-69, +40,-45, +26,43, +-54,20, +105,39, +101,-14, +0,34, +10,35, +-14,57, +69,29, +-54,-6, +139,77, +12,16, +105,70, +-83,41, +-22,35, +11,-59, +4,-71, +58,-62, +19,-4, +23,72, +24,26, +1,30, +-30,98, +-10,97, +-68,15, +41,-39, +-2,-26, +-44,39, +-80,40, +-27,7, +-50,-14, +15,-3, +43,-97, +-15,39, +30,-58, +-15,-1, +-43,-36, +-15,55, +56,1, +-20,-53, +68,27, +7,38, +-24,40, +-72,106, +23,-80, +8,-52, +55,40, +67,27, +-46,-14, +-16,39, +54,31, +3,34, +-3,50, +37,-19, +-8,25, +-3,-41, +-27,-16, +-34,44, +62,76, +103,44, +-10,-90, +-76,50, +28,26, +-52,39, +26,26, +-4,23, +27,46, +13,-81, +-5,-50, +36,-31, +42,-17, +7,168, +71,-52, +26,9, +27,-35, +43,22, +-31,23, +66,-12, +-31,42, +-65,26, +19,-73, +-39,16, +-74,8, +25,-21, +-82,-61, +-22,-24, +23,-10, +-57,-90, +26,29, +28,-46, +-57,-5, +58,-9, +-55,24, +1,34, +17,-27, +-9,-8, +-32,7, +-92,7, +-29,-21, +-69,9, +-28,-52, +24,32, +-51,10, +43,-2, +-30,29, +20,-44, +-27,-37, +82,16, +18,10, +-9,-40, +-24,40, +-38,-27, +54,10, +22,-44, +-28,10, +50,8, +44,-6, +3,-13, +11,16, +13,-24, +12,33, +-49,23, +5,8, +-29,-8, +-38,7, +-33,-23, +56,45, +13,-17, +0,16, +38,31, +32,68, +5,58, +21,37, +2,-74, +-19,33, +21,101, +-41,94, +0,-36, +65,50, +72,-14, +44,18, +0,1, +-56,12, +11,-28, +50,-47, +-22,-50, +-59,10, +27,-38, +40,4, +-9,-20, +37,-33, +1,-6, +19,-18, +20,0, +12,22, +-15,-4, +-9,-24, +10,-40, +48,-46, +-9,14, +18,13, +49,104, +4,-17, +-58,27, +72,5, +-16,20, +37,-49, +45,-52, +-78,-35, +-15,5, +-53,4, +14,-62, +46,35, +11,59, +-3,-6, +-21,-10, +-21,26, +-38,-17, +45,-11, +-28,55, +-4,61, +41,-38, +18,-1, +-19,-21, +7,-16, +1,-12, +-47,34, +18,6, +18,26, +25,2, +-8,14, +-15,-21, +-11,-42, +-11,-26, +3,14, +3,11, +3,28, +-21,-6, +33,-13, +6,-30, +-4,-38, +-26,11, +-15,10, +29,24, +3,-42, +9,-17, +10,19, +-29,-3, +4,26, +27,-20, +14,11, +16,4, +27,26, +-2,37, +29,4, +-19,22, +-7,7, +-7,13, +10,26, +24,28, +32,-1, +-10,-15, +-19,34, +-3,-3, +-3,-24, +-9,-23, +10,1, +28,18, +6,12, +-12,27, +-14,48, +-14,-11, +-19,22, +18,-8, +18,1, +-7,-12, +-6,-26, +2,9, +-5,-18, +-11,-18, +14,19, +-6,19, +-19,-2, +-3,3, +19,-17, +0,14, +-7,19, +15,-6, +7,-4, +10,20, +20,1, +12,14, +-4,-9, +22,-5, +-11,-3, +-11,-10, +25,-16, +2,19, +-21,8, +-11,14, +-13,-1, +0,-9, +15,3, +-10,13, +18,13, +-5,4, +13,-2, +4,21, +19,-1, +1,-5, +0,6, +5,7, +-9,-17, +17,-8, +11,-15, +5,-15, +-4,5, +4,-5, +-14,18, +-10,-7, +17,-13, +1,10, +-8,-7, +-5,1, +-1,-3, +12,0, +5,11, +-7,15, +6,-4, +13,2, +-8,1, +4,13, +5,-2, +0,-3, +-6,4, +-1,3, +-10,0, +1,-7, +5,-3, +-8,-7, +4,-1, +12,-8, +2,-5, +-6,-6, +7,9, +-5,-2, +-3,7, +9,3, +2,-6, +0,0, +11,-8, +-2,0, +-1,-6, +2,0, +-4,2, +-8,-3, +7,1, +-5,0, +-6,0, +7,0, +-3,-2, +-3,1, +5,-1, +-3,0, +-3,0, +6,0, +-3,0, +-3,0, +5,1, +-3,-1, +-3,2, +7,0, +-6,0, +-5,0, +7,-1, +-8,3, +-4,-2, +2,0, +-1,6, +-2,0, +11,8, +0,0, +2,6, +9,-3, +-3,-7, +-5,2, +7,-9, +-6,6, +2,5, +12,8, +4,1, +-8,7, +5,3, +1,7, +-10,0, +-1,-3, +-6,-4, +0,3, +5,2, +4,-13, +-8,-1, +13,-2, +6,4, +-7,-15, +5,-11, +12,0, +-1,3, +-5,-1, +-8,7, +1,-10, +17,13, +-10,7, +-14,-18, +4,5, +-4,-5, +5,15, +11,15, +17,8, +-9,17, +5,-7, +0,-6, +1,5, +19,1, +4,-21, +13,2, +-5,-4, +18,-13, +-10,-13, +15,-3, +0,9, +-13,1, +-11,-14, +-21,-8, +2,-19, +25,16, +-11,10, +-11,3, +22,5, +-4,9, +12,-14, +20,-1, +10,-20, +7,4, +15,6, +-7,-19, +0,-14, +19,17, +-3,-3, +-19,2, +-6,-19, +14,-19, +-11,18, +-5,18, +2,-9, +-6,26, +-7,12, +18,-1, +18,8, +-19,-22, +-14,11, +-14,-48, +-12,-27, +6,-12, +28,-18, +10,-1, +-9,23, +-3,24, +-3,3, +-19,-34, +-10,15, +32,1, +24,-28, +10,-26, +-7,-13, +-7,-7, +-19,-22, +29,-4, +-2,-37, +27,-26, +16,-4, +14,-11, +27,20, +4,-26, +-29,3, +10,-19, +9,17, +3,42, +29,-24, +-15,-10, +-26,-11, +-4,38, +6,30, +33,13, +-21,6, +3,-28, +3,-11, +3,-14, +-11,26, +-11,42, +-15,21, +-8,-14, +25,-2, +18,-26, +18,-6, +-47,-34, +1,12, +7,16, +-19,21, +18,1, +41,38, +-4,-61, +-28,-55, +45,11, +-38,17, +-21,-26, +-21,10, +-3,6, +11,-59, +46,-35, +14,62, +-53,-4, +-15,-5, +-78,35, +45,52, +37,49, +-16,-20, +72,-5, +-58,-27, +4,17, +49,-104, +18,-13, +-9,-14, +48,46, +10,40, +-9,24, +-15,4, +12,-22, +20,0, +19,18, +1,6, +37,33, +-9,20, +40,-4, +27,38, +-59,-10, +-22,50, +50,47, +11,28, +-56,-12, +0,-1, +44,-18, +72,14, +65,-50, +0,36, +-41,-94, +21,-101, +-19,-33, +2,74, +21,-37, +5,-58, +32,-68, +38,-31, +0,-16, +13,17, +56,-45, +-33,23, +-38,-7, +-29,8, +5,-8, +-49,-23, +12,-33, +13,24, +11,-16, +3,13, +44,6, +50,-8, +-28,-10, +22,44, +54,-10, +-38,27, +-24,-40, +-9,40, +18,-10, +82,-16, +-27,37, +20,44, +-30,-29, +43,2, +-51,-10, +24,-32, +-28,52, +-69,-9, +-29,21, +-92,-7, +-32,-7, +-9,8, +17,27, +1,-34, +-55,-24, +58,9, +-57,5, +28,46, +26,-29, +-57,90, +23,10, +-22,24, +-82,61, +25,21, +-74,-8, +-39,-16, +19,73, +-65,-26, +-31,-42, +66,12, +-31,-23, +43,-22, +27,35, +26,-9, +71,52, +7,-168, +42,17, +36,31, +-5,50, +13,81, +27,-46, +-4,-23, +26,-26, +-52,-39, +28,-26, +-76,-50, +-10,90, +103,-44, +62,-76, +-34,-44, +-27,16, +-3,41, +-8,-25, +37,19, +-3,-50, +3,-34, +54,-31, +-16,-39, +-46,14, +67,-27, +55,-40, +8,52, +23,80, +-72,-106, +-24,-40, +7,-38, +68,-27, +-20,53, +56,-1, +-15,-55, +-43,36, +-15,1, +30,58, +-15,-39, +43,97, +15,3, +-50,14, +-27,-7, +-80,-40, +-44,-39, +-2,26, +41,39, +-68,-15, +-10,-97, +-30,-98, +1,-30, +24,-26, +23,-72, +19,4, +58,62, +4,71, +11,59, +-22,-35, +-83,-41, +105,-70, +12,-16, +139,-77, +-54,6, +69,-29, +-14,-57, +10,-35, +0,-34, +101,14, +105,-39, +-54,-20, +26,-43, +40,45, +20,69, +-35,-11, +110,-56, +-114,-142, +15,84, +17,66, +-71,-12, +64,-76, +-22,-10, +-43,-50, +-26,119, +78,75, +40,-131, +25,36, +-6,119, +-36,-16, +140,-6, +-55,52, +48,50, +-54,30, +74,3, +-66,0, +95,-50, +-1,-106, +-43,-1, +34,-62, +51,25, +22,-117, +-51,19, +73,34, +96,31, +35,28, +-56,63, +-35,123, +-91,20, +63,48, +-13,54, +20,93, +69,-77, +22,12, +-95,20, +-8,54, +64,40, +8,-90, +-5,149, +-47,83, +14,-73, +-56,-3, +-125,26, +-48,-30, +136,-18, +-55,35, +-12,-83, +80,21, +63,109, +-42,47, +-19,-39, +-1,-32, +46,-84, +58,-40, +32,-83, +112,5, +57,-37, +-24,94, +-51,-82, +84,21, +-50,-44, +-8,117, +29,-84, +60,-47, +72,57, +2,-65, +26,-123, +112,-65, +189,-29, +-183,16, +-25,-60, +-150,59, +2,119, +-80,60, +-67,38, +-159,-19, +47,59, +-30,-65, +143,4, +-121,-106, +145,-4, +-63,-189, +-169,-2, +53,37, +42,-3, +-2,-68, +79,109, +-171,-92, +146,55, +49,43, +-106,-1, +-23,41, +68,-59, +1,30, +39,-23, +150,25, +45,14, +64,19, +108,199, +-110,-90, +34,21, +-3,-37, +60,27, +-73,-99, +7,-51, +25,117, +115,-34, +-34,-12, +-42,-25, +142,-135, +38,-77, +88,-194, +15,72, +-97,-58, +50,69, +29,126, +-92,-68, +55,61, +59,-2, +24,-55, +86,66, +20,90, +-20,92, +-111,114, +-13,113, +-50,42, +-25,5, +210,27, +-61,119, +69,-79, +82,-14, +161,79, +51,-96, +-225,-65, +-102,155, +-30,37, +12,-77, +76,29, +-76,159, +-132,4, +65,159, +159,-39, +30,81, +-153,-49, +51,61, +-55,-14, +-133,54, +4,77, +121,-73, +-40,1, +15,-33, +-100,32, +67,38, +155,124, +-44,-49, +-11,-44, +-57,-63, +45,90, +134,29, +120,-116, +66,188, +-137,-182, +-70,-167, +-36,-21, +-95,-67, +-88,104, +23,8, +-12,-117, +-49,-27, +-14,-71, +-111,52, +9,70, +-22,-38, +258,-105, +-50,85, +-202,11, +-60,22, +13,-51, +-17,7, +11,63, +-51,-22, +-8,54, +-28,-11, +28,-35, +49,110, +-119,181, +25,-5, +33,-111, +54,-187, +-48,186, +-59,-5, +11,44, +154,77, +2,-20, +13,-15, +9,101, +-128,97, +173,17, +195,116, +-19,92, +114,-15, +-141,-182, +72,-100, +-27,-57, +-91,7, +190,133, +-17,-99, +-115,-71, +-66,-60, +37,-18, +-74,162, +105,-98, +13,-82, +-62,17, +-56,121, +-12,30, +-1,46, +-77,41, +109,67, +-190,-220, +28,-80, +-139,172, +-121,64, +-54,-61, +115,-46, +-89,50, +-133,155, +61,152, +81,78, +-43,-265, +-3,-157, +47,130, +-36,-209, +-149,-15, +70,-73, +-56,34, +-183,101, +-83,52, +-116,79, +-169,-76, +15,-37, +3,-86, +-25,-77, +56,22, +-97,-14, +-18,33, +-92,-10, +-75,-21, +165,97, +-30,-87, +294,-221, +81,43, +19,-69, +87,-8, +-51,29, +-56,-199, +-5,62, +146,99, +26,-52, +-109,-140, +204,207, +-132,-101, +-56,-28, +-140,-34, +15,-181, +-6,-119, +-37,-27, +64,-72, +-58,-70, +85,99, +-83,54, +-85,-92, +80,21, +-107,-119, +71,211, +-43,-128, +50,-145, +-66,129, +67,91, +105,35, +222,52, +-73,-197, +162,163, +-16,-236, +-8,111, +-51,121, +33,159, +-154,29, +-148,142, +-36,-19, +-10,331, +82,-38, +-34,-47, +115,-263, +208,-25, +28,11, +-22,-87, +59,-133, +42,-20, +3,66, +-172,-58, +213,28, +-79,-30, +2,71, +-49,-86, +96,-143, +3,-110, +178,-22, +45,-85, +68,-47, +81,103, +-91,20, +-190,-103, +42,-107, +40,61, +5,-43, +10,-39, +49,-56, +-63,232, +59,116, +65,-43, +-144,24, +-121,120, +-45,-117, +118,-74, +-174,71, +-82,63, +142,15, +-69,-104, +0,-47, +-162,-27, +-50,36, +-64,-40, +-133,214, +-196,21, +25,-67, +-49,-128, +-143,-104, +118,1, +24,82, +120,-185, +-44,-18, +140,108, +61,-97, +155,-17, +6,-67, +-81,88, +41,-154, +-124,186, +-141,-174, +122,-12, +-62,-95, +-216,71, +50,-19, +82,-138, +-53,-73, +-164,3, +-58,124, +178,-59, +37,46, +52,-43, +-145,46, +-58,72, +85,-61, +294,129, +-102,-188, +-119,64, +3,-62, +-26,-59, +108,26, +38,-49, +11,-307, +-6,-8, +149,134, +65,-206, +14,96, +107,-93, +6,-58, +141,-294, +70,115, +124,-104, +8,144, +-40,61, +-191,-186, +-126,19, +53,-39, +69,-138, +87,26, +78,34, +153,-82, +213,183, +57,38, +-129,-60, +-24,-9, +90,158, +51,34, +18,179, +35,61, +-141,-86, +-21,6, +-119,-33, +83,-54, +-191,37, +69,131, +55,-73, +-37,16, +-12,-72, +-25,-65, +66,-93, +223,168, +34,9, +-18,71, +-164,-51, +50,-183, +108,-52, +-19,50, +7,6, +155,-50, +65,-46, +16,-27, +123,-2, +-100,-51, +-1,18, +-49,92, +60,55, +248,-160, +-3,-198, +-61,25, +-68,86, +237,117, +-10,-94, +41,120, +193,-93, +-87,-47, +-26,12, +-179,-52, +-171,-47, +206,-72, +61,-132, +238,-7, +-264,-188, +50,-82, +74,79, +-54,-200, +73,53, +94,46, +-30,13, +-32,141, +-99,52, +105,14, +-87,244, +-154,-32, +-39,81, +-106,135, +-65,-107, +-167,52, +128,40, +-173,-144, +-8,172, +161,-79, +-27,80, +-16,-24, +1,-48, +-28,189, +3,122, +66,222, +-174,92, +47,69, +-17,76, +22,-95, +77,132, +-12,-132, +-72,124, +-109,-94, +34,-62, +4,-188, +-11,63, +-71,159, +155,-50, +-182,-31, +-1,-76, +0,-27, +-7,0, +-2,-218, +20,-40, +-88,80, +80,-163, +6,44, +79,111, +59,36, +-19,-12, +-85,265, +125,-34, +-64,-103, +80,-42, +12,-39, +97,-106, +188,-68, +302,-86, +-45,-26, +-90,27, +2,-51, +421,74, +188,35, +97,27, +-112,-186, +213,-281, +-93,-160, +30,63, +84,117, +-116,5, +-236,-172, +-21,64, +-152,194, +14,-49, +-62,-168, +-61,-32, +-86,32, +-74,-203, +-14,55, +-29,-62, +71,-144, +41,125, +-162,104, +-126,-230, +-93,9, +-154,-26, +343,-158, +100,-88, +186,54, +-74,-99, +155,190, +-41,-314, +-85,-84, +-286,88, +-139,-113, +101,412, +-116,86, +-127,-107, +60,-104, +278,-64, +-18,-24, +-55,75, +112,241, +-55,-95, +-86,62, +308,-18, +162,27, +-28,-140, +-156,-85, +34,36, +-161,17, +9,36, +83,69, +139,117, +-21,-246, +144,-52, +-11,55, +-88,34, +-176,70, +-135,63, +12,-16, +171,-57, +4,87, +65,-40, +-93,-6, +-196,-175, +-106,101, +-66,148, +200,-32, +-37,2, +-84,-125, +-153,-57, +38,65, +176,12, +-124,48, +137,-106, +-87,-181, +48,-55, +219,-39, +114,-229, +110,83, +61,-55, +109,85, +14,58, +205,-55, +174,-213, +-78,-99, +32,-2, +68,118, +99,57, +-214,-4, +-148,44, +54,-43, +57,-188, +114,-76, +235,130, +151,63, +212,117, +-167,105, +179,-68, +-48,-193, +-219,79, +34,82, +-107,-95, +-100,104, +-44,61, +31,-112, +158,22, +115,232, +-185,-83, +22,-101, +79,54, +78,-64, +29,-34, +-10,-48, +18,-167, +226,-136, +-57,2, +-2,-189, +-28,19, +-57,33, +-128,-15, +-23,-49, +-6,-106, +259,121, +29,289, +-2,9, +-32,-54, +-51,78, +186,-188, +169,66, +-66,-134, +121,34, +104,-236, +60,-43, +-70,-90, +69,-67, +26,109, +-62,-62, +-273,-97, +-96,-218, +-112,36, +-194,-92, +291,85, +-31,167, +-24,22, +-26,-45, +-146,-145, +155,114, +-113,208, +-60,-97, +57,-183, +164,6, +163,50, +125,-135, +-180,-81, +200,-37, +137,45, +9,-150, +-71,54, +86,8, +103,174, +-81,135, +-41,-30, +-211,-36, +-61,113, +-122,-64, +-104,-353, +-314,54, +99,-52, +-65,20, +273,76, +44,17, +111,-154, +-2,-106, +-387,-201, +82,-145, +-352,-118, +-68,56, +-27,-85, +-12,426, +31,-21, +-140,113, +137,123, +-6,132, +-207,111, +145,-175, +-261,204, +-2,97, +-225,-39, +-68,143, +6,0, +-206,77, +85,127, +-212,-22, +-98,148, +-328,23, +113,141, +-56,-70, +243,-36, +-31,-211, +-69,-189, +-98,-67, +-21,-121, +23,151, +-100,129, +-95,-11, +-23,-155, +-75,-16, +-24,233, +-58,57, +140,186, +-82,149, +-90,25, +-33,23, +-10,227, +239,-189, +-146,-133, +49,9, +68,133, +-8,72, +-73,155, +111,28, +-18,55, +0,-43, +-82,1, +1,-191, +-28,-229, +202,181, +-150,191, +51,-52, +42,13, +-81,-34, +107,-143, +-105,173, +118,6, +20,38, +66,124, +-121,8, +22,12, +53,120, +65,-138, +302,-105, +-5,117, +135,263, +-51,193, +88,-47, +-14,-117, +-36,-21, +14,-174, +-73,-114, +-109,-127, +-21,153, +81,-259, +-29,125, +-132,73, +191,-163, +-69,-28, +-3,-106, +-12,145, +8,66, +-165,102, +-106,108, +-67,214, +-30,173, +70,-98, +92,-53, +120,-237, +-123,-39, +72,37, +115,326, +239,174, +-409,-8, +117,-151, +-101,31, +-62,120, +-86,-64, +-49,-23, +240,176, +-100,-3, +15,-102, +169,-110, +101,85, +110,218, +75,32, +-85,53, +29,-76, +14,-65, +-24,154, +39,-1, +29,-51, +-100,226, +105,-76, +-112,-136, +11,119, +-63,-56, +151,-45, +88,-77, +99,84, +-145,16, +13,-44, +-220,67, +-94,25, +360,107, +179,-101, +-40,13, +-52,137, +-98,5, +71,-75, +65,112, +197,147, +189,86, +72,242, +223,350, +-142,121, +303,257, +74,-170, +177,-10, +111,-58, +-89,-142, +-168,290, +-13,115, +-38,140, +-128,269, +-38,-22, +-29,106, +164,-57, +-62,27, +203,-41, +-143,-8, +193,-74, +-57,-226, +-132,334, +13,-259, +36,-53, +-154,146, +0,14, +-36,-133, +-12,-140, +100,213, +-87,165, +-51,-89, +150,-176, +15,64, +-101,56, +-139,204, +-22,-120, +-77,-11, +-98,50, +235,-205, +137,149, +-119,-79, +116,-282, +-55,173, +103,-20, +13,144, +-1,47, +-122,28, +169,-126, +-58,45, +162,148, +52,74, +-152,-68, +-50,-112, +19,-154, +-161,23, +-4,-52, +-10,108, +-103,49, +-200,34, +88,-174, +-13,-113, +-112,-163, +-45,59, +-77,-331, +-25,-88, +54,-41, +195,148, +-2,71, +149,23, +-149,-41, +32,74, +52,91, +-24,37, +-30,173, +-20,-92, +65,221, +200,112, +5,254, +395,-14, +-11,-70, +42,-211, +-6,39, +99,100, +-11,-53, +-37,97, +55,-65, +-35,193, +94,94, +-237,-146, +-97,-115, +61,15, +-242,81, +13,-79, +-88,209, +-57,-113, +30,-11, +8,-16, +-73,-17, +185,83, +-74,21, +28,143, +-71,38, +86,31, +-131,150, +-33,-126, +15,140, +-197,-63, +103,-40, +133,-40, +123,-26, +-81,-333, +-67,35, +-64,88, +-12,-103, +106,145, +148,170, +-184,-113, +-36,-59, +-12,91, +119,135, +-5,-34, +-40,-53, +125,-124, +118,5, +153,46, +-111,-16, +-101,118, +151,1, +139,-78, +125,-17, +-201,-39, +55,153, +41,-216, +52,-85, +19,334, +-158,11, +-1,-60, +-14,93, +234,55, +-101,-17, +-161,-174, +-184,-27, +-92,170, +-86,82, +111,-223, +61,-23, +49,-31, +29,70, +-47,-16, +71,94, +-39,174, +105,-137, +-101,172, +41,154, +151,140, +50,-20, +26,-60, +-172,3, +-69,219, +157,-163, +-95,241, +-168,67, +64,-134, +179,180, +-15,-249, +-77,49, +-37,-3, +107,-19, +123,85, +70,-25, +184,213, +30,178, +150,-57, +-4,52, +30,90, +-11,-64, +9,-6, +25,-34, +-212,-116, +-47,-132, +-38,105, +-81,-101, +-88,14, +100,49, +40,-13, +45,46, +129,8, +-4,9, +33,-143, +11,24, +75,-36, +-32,45, +-29,-40, +-261,92, +-15,-47, +-110,180, +-139,239, +-70,147, +71,-84, +-103,51, +-120,-17, +-51,-226, +-99,-62, +-145,28, +68,35, +97,238, +-85,13, +156,7, +-93,155, +111,77, +110,94, +-137,35, +55,295, +-74,102, +90,-102, +96,-251, +137,57, +-83,150, +-125,-52, +76,57, +-39,-155, +-49,-27, +74,37, +-66,-71, +-220,-46, +-4,31, +102,9, +78,-74, +18,-78, +-167,-155, +88,114, +-24,-188, +-191,54, +38,-207, +132,-103, +26,166, +102,-20, +6,-50, +-66,-75, +39,2, +169,15, +67,10, +68,-122, +-94,63, +-137,-32, +-48,-62, +-53,-239, +116,-132, +196,-180, +-211,152, +190,-102, +-45,21, +-268,13, +11,-131, +106,-41, +-30,5, +-103,-164, +-96,22, +5,40, +-54,-18, +171,79, +11,53, +124,178, +-88,-28, +-193,101, +41,-137, +57,-197, +220,61, +-98,157, +118,13, +59,171, +209,-7, +-59,221, +-237,116, +7,-73, +14,-143, +-239,13, +34,-35, +-163,63, +33,137, +71,41, +-41,-12, +-97,49, +11,40, +125,29, +91,-80, +-319,-1, +-62,-58, +170,50, +22,-231, +-79,38, +44,-176, +15,65, +-150,89, +78,-199, +-43,55, +-146,-52, +15,30, +73,41, +68,11, +-32,62, +50,103, +-167,38, +11,126, +-13,36, +237,109, +44,58, +24,-49, +96,166, +-2,-176, +-165,99, +-4,-97, +21,-262, +-112,-124, +99,190, +37,-73, +-20,-101, +-13,-81, +-187,79, +27,-4, +26,-23, +44,-2, +76,89, +132,77, +82,31, +131,24, +-85,91, +119,-142, +-66,26, +-38,49, +-62,-79, +-116,-57, +-84,198, +69,19, +-96,37, +106,88, +59,154, +-34,-96, +-183,-97, +78,39, +41,-67, +80,6, +103,21, +175,50, +-100,-59, +-50,-75, +24,32, +-9,-24, +77,-156, +51,79, +-9,-160, +4,-162, +91,-91, +125,2, +-70,11, +33,114, +78,50, +3,-83, +110,-23, +-7,26, +-64,130, +153,-54, +200,-53, +114,-43, +1,-164, +180,6, +27,-82, +103,-73, +-14,138, +162,-51, +-25,6, +119,116, +29,198, +17,-58, +-122,25, +-36,-119, +-50,-75, +-73,99, +101,-100, +-17,-66, +-52,-140, +-32,22, +23,68, +37,0, +60,161, +-17,38, +-107,-124, +-86,-80, +5,69, +18,214, +-66,71, +120,-40, +-62,-34, +-89,10, +148,77, +155,-90, +87,34, +-79,-45, +-120,-162, +39,12, +123,71, +81,6, +-32,35, +66,-7, +-69,-107, +-238,55, +112,28, +-43,-16, +-65,-74, +-4,-46, +-125,-60, +60,-76, +127,137, +147,0, +-61,88, +66,27, +5,131, +6,-61, +-58,168, +-94,63, +-22,61, +-132,66, +-35,225, +17,86, +6,-20, +132,2, +-86,36, +-67,89, +80,15, +59,14, +30,19, +7,8, +-81,150, +-189,-6, +-26,-48, +-88,101, +4,25, +-88,9, +8,27, +-1,-67, +-94,-41, +22,80, +97,178, +-89,-23, +9,110, +7,12, +-85,-107, +-65,-92, +97,143, +137,-28, +-67,34, +124,-27, +85,-28, +-19,-102, +-60,-55, +47,-53, +-34,18, +-15,-32, +-32,94, +87,-46, +10,161, +48,90, +78,22, +16,71, +-50,47, +26,-87, +34,4, +-13,-133, +-169,13, +54,105, +56,-50, +-55,14, +-209,-9, +-48,-50, +-35,-62, +69,-35, +-111,62, +142,40, +-11,57, +19,83, +147,147, +-8,-156, +76,-3, +79,-31, +24,14, +29,10, +27,112, +-5,-43, +41,-93, +-98,12, +19,-28, +-55,-23, +45,-39, +24,38, +-221,-41, +73,5, +-113,124, +3,-61, +2,-167, +-34,-41, +-52,198, +111,-44, +2,-100, +-46,52, +94,3, +68,-37, +1,60, +62,-195, +-56,-7, +-93,-27, +-21,-64, +82,-72, +66,-65, +154,67, +-47,185, +104,-75, +102,64, +-7,40, +-101,146, +-63,-78, +-21,-61, +96,-47, +9,-16, +125,151, +-14,-13, +22,38, +42,-29, +-52,-34, +-18,-108, +-56,10, +-33,91, +-25,-71, +-45,-96, +-6,-17, +54,-22, +-81,95, +50,-76, +-178,142, +-122,41, +-52,-161, +28,-15, +-54,-13, +26,-78, +-54,140, +10,93, +30,-34, +-51,8, +-83,31, +87,-31, +7,101, +-34,74, +-56,-53, +-119,-27, +77,-28, +-105,-35, +23,36, +-92,-87, +-52,55, +34,121, +5,-68, +-48,-110, +2,-8, +-9,8, +-35,-30, +-7,19, +-85,-6, +71,-47, +44,-38, +3,50, +-70,88, +-131,0, +107,45, +130,-91, +65,41, +-20,8, +126,12, +30,84, +-3,-71, +77,62, +34,24, +87,9, +6,-38, +-77,-73, +-64,-28, +-38,-64, +9,-40, +8,11, +19,-10, +170,-98, +65,-22, +9,-70, +-6,-51, +54,-100, +-55,43, +44,11, +-27,19, +-46,-8, +-29,42, +53,20, +-32,43, +29,38, +32,8, +-45,-4, +27,-61, +-19,-7, +-21,-48, +-75,-53, +-6,-53, +-22,52, +-3,-9, +25,-28, +16,67, +9,1, +48,74, +101,39, +47,72, +-57,35, +68,48, +4,10, +-93,-74, +80,17, +-114,85, +50,15, +50,-76, +-22,-15, +102,22, +-42,6, +63,-72, +-18,-39, +-40,89, +63,29, +124,2, +-22,22, +43,-41, +4,60, +65,-20, +15,7, +-22,2, +53,18, +-75,44, +-45,15, +9,0, +74,-70, +-2,-56, +-71,-90, +-36,-3, +71,32, +2,79, +-33,-83, +66,-7, +52,-15, +20,10, +-69,52, +-29,-30, +100,-16, +-84,-21, +-29,119, +60,21, +-24,-35, +29,-15, +32,13, +-37,92, +-19,17, +-25,-5, +-18,6, +40,21, +74,35, +-70,-66, +-19,-12, +81,7, +9,67, +0,-8, +33,-36, +-31,-15, +-58,-20, +-66,9, +21,105, +-41,-23, +16,-22, +-14,-20, +37,-13, +-21,-22, +54,-14, +14,36, +12,-63, +64,51, +-22,-2, +19,15, +8,-7, +-56,0, +38,-13, +-9,-6, +36,-59, +-10,4, +22,-48, +-48,-16, +-41,-32, +34,-54, +35,68, +35,-23, +-39,-16, +40,25, +11,4, +-9,18, +-21,-16, +-70,58, +34,25, +44,112, +83,-20, +-2,45, +54,22, +-18,-56, +50,18, +26,33, +1,-45, +11,22, +-6,-12, +25,39, +34,27, +18,44, +-81,-33, +-22,-7, +-58,-13, +13,-44, +-67,11, +-34,13, +1,-43, +31,-50, +-3,31, +28,-38, +-32,-19, +-21,3, +-34,-30, +-22,-25, +18,19, +51,8, +-4,42, +-22,-15, +1,13, +28,-28, +-5,24, +67,-1, +-37,28, +-17,-21, +-19,12, +-17,16, +25,46, +-42,8, +1,-51, +15,7, +-16,-18, +69,-59, +-12,39, +-40,20, +-13,-23, +35,8, +38,-3, +-6,2, +-63,10, +29,-29, +31,-12, +-49,3, +17,-4, +-19,-27, +31,7, +-59,-5, +-1,36, +18,-28, +-28,49, +17,-11, +-6,21, +30,-19, +18,-28, +49,0, +39,-9, +5,-34, +34,-12, +-43,19, +-25,21, +36,53, +-28,-2, +71,41, +60,-16, +27,48, +31,26, +32,26, +3,33, +-2,-11, +6,3, +10,-21, +7,-9, +-2,48, +-12,39, +33,0, +-2,-34, +-9,-24, +9,14, +10,-19, +-7,35, +-24,17, +20,-3, +-11,-18, +-10,17, +4,-22, +1,11, +20,-1, +-4,-4, +2,8, +16,2, +-20,-10, +-8,7, +34,-1, +8,12, +16,28, +-2,12, +-33,-1, +12,9, +21,-2, +-6,25, +-6,-25, +16,-20, +2,24, +-17,-37, +-4,2, +29,-13, +26,41, +22,-6, +-22,-6, +-12,5, +-20,21, +1,-1, +10,0, +28,-4, +15,-19, +3,-11, +18,-4, +2,4, +5,-10, +-20,10, +-2,-2, +4,5, +-3,-11, +6,6, +-21,5, +15,-16, +-22,-5, +-16,3, +0,-5, +-7,0, +-11,4, +19,6, +26,-8, +1,23, +-6,3, +-2,15, +-6,6, +11,-7, +3,1, +-3,-2, +11,7, +7,-1, +-7,8, +10,-10, +-9,7, +-8,1, +11,-7, +5,7, +3,-3, +1,7, +-19,-3, +-4,-2, +11,-4, +-9,5, +4,0, +11,0, +0,-1, +3,4, +9,-2, +-14,3, +-3,-1, +9,8, +1,-5, +-3,-5, +11,2, +1,-1, +2,2, +9,-3, +-1,-1, +-8,-1, +5,-2, +2,-2, +-3,0, +6,1, +-5,-2, +-5,-2, +3,2, +-4,0, +-2,3, +5,-2, +-1,0, +-3,-2, +6,0, +-3,0, +-3,0, +6,0, +-3,0, +-3,0, +6,0, +-3,2, +-1,0, +5,2, +-2,-3, +-4,0, +3,-2, +-5,2, +-5,2, +6,-1, +-3,0, +2,2, +5,2, +-8,1, +-1,1, +9,3, +2,-2, +1,1, +11,-2, +-3,5, +1,5, +9,-8, +-3,1, +-14,-3, +9,2, +3,-4, +0,1, +11,0, +4,0, +-9,-5, +11,4, +-4,2, +-19,3, +1,-7, +3,3, +5,-7, +11,7, +-8,-1, +-9,-7, +10,10, +-7,-8, +7,1, +11,-7, +-3,2, +3,-1, +11,7, +-6,-6, +-2,-15, +-6,-3, +1,-23, +26,8, +19,-6, +-11,-4, +-7,0, +0,5, +-16,-3, +-22,5, +15,16, +-21,-5, +6,-6, +-3,11, +4,-5, +-2,2, +-20,-10, +5,10, +2,-4, +18,4, +3,11, +15,19, +28,4, +10,0, +1,1, +-20,-21, +-12,-5, +-22,6, +22,6, +26,-41, +29,13, +-4,-2, +-17,37, +2,-24, +16,20, +-6,25, +-6,-25, +21,2, +12,-9, +-33,1, +-2,-12, +16,-28, +8,-12, +34,1, +-8,-7, +-20,10, +16,-2, +2,-8, +-4,4, +20,1, +1,-11, +4,22, +-10,-17, +-11,18, +20,3, +-24,-17, +-7,-35, +10,19, +9,-14, +-9,24, +-2,34, +33,0, +-12,-39, +-2,-48, +7,9, +10,21, +6,-3, +-2,11, +3,-33, +32,-26, +31,-26, +27,-48, +60,16, +71,-41, +-28,2, +36,-53, +-25,-21, +-43,-19, +34,12, +5,34, +39,9, +49,0, +18,28, +30,19, +-6,-21, +17,11, +-28,-49, +18,28, +-1,-36, +-59,5, +31,-7, +-19,27, +17,4, +-49,-3, +31,12, +29,29, +-63,-10, +-6,-2, +38,3, +35,-8, +-13,23, +-40,-20, +-12,-39, +69,59, +-16,18, +15,-7, +1,51, +-42,-8, +25,-46, +-17,-16, +-19,-12, +-17,21, +-37,-28, +67,1, +-5,-24, +28,28, +1,-13, +-22,15, +-4,-42, +51,-8, +18,-19, +-22,25, +-34,30, +-21,-3, +-32,19, +28,38, +-3,-31, +31,50, +1,43, +-34,-13, +-67,-11, +13,44, +-58,13, +-22,7, +-81,33, +18,-44, +34,-27, +25,-39, +-6,12, +11,-22, +1,45, +26,-33, +50,-18, +-18,56, +54,-22, +-2,-45, +83,20, +44,-112, +34,-25, +-70,-58, +-21,16, +-9,-18, +11,-4, +40,-25, +-39,16, +35,23, +35,-68, +34,54, +-41,32, +-48,16, +22,48, +-10,-4, +36,59, +-9,6, +38,13, +-56,0, +8,7, +19,-15, +-22,2, +64,-51, +12,63, +14,-36, +54,14, +-21,22, +37,13, +-14,20, +16,22, +-41,23, +21,-105, +-66,-9, +-58,20, +-31,15, +33,36, +0,8, +9,-67, +81,-7, +-19,12, +-70,66, +74,-35, +40,-21, +-18,-6, +-25,5, +-19,-17, +-37,-92, +32,-13, +29,15, +-24,35, +60,-21, +-29,-119, +-84,21, +100,16, +-29,30, +-69,-52, +20,-10, +52,15, +66,7, +-33,83, +2,-79, +71,-32, +-36,3, +-71,90, +-2,56, +74,70, +9,0, +-45,-15, +-75,-44, +53,-18, +-22,-2, +15,-7, +65,20, +4,-60, +43,41, +-22,-22, +124,-2, +63,-29, +-40,-89, +-18,39, +63,72, +-42,-6, +102,-22, +-22,15, +50,76, +50,-15, +-114,-85, +80,-17, +-93,74, +4,-10, +68,-48, +-57,-35, +47,-72, +101,-39, +48,-74, +9,-1, +16,-67, +25,28, +-3,9, +-22,-52, +-6,53, +-75,53, +-21,48, +-19,7, +27,61, +-45,4, +32,-8, +29,-38, +-32,-43, +53,-20, +-29,-42, +-46,8, +-27,-19, +44,-11, +-55,-43, +54,100, +-6,51, +9,70, +65,22, +170,98, +19,10, +8,-11, +9,40, +-38,64, +-64,28, +-77,73, +6,38, +87,-9, +34,-24, +77,-62, +-3,71, +30,-84, +126,-12, +-20,-8, +65,-41, +130,91, +107,-45, +-131,0, +-70,-88, +3,-50, +44,38, +71,47, +-85,6, +-7,-19, +-35,30, +-9,-8, +2,8, +-48,110, +5,68, +34,-121, +-52,-55, +-92,87, +23,-36, +-105,35, +77,28, +-119,27, +-56,53, +-34,-74, +7,-101, +87,31, +-83,-31, +-51,-8, +30,34, +10,-93, +-54,-140, +26,78, +-54,13, +28,15, +-52,161, +-122,-41, +-178,-142, +50,76, +-81,-95, +54,22, +-6,17, +-45,96, +-25,71, +-33,-91, +-56,-10, +-18,108, +-52,34, +42,29, +22,-38, +-14,13, +125,-151, +9,16, +96,47, +-21,61, +-63,78, +-101,-146, +-7,-40, +102,-64, +104,75, +-47,-185, +154,-67, +66,65, +82,72, +-21,64, +-93,27, +-56,7, +62,195, +1,-60, +68,37, +94,-3, +-46,-52, +2,100, +111,44, +-52,-198, +-34,41, +2,167, +3,61, +-113,-124, +73,-5, +-221,41, +24,-38, +45,39, +-55,23, +19,28, +-98,-12, +41,93, +-5,43, +27,-112, +29,-10, +24,-14, +79,31, +76,3, +-8,156, +147,-147, +19,-83, +-11,-57, +142,-40, +-111,-62, +69,35, +-35,62, +-48,50, +-209,9, +-55,-14, +56,50, +54,-105, +-169,-13, +-13,133, +34,-4, +26,87, +-50,-47, +16,-71, +78,-22, +48,-90, +10,-161, +87,46, +-32,-94, +-15,32, +-34,-18, +47,53, +-60,55, +-19,102, +85,28, +124,27, +-67,-34, +137,28, +97,-143, +-65,92, +-85,107, +7,-12, +9,-110, +-89,23, +97,-178, +22,-80, +-94,41, +-1,67, +8,-27, +-88,-9, +4,-25, +-88,-101, +-26,48, +-189,6, +-81,-150, +7,-8, +30,-19, +59,-14, +80,-15, +-67,-89, +-86,-36, +132,-2, +6,20, +17,-86, +-35,-225, +-132,-66, +-22,-61, +-94,-63, +-58,-168, +6,61, +5,-131, +66,-27, +-61,-88, +147,0, +127,-137, +60,76, +-125,60, +-4,46, +-65,74, +-43,16, +112,-28, +-238,-55, +-69,107, +66,7, +-32,-35, +81,-6, +123,-71, +39,-12, +-120,162, +-79,45, +87,-34, +155,90, +148,-77, +-89,-10, +-62,34, +120,40, +-66,-71, +18,-214, +5,-69, +-86,80, +-107,124, +-17,-38, +60,-161, +37,0, +23,-68, +-32,-22, +-52,140, +-17,66, +101,100, +-73,-99, +-50,75, +-36,119, +-122,-25, +17,58, +29,-198, +119,-116, +-25,-6, +162,51, +-14,-138, +103,73, +27,82, +180,-6, +1,164, +114,43, +200,53, +153,54, +-64,-130, +-7,-26, +110,23, +3,83, +78,-50, +33,-114, +-70,-11, +125,-2, +91,91, +4,162, +-9,160, +51,-79, +77,156, +-9,24, +24,-32, +-50,75, +-100,59, +175,-50, +103,-21, +80,-6, +41,67, +78,-39, +-183,97, +-34,96, +59,-154, +106,-88, +-96,-37, +69,-19, +-84,-198, +-116,57, +-62,79, +-38,-49, +-66,-26, +119,142, +-85,-91, +131,-24, +82,-31, +132,-77, +76,-89, +44,2, +26,23, +27,4, +-187,-79, +-13,81, +-20,101, +37,73, +99,-190, +-112,124, +21,262, +-4,97, +-165,-99, +-2,176, +96,-166, +24,49, +44,-58, +237,-109, +-13,-36, +11,-126, +-167,-38, +50,-103, +-32,-62, +68,-11, +73,-41, +15,-30, +-146,52, +-43,-55, +78,199, +-150,-89, +15,-65, +44,176, +-79,-38, +22,231, +170,-50, +-62,58, +-319,1, +91,80, +125,-29, +11,-40, +-97,-49, +-41,12, +71,-41, +33,-137, +-163,-63, +34,35, +-239,-13, +14,143, +7,73, +-237,-116, +-59,-221, +209,7, +59,-171, +118,-13, +-98,-157, +220,-61, +57,197, +41,137, +-193,-101, +-88,28, +124,-178, +11,-53, +171,-79, +-54,18, +5,-40, +-96,-22, +-103,164, +-30,-5, +106,41, +11,131, +-268,-13, +-45,-21, +190,102, +-211,-152, +196,180, +116,132, +-53,239, +-48,62, +-137,32, +-94,-63, +68,122, +67,-10, +169,-15, +39,-2, +-66,75, +6,50, +102,20, +26,-166, +132,103, +38,207, +-191,-54, +-24,188, +88,-114, +-167,155, +18,78, +78,74, +102,-9, +-4,-31, +-220,46, +-66,71, +74,-37, +-49,27, +-39,155, +76,-57, +-125,52, +-83,-150, +137,-57, +96,251, +90,102, +-74,-102, +55,-295, +-137,-35, +110,-94, +111,-77, +-93,-155, +156,-7, +-85,-13, +97,-238, +68,-35, +-145,-28, +-99,62, +-51,226, +-120,17, +-103,-51, +71,84, +-70,-147, +-139,-239, +-110,-180, +-15,47, +-261,-92, +-29,40, +-32,-45, +75,36, +11,-24, +33,143, +-4,-9, +129,-8, +45,-46, +40,13, +100,-49, +-88,-14, +-81,101, +-38,-105, +-47,132, +-212,116, +25,34, +9,6, +-11,64, +30,-90, +-4,-52, +150,57, +30,-178, +184,-213, +70,25, +123,-85, +107,19, +-37,3, +-77,-49, +-15,249, +179,-180, +64,134, +-168,-67, +-95,-241, +157,163, +-69,-219, +-172,-3, +26,60, +50,20, +151,-140, +41,-154, +-101,-172, +105,137, +-39,-174, +71,-94, +-47,16, +29,-70, +49,31, +61,23, +111,223, +-86,-82, +-92,-170, +-184,27, +-161,174, +-101,17, +234,-55, +-14,-93, +-1,60, +-158,-11, +19,-334, +52,85, +41,216, +55,-153, +-201,39, +125,17, +139,78, +151,-1, +-101,-118, +-111,16, +153,-46, +118,-5, +125,124, +-40,53, +-5,34, +119,-135, +-12,-91, +-36,59, +-184,113, +148,-170, +106,-145, +-12,103, +-64,-88, +-67,-35, +-81,333, +123,26, +133,40, +103,40, +-197,63, +15,-140, +-33,126, +-131,-150, +86,-31, +-71,-38, +28,-143, +-74,-21, +185,-83, +-73,17, +8,16, +30,11, +-57,113, +-88,-209, +13,79, +-242,-81, +61,-15, +-97,115, +-237,146, +94,-94, +-35,-193, +55,65, +-37,-97, +-11,53, +99,-100, +-6,-39, +42,211, +-11,70, +395,14, +5,-254, +200,-112, +65,-221, +-20,92, +-30,-173, +-24,-37, +52,-91, +32,-74, +-149,41, +149,-23, +-2,-71, +195,-148, +54,41, +-25,88, +-77,331, +-45,-59, +-112,163, +-13,113, +88,174, +-200,-34, +-103,-49, +-10,-108, +-4,52, +-161,-23, +19,154, +-50,112, +-152,68, +52,-74, +162,-148, +-58,-45, +169,126, +-122,-28, +-1,-47, +13,-144, +103,20, +-55,-173, +116,282, +-119,79, +137,-149, +235,205, +-98,-50, +-77,11, +-22,120, +-139,-204, +-101,-56, +15,-64, +150,176, +-51,89, +-87,-165, +100,-213, +-12,140, +-36,133, +0,-14, +-154,-146, +36,53, +13,259, +-132,-334, +-57,226, +193,74, +-143,8, +203,41, +-62,-27, +164,57, +-29,-106, +-38,22, +-128,-269, +-38,-140, +-13,-115, +-168,-290, +-89,142, +111,58, +177,10, +74,170, +303,-257, +-142,-121, +223,-350, +72,-242, +189,-86, +197,-147, +65,-112, +71,75, +-98,-5, +-52,-137, +-40,-13, +179,101, +360,-107, +-94,-25, +-220,-67, +13,44, +-145,-16, +99,-84, +88,77, +151,45, +-63,56, +11,-119, +-112,136, +105,76, +-100,-226, +29,51, +39,1, +-24,-154, +14,65, +29,76, +-85,-53, +75,-32, +110,-218, +101,-85, +169,110, +15,102, +-100,3, +240,-176, +-49,23, +-86,64, +-62,-120, +-101,-31, +117,151, +-409,8, +239,-174, +115,-326, +72,-37, +-123,39, +120,237, +92,53, +70,98, +-30,-173, +-67,-214, +-106,-108, +-165,-102, +8,-66, +-12,-145, +-3,106, +-69,28, +191,163, +-132,-73, +-29,-125, +81,259, +-21,-153, +-109,127, +-73,114, +14,174, +-36,21, +-14,117, +88,47, +-51,-193, +135,-263, +-5,-117, +302,105, +65,138, +53,-120, +22,-12, +-121,-8, +66,-124, +20,-38, +118,-6, +-105,-173, +107,143, +-81,34, +42,-13, +51,52, +-150,-191, +202,-181, +-28,229, +1,191, +-82,-1, +0,43, +-18,-55, +111,-28, +-73,-155, +-8,-72, +68,-133, +49,-9, +-146,133, +239,189, +-10,-227, +-33,-23, +-90,-25, +-82,-149, +140,-186, +-58,-57, +-24,-233, +-75,16, +-23,155, +-95,11, +-100,-129, +23,-151, +-21,121, +-98,67, +-69,189, +-31,211, +243,36, +-56,70, +113,-141, +-328,-23, +-98,-148, +-212,22, +85,-127, +-206,-77, +6,0, +-148,72, +44,57, +-120,26, +115,55, +-55,124, +29,55, +-149,203, +-53,52, +-264,-68, +18,-78, +298,66, +-234,-222, +-52,48, +-100,21, +114,-85, +175,-19, +204,3, +77,82, +59,-16, +22,25, +150,-125, +-126,-14, +278,209, +124,-216, +-2,129, +-66,2, +45,23, +-105,103, +27,186, +-171,7, +-360,58, +50,188, +-68,-114, +56,-93, +-146,-75, +63,186, +177,-188, +207,72, +44,-175, +104,120, +-107,29, +-114,30, +-159,-34, +109,50, +19,-35, +-162,-26, +188,81, +269,66, +31,139, +-89,-181, +-2,-82, +-49,-88, +-305,-203, +61,182, +194,-110, +125,38, +1,-130, +22,103, +7,95, +95,-80, +149,-103, +52,-134, +218,161, +82,116, +-138,176, +100,117, +-67,-62, +-49,-128, +-12,124, +-74,59, +37,45, +185,-47, +-118,-48, +-324,97, +125,15, +-64,196, +142,154, +-36,91, +-14,-24, +-21,165, +8,169, +-127,-68, +23,-204, +-13,-3, +12,-5, +222,-185, +-32,-18, +-101,156, +217,264, +128,110, +-21,177, +305,239, +-130,169, +-297,110, +-72,-132, +-112,91, +46,188, +-104,-118, +32,12, +30,-21, +-66,160, +5,16, +-99,157, +40,-46, +47,-57, +-73,-155, +-253,-65, +-16,212, +90,-61, +-150,86, +251,158, +33,-50, +-104,25, +24,-131, +-25,200, +117,37, +-61,-215, +95,58, +234,129, +-166,257, +50,-69, +-20,-56, +-4,54, +-100,-42, +-63,-7, +-80,154, +-152,-167, +-20,166, +1,-34, +-76,40, +13,73, +28,80, +-45,56, +-261,308, +-3,-26, +11,-18, +-106,-105, +63,73, +186,149, +182,53, +6,-71, +-73,-27, +12,20, +154,139, +81,-38, +2,215, +106,-19, +126,-14, +-9,-104, +-411,130, +-7,-131, +-226,145, +-30,-145, +171,120, +-100,85, +146,-206, +-47,-105, +41,-87, +-2,-67, +-70,58, +-130,-89, +84,-181, +-169,-54, +26,-96, +120,-158, +125,201, +-151,165, +147,20, +34,-216, +-139,222, +39,-97, +79,-145, +16,-175, +146,-49, +-79,53, +-6,193, +-120,131, +59,-112, +37,19, +48,193, +-43,123, +-134,147, +-91,302, +93,105, +43,150, +-11,-18, +-180,43, +-25,64, +116,120, +120,34, +70,253, +-142,15, +161,-43, +145,66, +53,41, +-44,-24, +-16,28, +287,-12, +357,353, +-13,80, +-88,-182, +206,-54, +-59,11, +-4,-14, +-165,8, +129,2, +40,13, +-17,-24, +-36,40, +115,-1, +-276,-70, +-73,254, +134,25, +-139,77, +34,52, +85,-176, +-26,26, +-26,-159, +-140,-92, +148,-79, +-20,251, +-229,-69, +136,66, +-8,-85, +-34,-102, +58,29, +176,-1, +-19,37, +-59,32, +215,4, +-157,-149, +81,-135, +270,-184, +90,-136, +-118,-153, +114,86, +-19,-113, +93,105, +-128,0, +81,-4, +-26,17, +-186,-112, +-130,126, +93,-41, +98,61, +30,-5, +92,206, +-55,-57, +122,-182, +-11,63, +181,95, +-26,-43, +-98,155, +75,-152, +-137,-134, +1,118, +-93,-67, +29,-95, +64,-203, +-124,-147, +-43,-135, +-71,42, +20,7, +-135,-90, +-222,18, +88,-64, +-165,76, +165,-174, +96,16, +22,-113, +29,42, +78,-127, +-98,77, +-119,-234, +-7,-136, +36,199, +-167,130, +-72,-38, +18,5, +223,-19, +6,41, +50,-78, +-113,72, +-149,173, +0,89, +102,159, +-20,-64, +17,-1, +-261,121, +194,116, +216,-145, +-166,-64, +-32,-43, +77,149, +65,-180, +197,45, +-35,6, +54,-148, +74,218, +-425,168, +-140,49, +-83,-69, +-18,0, +156,234, +-7,69, +-21,56, +-8,-206, +-176,-35, +-15,183, +40,-40, +87,165, +-109,-46, +-80,-94, +119,190, +279,-40, +-21,-31, +-45,36, +93,-55, +-2,163, +-80,35, +30,-87, +-37,119, +-130,-36, +-8,-79, +-85,-92, +155,20, +106,16, +-16,-128, +142,119, +-3,166, +177,-122, +112,-45, +-74,-66, +-18,102, +-143,74, +92,76, +-56,63, +100,-125, +-71,-11, +88,-66, +98,160, +-168,-36, +19,38, +11,-117, +-153,-58, +45,-89, +-59,65, +189,39, +-106,205, +210,132, +-234,87, +1,4, +-38,-72, +-18,63, +79,-18, +-32,124, +83,-163, +133,-205, +-12,-51, +-169,194, +-21,57, +50,-79, +166,22, +148,-28, +23,89, +221,137, +55,-68, +-5,132, +-102,175, +86,61, +-50,-30, +99,27, +30,-86, +-119,-33, +104,134, +-34,104, +42,39, +-40,0, +17,-104, +229,80, +-279,78, +-87,83, +-84,73, +-28,75, +51,-109, +-85,21, +73,98, +-29,-18, +-18,74, +-50,-180, +40,-52, +30,64, +-246,-25, +74,120, +-18,52, +-75,254, +67,3, +51,62, +-140,-30, +-63,-82, +34,-184, +25,-64, +-64,-346, +160,39, +-16,-32, +-49,-160, +38,89, +46,-18, +-269,-146, +-237,2, +-141,-121, +85,200, +203,151, +64,45, +77,111, +-112,22, +138,-154, +103,25, +-118,76, +44,52, +79,-103, +-164,-114, +-84,-111, +-49,86, +1,59, +8,163, +35,-188, +-185,-85, +-22,137, +-61,-46, +2,-100, +1,-4, +8,77, +-55,23, +17,-12, +9,-130, +262,15, +-42,-28, +66,8, +-120,99, +122,-125, +-62,39, +163,-62, +87,82, +18,59, +139,42, +-24,-18, +119,-34, +25,-36, +102,95, +-71,10, +87,-45, +-29,37, +-97,33, +3,114, +67,-74, +59,-253, +-5,-36, +47,-88, +-72,-18, +-36,-145, +13,51, +-80,129, +-59,135, +-41,134, +61,45, +61,147, +95,-10, +12,-134, +3,-146, +81,15, +36,-175, +-215,79, +-21,24, +181,18, +-157,-53, +-6,-83, +59,-39, +-95,-158, +97,-5, +-38,64, +-63,106, +-86,-50, +134,-102, +34,12, +75,-199, +62,108, +-81,14, +20,-10, +-102,4, +-126,47, +115,-157, +77,27, +-5,10, +-93,-14, +150,-22, +-194,-4, +30,-186, +-34,-9, +46,-41, +-170,58, +-42,53, +97,47, +24,97, +96,-46, +-10,152, +2,61, +6,105, +119,152, +-94,87, +299,-106, +22,185, +-16,72, +46,148, +181,-81, +58,126, +130,-44, +58,5, +63,62, +-19,91, +140,14, +15,2, +6,-122, +93,-97, +-175,181, +-47,-205, +-57,18, +-31,-11, +-3,29, +60,-109, +-95,173, +-9,28, +-48,-92, +26,-51, +-8,-77, +66,19, +-51,15, +34,42, +-185,106, +-1,40, +-19,-7, +3,-134, +146,72, +-52,-50, +-116,40, +-82,3, +0,-69, +-109,9, +6,11, +132,50, +-108,-149, +20,-76, +-100,166, +-84,-24, +-131,-24, +22,125, +63,58, +119,-12, +55,54, +138,-117, +129,-50, +-3,29, +-50,-57, +-119,-43, +53,23, +-156,29, +-131,-3, +-75,112, +42,-26, +111,-98, +-37,35, +-17,-10, +35,29, +24,-7, +24,125, +-63,-26, +-3,112, +35,0, +56,74, +25,88, +45,36, +-113,103, +60,-82, +-45,84, +49,-115, +25,122, +-90,64, +-4,134, +-62,-80, +20,0, +80,9, +-2,-18, +-118,-9, +30,21, +52,-135, +-62,-19, +-80,-53, +4,27, +188,7, +-54,-21, +-19,-129, +-94,-34, +-96,5, +37,12, +111,-7, +-77,5, +-27,91, +-7,34, +29,-113, +112,185, +91,105, +49,15, +104,-19, +-190,-238, +-24,-168, +52,21, +-88,58, +4,-94, +-11,60, +-124,54, +-32,0, +-222,-26, +-44,77, +-71,-94, +-17,-77, +-4,57, +104,3, +46,-37, +164,40, +-26,-70, +64,-27, +4,-83, +-59,59, +-30,-3, +-82,-73, +102,46, +25,-20, +-27,23, +11,-50, +-17,31, +69,-27, +63,-185, +60,11, +-1,-43, +13,131, +-62,-35, +33,-64, +108,120, +43,-66, +-14,2, +-20,14, +-30,6, +6,60, +39,-39, +116,8, +43,-57, +34,88, +12,69, +81,96, +23,31, +-63,112, +11,81, +28,-89, +77,-51, +30,-8, +-177,50, +-59,64, +26,25, +64,-43, +-55,62, +36,-8, +-30,-128, +26,70, +141,-97, +54,122, +73,-30, +4,88, +-19,-90, +-82,0, +-1,-17, +-58,-48, +63,10, +8,-28, +46,54, +-88,45, +0,-76, +-13,93, +59,-38, +62,-13, +6,-78, +33,27, +-98,26, +-9,65, +62,104, +59,-54, +-30,80, +-46,60, +53,1, +-54,66, +-89,-84, +65,-51, +-27,6, +10,-16, +28,-33, +13,13, +71,30, +-50,-23, +-24,16, +67,101, +-21,109, +31,-73, +-9,-44, +-23,37, +125,43, +-12,-58, +-1,-18, +-36,-66, +-79,4, +129,46, +62,-12, +22,61, +-37,-30, +10,-180, +126,-46, +33,-95, +11,54, +-44,67, +-7,-37, +19,123, +-70,43, +97,-104, +-87,20, +-68,69, +69,30, +68,6, +-46,-123, +32,69, +21,37, +74,-30, +67,-44, +34,-42, +-20,-29, +-21,79, +51,27, +-52,64, +0,-65, +90,-59, +36,1, +-35,18, +-65,-79, +-68,-24, +68,31, +-80,5, +8,11, +-33,75, +-15,-8, +-62,44, +76,-79, +-59,-16, +-32,-78, +40,-24, +-20,30, +-48,-78, +-52,-9, +-77,7, +-94,7, +60,-5, +-23,-62, +-49,24, +4,-44, +-35,0, +53,1, +29,12, +-11,84, +-38,-39, +-17,43, +31,1, +71,21, +-43,46, +39,26, +-5,-45, +18,-73, +-49,-6, +20,6, +33,11, +-39,-54, +49,87, +-38,-23, +-20,-23, +-69,46, +-50,92, +-76,1, +-31,15, +-8,-10, +9,44, +10,-25, +24,40, +-29,60, +-12,-48, +-11,29, +-47,8, +71,-31, +4,-46, +25,46, +-65,14, +-15,-102, +-55,59, +12,32, +-27,-61, +15,47, +74,-8, +1,-47, +40,-13, +-22,-48, +0,37, +16,-10, +-15,7, +11,20, +-3,14, +-3,-95, +12,65, +-36,20, +-42,-23, +33,12, +66,98, +66,90, +-53,8, +15,-27, +34,19, +-16,60, +0,14, +35,5, +15,-26, +68,66, +8,32, +19,-31, +16,-17, +14,-33, +-4,27, +86,25, +50,-25, +49,-47, +49,1, +40,4, +5,14, +-16,10, +18,-8, +64,-52, +16,43, +-24,-12, +-29,22, +-69,39, +19,-21, +2,-22, +4,25, +-48,-1, +82,4, +29,1, +-30,53, +-25,-19, +-19,-4, +-41,-26, +-19,5, +1,-31, +0,-5, +-26,10, +-44,18, +-16,-29, +-5,53, +19,-12, +22,-7, +-52,0, +53,-84, +-24,-20, +-1,-48, +-16,41, +22,32, +1,-10, +47,21, +-11,38, +21,-1, +-3,-18, +-22,8, +11,30, +39,50, +7,5, +-11,-16, +-25,1, +33,-9, +16,-35, +51,-35, +2,29, +6,-10, +16,-16, +14,9, +-25,-13, +42,-26, +-26,-16, +14,-12, +14,-19, +-20,-7, +-2,16, +10,-28, +5,17, +64,3, +-14,33, +-31,6, +9,-19, +23,39, +4,-22, +-37,-20, +34,33, +5,2, +2,13, +31,-9, +-11,2, +14,-31, +-18,-30, +-38,25, +21,-4, +8,-11, +12,-5, +10,0, +26,-8, +-35,10, +11,-2, +19,-27, +2,25, +1,-39, +-1,-45, +32,13, +33,2, +23,24, +20,18, +27,10, +35,4, +-16,-3, +-17,9, +1,24, +-7,-8, +-20,-12, +-10,9, +20,-16, +19,-2, +5,5, +0,-1, +29,-8, +15,34, +10,-25, +0,-17, +7,-10, +-12,6, +0,13, +22,-3, +-5,-12, +-4,-2, +-4,6, +5,-13, +20,7, +21,2, +-2,11, +4,21, +-18,3, +-7,9, +12,8, +5,-5, +-4,2, +-12,12, +17,18, +-15,-2, +6,-13, +-13,-15, +-17,6, +4,-7, +-4,-2, +11,25, +6,9, +-3,-8, +-2,0, +3,7, +1,-6, +-4,-15, +11,3, +-2,-3, +1,8, +-11,10, +7,10, +-7,2, +9,-2, +-11,-8, +-5,10, +9,-10, +5,-10, +-3,-9, +10,-3, +8,2, +-6,-3, +8,0, +-2,-2, +-2,8, +0,4, +7,4, +-8,-4, +-1,7, +7,-1, +-6,2, +4,7, +2,4, +-7,1, +3,2, +2,-7, +-6,1, +0,2, +4,1, +-7,-3, +3,-3, +5,1, +-4,-2, +3,1, +4,0, +-6,0, +3,0, +3,0, +-6,0, +3,0, +3,0, +-6,0, +4,0, +3,-1, +-4,2, +5,-1, +3,3, +-7,3, +4,-1, +0,-2, +-6,-1, +2,7, +3,-2, +-7,-1, +2,-4, +4,-7, +-6,-2, +7,1, +-1,-7, +-8,4, +7,-4, +0,-4, +-2,-8, +-2,2, +8,0, +-6,3, +8,-2, +10,3, +-3,9, +5,10, +9,10, +-5,-10, +-11,8, +9,2, +-7,-2, +7,-10, +-11,-10, +1,-8, +-2,3, +11,-3, +-4,15, +1,6, +3,-7, +-2,0, +-3,8, +6,-9, +11,-25, +-4,2, +4,7, +-17,-6, +-13,15, +6,13, +-15,2, +17,-18, +-12,-12, +-4,-2, +5,5, +12,-8, +-7,-9, +-18,-3, +4,-21, +-2,-11, +21,-2, +20,-7, +5,13, +-4,-6, +-4,2, +-5,12, +22,3, +0,-13, +-12,-6, +7,10, +0,17, +10,25, +15,-34, +29,8, +0,1, +5,-5, +19,2, +20,16, +-10,-9, +-20,12, +-7,8, +1,-24, +-17,-9, +-16,3, +35,-4, +27,-10, +20,-18, +23,-24, +33,-2, +32,-13, +-1,45, +1,39, +2,-25, +19,27, +11,2, +-35,-10, +26,8, +10,0, +12,5, +8,11, +21,4, +-38,-25, +-18,30, +14,31, +-11,-2, +31,9, +2,-13, +5,-2, +34,-33, +-37,20, +4,22, +23,-39, +9,19, +-31,-6, +-14,-33, +64,-3, +5,-17, +10,28, +-2,-16, +-20,7, +14,19, +14,12, +-26,16, +42,26, +-25,13, +14,-9, +16,16, +6,10, +2,-29, +51,35, +16,35, +33,9, +-25,-1, +-11,16, +7,-5, +39,-50, +11,-30, +-22,-8, +-3,18, +21,1, +-11,-38, +47,-21, +1,10, +22,-32, +-16,-41, +-1,48, +-24,20, +53,84, +-52,0, +22,7, +19,12, +-5,-53, +-16,29, +-44,-18, +-26,-10, +0,5, +1,31, +-19,-5, +-41,26, +-19,4, +-25,19, +-30,-53, +29,-1, +82,-4, +-48,1, +4,-25, +2,22, +19,21, +-69,-39, +-29,-22, +-24,12, +16,-43, +64,52, +18,8, +-16,-10, +5,-14, +40,-4, +49,-1, +49,47, +50,25, +86,-25, +-4,-27, +14,33, +16,17, +19,31, +8,-32, +68,-66, +15,26, +35,-5, +0,-14, +-16,-60, +34,-19, +15,27, +-53,-8, +66,-90, +66,-98, +33,-12, +-42,23, +-36,-20, +12,-65, +-3,95, +-3,-14, +11,-20, +-15,-7, +16,10, +0,-37, +-22,48, +40,13, +1,47, +74,8, +15,-47, +-27,61, +12,-32, +-55,-59, +-15,102, +-65,-14, +25,-46, +4,46, +71,31, +-47,-8, +-11,-29, +-12,48, +-29,-60, +24,-40, +10,25, +9,-44, +-8,10, +-31,-15, +-76,-1, +-50,-92, +-69,-46, +-20,23, +-38,23, +49,-87, +-39,54, +33,-11, +20,-6, +-49,6, +18,73, +-5,45, +39,-26, +-43,-46, +71,-21, +31,-1, +-17,-43, +-38,39, +-11,-84, +29,-12, +53,-1, +-35,0, +4,44, +-49,-24, +-23,62, +60,5, +-94,-7, +-77,-7, +-52,9, +-48,78, +-20,-30, +40,24, +-32,78, +-59,16, +76,79, +-62,-44, +-15,8, +-33,-75, +8,-11, +-80,-5, +68,-31, +-68,24, +-65,79, +-35,-18, +36,-1, +90,59, +0,65, +-52,-64, +51,-27, +-21,-79, +-20,29, +34,42, +67,44, +74,30, +21,-37, +32,-69, +-46,123, +68,-6, +69,-30, +-68,-69, +-87,-20, +97,104, +-70,-43, +19,-123, +-7,37, +-44,-67, +11,-54, +33,95, +126,46, +10,180, +-37,30, +22,-61, +62,12, +129,-46, +-79,-4, +-36,66, +-1,18, +-12,58, +125,-43, +-23,-37, +-9,44, +31,73, +-21,-109, +67,-101, +-24,-16, +-50,23, +71,-30, +13,-13, +28,33, +10,16, +-27,-6, +65,51, +-89,84, +-54,-66, +53,-1, +-46,-60, +-30,-80, +59,54, +62,-104, +-9,-65, +-98,-26, +33,-27, +6,78, +62,13, +59,38, +-13,-93, +0,76, +-88,-45, +46,-54, +8,28, +63,-10, +-58,48, +-1,17, +-82,0, +-19,90, +4,-88, +73,30, +54,-122, +141,97, +26,-70, +-30,128, +36,8, +-55,-62, +64,43, +26,-25, +-59,-64, +-177,-50, +30,8, +77,51, +28,89, +11,-81, +-63,-112, +23,-31, +81,-96, +12,-69, +34,-88, +43,57, +116,-8, +39,39, +6,-60, +-30,-6, +-20,-14, +-14,-2, +43,66, +108,-120, +33,64, +-62,35, +13,-131, +-1,43, +60,-11, +63,185, +69,27, +-17,-31, +11,50, +-27,-23, +25,20, +102,-46, +-82,73, +-30,3, +-59,-59, +4,83, +64,27, +-26,70, +164,-40, +46,37, +104,-3, +-4,-57, +-17,77, +-71,94, +-44,-77, +-222,26, +-32,0, +-124,-54, +-11,-60, +4,94, +-88,-58, +52,-21, +-24,168, +-190,238, +104,19, +49,-15, +91,-105, +112,-185, +29,113, +-7,-34, +-27,-91, +-77,-5, +111,7, +37,-12, +-96,-5, +-94,34, +-19,129, +-54,21, +188,-7, +4,-27, +-80,53, +-62,19, +52,135, +30,-21, +-118,9, +-2,18, +80,-9, +20,0, +-62,80, +-4,-134, +-90,-64, +25,-122, +49,115, +-45,-84, +60,82, +-113,-103, +45,-36, +25,-88, +56,-74, +35,0, +-3,-112, +-63,26, +24,-125, +24,7, +35,-29, +-17,10, +-37,-35, +111,98, +42,26, +-75,-112, +-131,3, +-156,-29, +53,-23, +-119,43, +-50,57, +-3,-29, +129,50, +138,117, +55,-54, +119,12, +63,-58, +22,-125, +-131,24, +-84,24, +-100,-166, +20,76, +-108,149, +132,-50, +6,-11, +-109,-9, +0,69, +-82,-3, +-116,-40, +-52,50, +146,-72, +3,134, +-19,7, +-1,-40, +-185,-106, +34,-42, +-51,-15, +66,-19, +-8,77, +26,51, +-48,92, +-9,-28, +-95,-173, +60,109, +-3,-29, +-31,11, +-57,-18, +-47,205, +-175,-181, +93,97, +6,122, +15,-2, +140,-14, +-19,-91, +63,-62, +58,-5, +130,44, +58,-126, +181,81, +46,-148, +-16,-72, +22,-185, +299,106, +-94,-87, +119,-152, +6,-105, +2,-61, +-10,-152, +96,46, +24,-97, +97,-47, +-42,-53, +-170,-58, +46,41, +-34,9, +30,186, +-194,4, +150,22, +-93,14, +-5,-10, +77,-27, +115,157, +-126,-47, +-102,-4, +20,10, +-81,-14, +62,-108, +75,199, +34,-12, +134,102, +-86,50, +-63,-106, +-38,-64, +97,5, +-95,158, +59,39, +-6,83, +-157,53, +181,-18, +-21,-24, +-215,-79, +36,175, +81,-15, +3,146, +12,134, +95,10, +61,-147, +61,-45, +-41,-134, +-59,-135, +-80,-129, +13,-51, +-36,145, +-72,18, +47,88, +-5,36, +59,253, +67,74, +3,-114, +-97,-33, +-29,-37, +87,45, +-71,-10, +102,-95, +25,36, +119,34, +-24,18, +139,-42, +18,-59, +87,-82, +163,62, +-62,-39, +122,125, +-120,-99, +66,-8, +-42,28, +262,-15, +9,130, +17,12, +-55,-23, +8,-77, +1,4, +2,100, +-61,46, +-22,-137, +-185,85, +35,188, +8,-163, +1,-59, +-49,-86, +-84,111, +-164,114, +79,103, +44,-52, +-118,-76, +103,-25, +138,154, +-112,-22, +77,-111, +64,-45, +203,-151, +85,-200, +-141,121, +-237,-2, +-269,146, +46,18, +38,-89, +-49,160, +-16,32, +160,-39, +-64,346, +25,64, +34,184, +-63,82, +-140,30, +51,-62, +67,-3, +-75,-254, +-18,-52, +74,-120, +-246,25, +30,-64, +40,52, +-50,180, +-18,-74, +-29,18, +73,-98, +-85,-21, +51,109, +-28,-75, +-84,-73, +-87,-83, +-279,-78, +229,-80, +17,104, +-40,0, +42,-39, +-34,-104, +104,-134, +-119,33, +30,86, +99,-27, +-50,30, +86,-61, +-102,-175, +-5,-132, +55,68, +221,-137, +23,-89, +148,28, +166,-22, +50,79, +-21,-57, +-169,-194, +-12,51, +133,205, +83,163, +-32,-124, +79,18, +-18,-63, +-38,72, +1,-4, +-234,-87, +210,-132, +-106,-205, +189,-39, +-59,-65, +45,89, +-153,58, +11,117, +19,-38, +-168,36, +98,-160, +88,66, +-71,11, +100,125, +-56,-63, +92,-76, +-143,-74, +-18,-102, +-74,66, +112,45, +177,122, +-3,-166, +142,-119, +-16,128, +106,-16, +155,-20, +-85,92, +-8,79, +-130,36, +-37,-119, +30,87, +-80,-35, +-2,-163, +93,55, +-45,-36, +-21,31, +279,40, +119,-190, +-80,94, +-109,46, +87,-165, +40,40, +-15,-183, +-176,35, +-8,206, +-21,-56, +-7,-69, +156,-234, +-18,0, +-83,69, +-140,-49, +-425,-168, +74,-218, +54,148, +-35,-6, +197,-45, +65,180, +77,-149, +-32,43, +-166,64, +216,145, +194,-116, +-261,-121, +17,1, +-20,64, +102,-159, +0,-89, +-149,-173, +-113,-72, +50,78, +6,-41, +223,19, +18,-5, +-72,38, +-167,-130, +36,-199, +-7,136, +-119,234, +-98,-77, +78,127, +29,-42, +22,113, +96,-16, +165,174, +-165,-76, +88,64, +-222,-18, +-135,90, +20,-7, +-71,-42, +-43,135, +-124,147, +64,203, +29,95, +-93,67, +1,-118, +-137,134, +75,152, +-98,-155, +-26,43, +181,-95, +-11,-63, +122,182, +-55,57, +92,-206, +30,5, +98,-61, +93,41, +-130,-126, +-186,112, +-26,-17, +81,4, +-128,0, +93,-105, +-19,113, +114,-86, +-118,153, +90,136, +270,184, +81,135, +-157,149, +215,-4, +-59,-32, +-19,-37, +176,1, +58,-29, +-34,102, +-8,85, +136,-66, +-229,69, +-20,-251, +148,79, +-140,92, +-26,159, +-26,-26, +85,176, +34,-52, +-139,-77, +134,-25, +-73,-254, +-276,70, +115,1, +-36,-40, +-17,24, +40,-13, +129,-2, +-165,-8, +-4,14, +-59,-11, +206,54, +-88,182, +-13,-80, +357,-353, +287,12, +-16,-28, +-44,24, +53,-41, +145,-66, +161,43, +-142,-15, +70,-253, +120,-34, +116,-120, +-25,-64, +-180,-43, +-11,18, +43,-150, +93,-105, +-91,-302, +-134,-147, +-43,-123, +48,-193, +37,-19, +59,112, +-120,-131, +-6,-193, +-79,-53, +146,49, +16,175, +79,145, +39,97, +-139,-222, +34,216, +147,-20, +-151,-165, +125,-201, +120,158, +26,96, +-169,54, +84,181, +-130,89, +-70,-58, +-2,67, +41,87, +-47,105, +146,206, +-100,-85, +171,-120, +-30,145, +-226,-145, +-7,131, +-411,-130, +-9,104, +126,14, +106,19, +2,-215, +81,38, +154,-139, +12,-20, +-73,27, +6,71, +182,-53, +186,-149, +63,-73, +-106,105, +11,18, +-3,26, +-261,-308, +-45,-56, +28,-80, +13,-73, +-76,-40, +1,34, +-20,-166, +-152,167, +-80,-154, +-63,7, +-100,42, +-4,-54, +-20,56, +50,69, +-166,-257, +234,-129, +95,-58, +-61,215, +117,-37, +-25,-200, +24,131, +-104,-25, +33,50, +251,-158, +-150,-86, +90,61, +-16,-212, +-253,65, +-73,155, +47,57, +40,46, +-99,-157, +5,-16, +-66,-160, +30,21, +32,-12, +-104,118, +46,-188, +-112,-91, +-72,132, +-297,-110, +-130,-169, +305,-239, +-21,-177, +128,-110, +217,-264, +-101,-156, +-32,18, +222,185, +12,5, +-13,3, +23,204, +-127,68, +8,-169, +-21,-165, +-14,24, +-36,-91, +142,-154, +-64,-196, +125,-15, +-324,-97, +-118,48, +185,47, +37,-45, +-74,-59, +-12,-124, +-49,128, +-67,62, +100,-117, +-138,-176, +82,-116, +218,-161, +52,134, +149,103, +95,80, +7,-95, +22,-103, +1,130, +125,-38, +194,110, +61,-182, +-305,203, +-49,88, +-2,82, +-89,181, +31,-139, +269,-66, +188,-81, +-162,26, +19,35, +109,-50, +-159,34, +-114,-30, +-107,-29, +104,-120, +44,175, +207,-72, +177,188, +63,-186, +-146,75, +56,93, +-68,114, +50,-188, +-360,-58, +-171,-7, +27,-186, +-105,-103, +45,-23, +-66,-2, +-2,-129, +124,216, +278,-209, +-126,14, +150,125, +22,-25, +59,16, +77,-82, +204,-3, +175,19, +114,85, +-100,-21, +-52,-48, +-234,222, +298,-66, +18,78, +-264,68, +-53,-52, +-149,-203, +29,-55, +-55,-124, +115,-55, +-120,-26, +44,-57, +-148,-72, +0,0, +-49,-118, +4,227, +-61,90, +-49,162, +124,28, +123,191, +354,-58, +-20,-60, +32,-203, +115,17, +-157,-152, +-63,124, +36,138, +-125,111, +-162,20, +266,-91, +234,143, +15,77, +37,15, +-24,132, +-10,-120, +129,-53, +-79,126, +143,14, +41,-88, +-139,9, +128,-2, +-88,-77, +104,-59, +228,-281, +-75,-43, +-92,-184, +227,-17, +-160,149, +-167,181, +62,-96, +-126,33, +106,-33, +157,-21, +-127,-98, +-22,-15, +-89,-189, +98,122, +265,218, +17,-6, +55,-181, +-6,0, +-83,16, +-86,110, +-155,185, +-69,-147, +12,-142, +-67,-45, +-57,-51, +-50,-156, +265,72, +-77,110, +39,-173, +-60,-98, +78,103, +-148,75, +219,240, +272,109, +-16,-2, +-41,110, +-144,-24, +38,44, +-4,109, +-199,152, +83,188, +110,142, +-72,198, +-72,34, +-36,80, +-96,230, +-92,-4, +63,74, +227,20, +4,-27, +145,-192, +-42,-18, +-130,-93, +263,-83, +-79,91, +-130,-74, +-246,-214, +-60,35, +-57,248, +-129,151, +-131,-64, +153,-44, +129,182, +-90,14, +122,75, +232,48, +-121,43, +-88,42, +-178,280, +74,-164, +82,34, +-46,110, +-140,-118, +24,210, +61,-17, +-51,-95, +-197,188, +-41,31, +-26,23, +31,-32, +-194,-89, +-92,162, +-80,-53, +67,-111, +-110,74, +234,-62, +-60,38, +98,92, +-14,-58, +-26,23, +171,-42, +-10,34, +109,140, +-155,131, +95,163, +-322,66, +-142,-42, +168,30, +84,129, +67,-108, +331,154, +-59,170, +-79,69, +5,-41, +-131,-82, +56,258, +120,83, +-164,-3, +-171,-229, +-96,54, +186,21, +-25,4, +251,265, +90,-240, +-135,138, +-142,-256, +143,20, +62,35, +42,165, +-52,-43, +0,7, +-57,8, +-82,236, +55,-272, +-69,188, +-140,118, +-28,114, +-176,-170, +-200,-58, +173,95, +-10,-81, +22,35, +-85,-147, +-54,-82, +167,33, +-189,-82, +150,-253, +-153,85, +36,38, +122,160, +30,-26, +103,84, +106,-21, +69,-8, +86,-185, +59,-178, +-17,-134, +-110,-73, +9,-53, +-245,19, +-70,-67, +307,-90, +32,-51, +-68,48, +-8,-147, +-73,-32, +-8,275, +55,88, +-85,311, +-72,113, +-236,-211, +-126,82, +19,74, +-141,-133, +-196,138, +41,55, +307,74, +-87,41, +-41,148, +-150,118, +218,38, +14,103, +-86,204, +-14,141, +110,209, +242,73, +60,71, +-217,-29, +-102,97, +18,24, +-97,-30, +-61,-114, +52,-18, +-1,32, +376,-15, +178,-91, +75,255, +-152,123, +-90,24, +13,48, +-6,112, +-110,55, +113,-26, +229,127, +253,-108, +-179,42, +99,25, +-80,21, +-25,-105, +122,-30, +-54,9, +117,3, +-144,-66, +-44,-199, +-48,-53, +207,-130, +117,-102, +-144,-116, +118,254, +-78,160, +-103,50, +-45,-17, +77,103, +87,-50, +139,-104, +130,-106, +-177,53, +126,60, +20,-45, +-109,8, +98,-37, +19,10, +-145,-45, +64,204, +-75,-69, +-32,-255, +161,-11, +53,-25, +-77,71, +160,-125, +3,-6, +152,219, +189,98, +-77,67, +72,161, +32,72, +-158,-10, +32,-123, +25,34, +64,-243, +-131,134, +-62,3, +52,-133, +53,66, +-103,-237, +112,4, +126,6, +17,5, +-60,-113, +110,89, +-108,71, +72,161, +175,7, +-132,212, +55,-175, +-196,101, +101,-47, +84,118, +-111,-47, +-47,116, +180,31, +120,-5, +46,-165, +144,1, +-111,48, +-77,-53, +-144,-34, +99,13, +-131,128, +33,8, +13,33, +40,55, +129,9, +115,-124, +-31,-6, +105,80, +-7,-74, +-102,-34, +-17,22, +173,-59, +-34,12, +-22,-246, +-138,87, +-21,-185, +-127,-157, +56,-58, +-110,86, +12,99, +175,232, +196,-70, +31,86, +-51,118, +-104,3, +10,-67, +-97,-23, +65,28, +65,-81, +210,29, +-135,221, +-233,-119, +11,171, +45,53, +205,-56, +104,53, +-32,-81, +-51,42, +-110,130, +11,-60, +140,-123, +-124,-201, +-129,-82, +65,-12, +51,86, +-14,25, +103,148, +29,-113, +-176,-101, +-19,50, +72,0, +173,-110, +-54,-142, +-168,195, +-41,-109, +-147,-28, +-174,2, +12,23, +-187,26, +12,-193, +-174,-96, +52,18, +-123,206, +-7,-118, +-21,-68, +-29,123, +-249,143, +-6,-33, +151,54, +-47,-88, +149,-97, +75,63, +44,99, +31,218, +-130,-2, +4,185, +-15,-227, +85,34, +-76,103, +-42,-31, +-251,-55, +27,-13, +-285,101, +60,16, +33,-103, +-178,-110, +129,-100, +-78,3, +54,6, +204,-138, +-128,-129, +-101,146, +-204,-128, +141,-86, +29,-35, +-70,-75, +23,-27, +32,-61, +-59,55, +217,180, +-111,-40, +38,-217, +5,-144, +43,89, +2,91, +-3,4, +156,5, +105,66, +216,-25, +84,124, +72,105, +43,-151, +-109,-28, +172,203, +269,68, +20,222, +8,-153, +29,56, +23,-120, +47,28, +146,167, +-204,-36, +7,73, +-249,92, +83,87, +-5,39, +-141,-7, +113,36, +-259,204, +225,-5, +-151,69, +73,119, +-14,-58, +78,-24, +60,-21, +-9,49, +-12,41, +-33,-43, +131,-64, +184,93, +205,-132, +-46,-121, +19,-14, +-114,61, +176,118, +-43,-57, +-143,35, +-38,-88, +84,-76, +-38,175, +125,80, +-24,40, +-27,-107, +17,51, +-108,-10, +102,-79, +-73,119, +-46,-15, +-92,148, +86,24, +-38,164, +-44,35, +66,-39, +-80,-46, +-22,143, +-41,-139, +51,6, +221,-64, +-164,-105, +33,-174, +-34,95, +-64,36, +-74,115, +-45,94, +-97,161, +-73,-140, +17,-89, +-59,88, +111,92, +-13,-56, +-144,121, +14,82, +206,-137, +0,-47, +-69,137, +66,16, +-68,-92, +83,-21, +198,114, +45,-159, +54,105, +-12,27, +54,-10, +-128,-21, +-110,-1, +13,-162, +8,-73, +17,-70, +34,6, +-24,-69, +-59,-17, +-42,4, +-53,40, +-124,43, +34,-69, +33,-76, +84,-2, +50,105, +30,-139, +152,-89, +-50,-110, +52,33, +32,-22, +107,90, +67,0, +-25,96, +99,118, +-65,-83, +-33,92, +-161,35, +-46,98, +-1,31, +89,55, +-125,94, +-62,-48, +62,-44, +24,-99, +-3,-29, +-4,-42, +-49,-40, +-63,34, +41,29, +-175,-1, +-90,0, +-13,-78, +-25,-125, +-37,-2, +121,108, +-58,-98, +25,150, +-37,166, +66,1, +-115,53, +13,-25, +138,-48, +-54,40, +-118,137, +80,32, +84,-125, +-7,-2, +32,43, +122,44, +-112,-77, +-89,-23, +83,-71, +180,-79, +-21,-43, +147,-61, +1,1, +-105,-83, +-132,58, +19,-33, +-120,192, +36,-37, +-20,-146, +54,97, +-73,-46, +50,-45, +92,54, +122,-25, +-28,-11, +154,-89, +-36,22, +7,-57, +-10,78, +-15,-105, +5,-16, +-72,87, +163,-52, +69,88, +-26,28, +-61,-47, +-31,-107, +50,20, +-10,12, +127,78, +-29,-143, +-149,76, +-2,98, +-35,182, +17,76, +-41,5, +1,-44, +62,26, +7,27, +-94,47, +46,60, +41,-95, +28,124, +89,-136, +43,130, +107,-193, +-21,57, +-5,-13, +103,-79, +76,57, +-16,-259, +87,53, +24,3, +51,52, +-10,34, +-139,26, +124,-43, +-61,83, +201,162, +94,94, +-46,5, +-51,-54, +36,83, +83,104, +30,61, +-14,173, +49,43, +-12,31, +55,-9, +77,22, +-100,47, +-180,-74, +18,80, +81,-27, +56,99, +-20,-35, +-76,-8, +8,7, +-45,2, +-104,30, +19,9, +-26,-255, +5,75, +-119,57, +-25,12, +43,66, +-77,-81, +-108,28, +-16,-34, +-17,-33, +43,0, +58,-221, +-106,42, +10,-146, +100,-16, +-71,53, +-9,23, +-41,-87, +159,35, +2,-65, +152,31, +15,129, +-93,-27, +5,71, +-20,55, +8,-26, +78,-95, +93,-85, +-82,47, +-11,-61, +59,-8, +72,-61, +-115,17, +-58,-138, +-46,30, +56,-103, +10,-57, +-91,-68, +56,-90, +-10,-38, +10,-45, +-115,50, +18,135, +27,-94, +-70,-69, +-29,34, +16,24, +100,7, +-17,48, +17,9, +-39,-72, +-116,-30, +-111,17, +42,48, +10,-52, +21,-81, +36,34, +-83,54, +33,57, +67,116, +-37,-68, +97,-111, +2,-31, +57,35, +-21,120, +-31,-35, +23,4, +-52,-42, +1,-16, +81,-54, +0,25, +41,108, +29,94, +127,-16, +14,-9, +-35,-39, +-85,10, +-38,-86, +-82,-3, +36,-72, +-133,32, +38,53, +18,15, +-65,-70, +6,20, +27,19, +-17,21, +-39,32, +-12,72, +37,22, +5,14, +25,-20, +32,8, +40,-49, +-46,31, +-8,-125, +24,9, +-20,32, +-41,36, +-50,60, +61,78, +12,-19, +27,-48, +-15,41, +80,13, +-79,-4, +50,-109, +-18,77, +94,-3, +5,26, +86,37, +1,-58, +-26,44, +-16,-2, +35,33, +-67,56, +3,-5, +-89,-47, +17,76, +11,-32, +-37,-85, +32,35, +-107,66, +13,-92, +-20,26, +28,-3, +64,-44, +41,80, +42,14, +68,34, +30,108, +-57,-41, +-20,10, +82,55, +-93,11, +-68,0, +3,22, +8,-59, +56,-3, +-40,17, +-1,-15, +-4,2, +-2,18, +3,-19, +29,20, +-23,-15, +-79,76, +17,44, +19,12, +2,-4, +6,-60, +94,12, +46,-18, +11,10, +-83,5, +-18,75, +-46,25, +-48,-83, +-49,22, +15,-33, +8,50, +-30,-5, +-15,0, +-12,13, +30,-49, +-18,36, +12,8, +-15,129, +41,23, +-5,-36, +36,-6, +36,13, +-14,-41, +65,-39, +59,-1, +7,111, +-45,58, +39,71, +-12,-28, +-49,-15, +-3,-8, +22,-22, +-5,-27, +36,-51, +-11,-9, +40,90, +60,53, +60,-37, +39,-8, +59,25, +4,4, +21,44, +72,-100, +7,32, +-11,68, +85,22, +-29,-70, +-2,-25, +34,-13, +-22,-34, +-17,-49, +22,-63, +58,16, +89,-1, +20,-15, +21,8, +-35,-21, +-20,-30, +23,47, +-49,45, +-14,-1, +12,-52, +-20,-40, +-26,13, +-22,-30, +-67,19, +-35,31, +-14,13, +8,30, +-2,23, +32,22, +-8,18, +62,4, +-19,4, +-41,-46, +-30,54, +9,-43, +-24,27, +-22,-9, +-20,-45, +17,58, +-10,-2, +2,-31, +-31,-37, +-12,-24, +91,-20, +-29,-18, +10,0, +-10,0, +54,-27, +-34,-3, +9,8, +28,-19, +23,39, +-32,19, +13,-28, +-68,-36, +52,37, +-23,26, +37,34, +15,-1, +-27,17, +-6,-67, +-33,-16, +41,23, +31,-4, +12,-2, +-36,-17, +26,-22, +50,20, +-6,24, +19,43, +-1,14, +11,16, +1,-17, +5,-43, +28,-35, +39,41, +12,-41, +10,35, +4,17, +-19,-2, +13,1, +4,2, +2,24, +10,-12, +-14,37, +-2,-29, +-5,2, +-1,-17, +23,-28, +-31,-14, +-2,25, +42,-31, +-14,-25, +8,-3, +14,5, +-16,-2, +33,-9, +-5,-18, +-14,14, +22,12, +-6,-16, +33,-42, +3,18, +1,11, +8,14, +20,10, +1,-2, +11,21, +-11,2, +11,-41, +45,0, +1,0, +-33,-39, +-2,-33, +6,30, +-10,-13, +-8,11, +-9,0, +-14,-10, +-15,30, +16,13, +-5,6, +12,-6, +18,-10, +14,-9, +4,-7, +17,-2, +25,5, +9,6, +24,-5, +12,-20, +-6,10, +13,1, +-2,-32, +4,19, +17,26, +12,2, +17,11, +5,-10, +-10,3, +-12,-6, +7,11, +8,-3, +-13,18, +-7,-14, +2,-9, +-20,8, +-3,-6, +9,-17, +9,-3, +4,-2, +-4,-9, +-10,6, +-2,12, +17,-1, +3,19, +-5,0, +-8,-23, +0,14, +-6,3, +3,-7, +-4,14, +1,-9, +5,-14, +10,8, +-2,-2, +-5,-3, +-10,4, +-2,3, +-11,3, +0,7, +2,-8, +-3,1, +-2,3, +3,-1, +1,3, +-1,1, +-1,1, +-1,-2, +4,1, +2,2, +0,3, +2,8, +-2,-2, +2,-7, +5,5, +-1,-1, +0,-6, +-2,4, +0,1, +-3,-4, +1,6, +1,4, +1,-5, +0,5, +1,0, +0,-5, +0,5, +0,0, +0,-5, +0,5, +1,0, +0,-5, +1,5, +1,-4, +1,-6, +-3,4, +0,-1, +-2,-4, +0,6, +-1,1, +5,-5, +2,7, +-2,2, +2,-8, +0,-3, +2,-2, +4,-1, +-1,2, +-1,-1, +-1,-1, +1,-3, +3,1, +-2,-3, +-3,-1, +2,8, +0,-7, +-11,-3, +-2,-3, +-10,-4, +-5,3, +-2,2, +10,-8, +5,14, +1,9, +-4,-14, +3,7, +-6,-3, +0,-14, +-8,23, +-5,0, +3,-19, +17,1, +-2,-12, +-10,-6, +-4,9, +4,2, +9,3, +9,17, +-3,6, +-20,-8, +2,9, +-7,14, +-13,-18, +8,3, +7,-11, +-12,6, +-10,-3, +5,10, +17,-11, +12,-2, +17,-26, +4,-19, +-2,32, +13,-1, +-6,-10, +12,20, +24,5, +9,-6, +25,-5, +17,2, +4,7, +14,9, +18,10, +12,6, +-5,-6, +16,-13, +-15,-30, +-14,10, +-9,0, +-8,-11, +-10,13, +6,-30, +-2,33, +-33,39, +1,0, +45,0, +11,41, +-11,-2, +11,-21, +1,2, +20,-10, +8,-14, +1,-11, +3,-18, +33,42, +-6,16, +22,-12, +-14,-14, +-5,18, +33,9, +-16,2, +14,-5, +8,3, +-14,25, +42,31, +-2,-25, +-31,14, +23,28, +-1,17, +-5,-2, +-2,29, +-14,-37, +10,12, +2,-24, +4,-2, +13,-1, +-19,2, +4,-17, +10,-35, +12,41, +39,-41, +28,35, +5,43, +1,17, +11,-16, +-1,-14, +19,-43, +-6,-24, +50,-20, +26,22, +-36,17, +12,2, +31,4, +41,-23, +-33,16, +-6,67, +-27,-17, +15,1, +37,-34, +-23,-26, +52,-37, +-68,36, +13,28, +-32,-19, +23,-39, +28,19, +9,-8, +-34,3, +54,27, +-10,0, +10,0, +-29,18, +91,20, +-12,24, +-31,37, +2,31, +-10,2, +17,-58, +-20,45, +-22,9, +-24,-27, +9,43, +-30,-54, +-41,46, +-19,-4, +62,-4, +-8,-18, +32,-22, +-2,-23, +8,-30, +-14,-13, +-35,-31, +-67,-19, +-22,30, +-26,-13, +-20,40, +12,52, +-14,1, +-49,-45, +23,-47, +-20,30, +-35,21, +21,-8, +20,15, +89,1, +58,-16, +22,63, +-17,49, +-22,34, +34,13, +-2,25, +-29,70, +85,-22, +-11,-68, +7,-32, +72,100, +21,-44, +4,-4, +59,-25, +39,8, +60,37, +60,-53, +40,-90, +-11,9, +36,51, +-5,27, +22,22, +-3,8, +-49,15, +-12,28, +39,-71, +-45,-58, +7,-111, +59,1, +65,39, +-14,41, +36,-13, +36,6, +-5,36, +41,-23, +-15,-129, +12,-8, +-18,-36, +30,49, +-12,-13, +-15,0, +-30,5, +8,-50, +15,33, +-49,-22, +-48,83, +-46,-25, +-18,-75, +-83,-5, +11,-10, +46,18, +94,-12, +6,60, +2,4, +19,-12, +17,-44, +-79,-76, +-23,15, +29,-20, +3,19, +-2,-18, +-4,-2, +-1,15, +-40,-17, +56,3, +8,59, +3,-22, +-68,0, +-93,-11, +82,-55, +-20,-10, +-57,41, +30,-108, +68,-34, +42,-14, +41,-80, +64,44, +28,3, +-20,-26, +13,92, +-107,-66, +32,-35, +-37,85, +11,32, +17,-76, +-89,47, +3,5, +-67,-56, +35,-33, +-16,2, +-26,-44, +1,58, +86,-37, +5,-26, +94,3, +-18,-77, +50,109, +-79,4, +80,-13, +-15,-41, +27,48, +12,19, +61,-78, +-50,-60, +-41,-36, +-20,-32, +24,-9, +-8,125, +-46,-31, +40,49, +32,-8, +25,20, +5,-14, +37,-22, +-12,-72, +-39,-32, +-17,-21, +27,-19, +6,-20, +-65,70, +18,-15, +38,-53, +-133,-32, +36,72, +-82,3, +-38,86, +-85,-10, +-35,39, +14,9, +127,16, +29,-94, +41,-108, +0,-25, +81,54, +1,16, +-52,42, +23,-4, +-31,35, +-21,-120, +57,-35, +2,31, +97,111, +-37,68, +67,-116, +33,-57, +-83,-54, +36,-34, +21,81, +10,52, +42,-48, +-111,-17, +-116,30, +-39,72, +17,-9, +-17,-48, +100,-7, +16,-24, +-29,-34, +-70,69, +27,94, +18,-135, +-115,-50, +10,45, +-10,38, +56,90, +-91,68, +10,57, +56,103, +-46,-30, +-58,138, +-115,-17, +72,61, +59,8, +-11,61, +-82,-47, +93,85, +78,95, +8,26, +-20,-55, +5,-71, +-93,27, +15,-129, +152,-31, +2,65, +159,-35, +-41,87, +-9,-23, +-71,-53, +100,16, +10,146, +-106,-42, +58,221, +43,0, +-17,33, +-16,34, +-108,-28, +-77,81, +43,-66, +-25,-12, +-119,-57, +5,-75, +-26,255, +19,-9, +-104,-30, +-45,-2, +8,-7, +-76,8, +-20,35, +56,-99, +81,27, +18,-80, +-180,74, +-100,-47, +77,-22, +55,9, +-12,-31, +49,-43, +-14,-173, +30,-61, +83,-104, +36,-83, +-51,54, +-46,-5, +94,-94, +201,-162, +-61,-83, +124,43, +-139,-26, +-10,-34, +51,-52, +24,-3, +87,-53, +-16,259, +76,-57, +103,79, +-5,13, +-21,-57, +107,193, +43,-130, +89,136, +28,-124, +41,95, +46,-60, +-94,-47, +7,-27, +62,-26, +1,44, +-41,-5, +17,-76, +-35,-182, +-2,-98, +-149,-76, +-29,143, +127,-78, +-10,-12, +50,-20, +-31,107, +-61,47, +-26,-28, +69,-88, +163,52, +-72,-87, +5,16, +-15,105, +-10,-78, +7,57, +-36,-22, +154,89, +-28,11, +122,25, +92,-54, +50,45, +-73,46, +54,-97, +-20,146, +36,37, +-120,-192, +19,33, +-132,-58, +-105,83, +1,-1, +147,61, +-21,43, +180,79, +83,71, +-89,23, +-112,77, +122,-44, +32,-43, +-7,2, +84,125, +80,-32, +-118,-137, +-54,-40, +138,48, +13,25, +-115,-53, +66,-1, +-37,-166, +25,-150, +-58,98, +121,-108, +-37,2, +-25,125, +-13,78, +-90,0, +-175,1, +41,-29, +-63,-34, +-49,40, +-4,42, +-3,29, +24,99, +62,44, +-62,48, +-125,-94, +89,-55, +-1,-31, +-46,-98, +-161,-35, +-33,-92, +-65,83, +99,-118, +-25,-96, +67,0, +107,-90, +32,22, +52,-33, +-50,110, +152,89, +30,139, +50,-105, +84,2, +33,76, +34,69, +-124,-43, +-53,-40, +-42,-4, +-59,17, +-24,69, +34,-6, +17,70, +8,73, +13,162, +-110,1, +-128,21, +54,10, +-12,-27, +54,-105, +45,159, +198,-114, +83,21, +-68,92, +66,-16, +-69,-137, +0,47, +206,137, +14,-82, +-144,-121, +-13,56, +111,-92, +-59,-88, +17,89, +-73,140, +-97,-161, +-45,-94, +-74,-115, +-64,-36, +-34,-95, +33,174, +-164,105, +221,64, +51,-6, +-41,139, +-22,-143, +-80,46, +66,39, +-44,-35, +-38,-164, +86,-24, +-92,-148, +-46,15, +-73,-119, +102,79, +-108,10, +17,-51, +-27,107, +-24,-40, +125,-80, +-38,-175, +84,76, +-38,88, +-143,-35, +-43,57, +176,-118, +-114,-61, +19,14, +-46,121, +205,132, +184,-93, +131,64, +-33,43, +-12,-41, +-9,-49, +60,21, +78,24, +-14,58, +73,-119, +-151,-69, +225,5, +-259,-204, +113,-36, +-141,7, +-5,-39, +83,-87, +-249,-92, +7,-73, +-204,36, +146,-167, +47,-28, +23,120, +29,-56, +8,153, +20,-222, +269,-68, +172,-203, +-109,28, +43,151, +72,-105, +84,-124, +216,25, +105,-66, +156,-5, +-3,-4, +2,-91, +43,-89, +5,144, +38,217, +-111,40, +217,-180, +-59,-55, +32,61, +23,27, +-70,75, +29,35, +141,86, +-204,128, +-101,-146, +-128,129, +204,138, +54,-6, +-78,-3, +129,100, +-178,110, +33,103, +60,-16, +-285,-101, +27,13, +-251,55, +-42,31, +-76,-103, +85,-34, +-15,227, +4,-185, +-130,2, +31,-218, +44,-99, +75,-63, +149,97, +-47,88, +151,-54, +-6,33, +-249,-143, +-29,-123, +-21,68, +-7,118, +-123,-206, +52,-18, +-174,96, +12,193, +-187,-26, +12,-23, +-174,-2, +-147,28, +-41,109, +-168,-195, +-54,142, +173,110, +72,0, +-19,-50, +-176,101, +29,113, +103,-148, +-14,-25, +51,-86, +65,12, +-129,82, +-124,201, +140,123, +11,60, +-110,-130, +-51,-42, +-32,81, +104,-53, +205,56, +45,-53, +11,-171, +-233,119, +-135,-221, +210,-29, +65,81, +65,-28, +-97,23, +10,67, +-104,-3, +-51,-118, +31,-86, +196,70, +175,-232, +12,-99, +-110,-86, +56,58, +-127,157, +-21,185, +-138,-87, +-22,246, +-34,-12, +173,59, +-17,-22, +-102,34, +-7,74, +105,-80, +-31,6, +115,124, +129,-9, +40,-55, +13,-33, +33,-8, +-131,-128, +99,-13, +-144,34, +-77,53, +-111,-48, +144,-1, +46,165, +120,5, +180,-31, +-47,-116, +-111,47, +84,-118, +101,47, +-196,-101, +55,175, +-132,-212, +175,-7, +72,-161, +-108,-71, +110,-89, +-60,113, +17,-5, +126,-6, +112,-4, +-103,237, +53,-66, +52,133, +-62,-3, +-131,-134, +64,243, +25,-34, +32,123, +-158,10, +32,-72, +72,-161, +-77,-67, +189,-98, +152,-219, +3,6, +160,125, +-77,-71, +53,25, +161,11, +-32,255, +-75,69, +64,-204, +-145,45, +19,-10, +98,37, +-109,-8, +20,45, +126,-60, +-177,-53, +130,106, +139,104, +87,50, +77,-103, +-45,17, +-103,-50, +-78,-160, +118,-254, +-144,116, +117,102, +207,130, +-48,53, +-44,199, +-144,66, +117,-3, +-54,-9, +122,30, +-25,105, +-80,-21, +99,-25, +-179,-42, +253,108, +229,-127, +113,26, +-110,-55, +-6,-112, +13,-48, +-90,-24, +-152,-123, +75,-255, +178,91, +376,15, +-1,-32, +52,18, +-61,114, +-97,30, +18,-24, +-102,-97, +-217,29, +60,-71, +242,-73, +110,-209, +-14,-141, +-86,-204, +14,-103, +218,-38, +-150,-118, +-41,-148, +-87,-41, +307,-74, +41,-55, +-196,-138, +-141,133, +19,-74, +-126,-82, +-236,211, +-72,-113, +-85,-311, +55,-88, +-8,-275, +-73,32, +-8,147, +-68,-48, +32,51, +307,90, +-70,67, +-245,-19, +9,53, +-110,73, +-17,134, +59,178, +86,185, +69,8, +106,21, +103,-84, +30,26, +122,-160, +36,-38, +-153,-85, +150,253, +-189,82, +167,-33, +-54,82, +-85,147, +22,-35, +-10,81, +173,-95, +-200,58, +-176,170, +-28,-114, +-140,-118, +-69,-188, +55,272, +-82,-236, +-57,-8, +0,-7, +-52,43, +42,-165, +62,-35, +143,-20, +-142,256, +-135,-138, +90,240, +251,-265, +-25,-4, +186,-21, +-96,-54, +-171,229, +-164,3, +120,-83, +56,-258, +-131,82, +5,41, +-79,-69, +-59,-170, +331,-154, +67,108, +84,-129, +168,-30, +-142,42, +-322,-66, +95,-163, +-155,-131, +109,-140, +-10,-34, +171,42, +-26,-23, +-14,58, +98,-92, +-60,-38, +234,62, +-110,-74, +67,111, +-80,53, +-92,-162, +-194,89, +31,32, +-26,-23, +-41,-31, +-197,-188, +-51,95, +61,17, +24,-210, +-140,118, +-46,-110, +82,-34, +74,164, +-178,-280, +-88,-42, +-121,-43, +232,-48, +122,-75, +-90,-14, +129,-182, +153,44, +-131,64, +-129,-151, +-57,-248, +-60,-35, +-246,214, +-130,74, +-79,-91, +263,83, +-130,93, +-42,18, +145,192, +4,27, +227,-20, +63,-74, +-92,4, +-96,-230, +-36,-80, +-72,-34, +-72,-198, +110,-142, +83,-188, +-199,-152, +-4,-109, +38,-44, +-144,24, +-41,-110, +-16,2, +272,-109, +219,-240, +-148,-75, +78,-103, +-60,98, +39,173, +-77,-110, +265,-72, +-50,156, +-57,51, +-67,45, +12,142, +-69,147, +-155,-185, +-86,-110, +-83,-16, +-6,0, +55,181, +17,6, +265,-218, +98,-122, +-89,189, +-22,15, +-127,98, +157,21, +106,33, +-126,-33, +62,96, +-167,-181, +-160,-149, +227,17, +-92,184, +-75,43, +228,281, +104,59, +-88,77, +128,2, +-139,-9, +41,88, +143,-14, +-79,-126, +129,53, +-10,120, +-24,-132, +37,-15, +15,-77, +234,-143, +266,91, +-162,-20, +-125,-111, +36,-138, +-63,-124, +-157,152, +115,-17, +32,203, +-20,60, +354,58, +123,-191, +124,-28, +-49,-162, +-61,-90, +4,-227, +-49,118, +6,0, +-137,141, +-22,380, +35,25, +295,129, +43,-17, +-44,69, +48,126, +101,6, +-163,69, +120,-99, +65,-6, +135,-63, +-27,153, +323,-137, +-19,116, +-175,24, +-112,225, +-3,29, +48,25, +198,22, +342,-99, +23,81, +-194,-138, +112,-52, +142,23, +-38,-125, +21,-84, +-54,97, +-38,-128, +-194,-78, +-148,-50, +117,-2, +-8,-1, +28,-126, +225,-115, +77,-90, +186,127, +225,-40, +75,-10, +61,105, +-185,13, +-46,156, +-34,71, +91,132, +-169,-69, +-53,243, +337,-51, +47,-205, +95,97, +103,-11, +225,75, +-74,107, +-237,73, +111,-141, +-72,58, +176,55, +2,147, +-38,9, +0,-59, +-58,24, +90,-69, +-195,177, +-360,23, +34,127, +101,50, +-262,-78, +-96,-19, +-46,-28, +37,210, +-81,32, +69,25, +16,127, +86,138, +-92,69, +-65,-130, +-128,6, +62,114, +-188,102, +-245,-29, +41,-210, +-9,34, +-248,-216, +72,98, +245,47, +29,86, +32,103, +-101,155, +210,51, +29,-184, +-135,105, +-81,-95, +28,-98, +-29,23, +54,115, +65,-25, +107,95, +-79,-145, +-32,-11, +248,141, +-72,5, +-111,108, +-114,156, +127,151, +150,227, +138,42, +-9,-58, +164,30, +56,5, +139,-156, +-34,-159, +-80,-124, +243,172, +-44,-68, +12,12, +168,-86, +136,97, +-94,-123, +-18,-6, +109,-93, +-368,253, +-81,-175, +-271,-73, +-123,83, +1,125, +-115,-307, +-64,-82, +-156,291, +102,59, +-63,15, +-109,151, +-108,-13, +-76,173, +156,-67, +41,-51, +158,18, +94,20, +-302,-51, +-12,32, +107,41, +203,-92, +53,52, +-54,4, +-158,105, +-43,-66, +-148,251, +79,113, +-228,31, +-59,-26, +-27,-47, +177,101, +-18,-86, +21,301, +-238,-125, +-12,-27, +-15,29, +-210,-85, +-1,-205, +78,-8, +-69,-31, +48,-173, +-131,-86, +-25,152, +66,37, +-138,-246, +61,5, +-252,-129, +-111,24, +-77,18, +359,42, +92,-21, +266,18, +-47,-97, +-124,74, +172,-132, +-46,-98, +28,130, +212,107, +-105,45, +-160,-31, +79,222, +-179,-45, +125,69, +161,-41, +-32,-96, +120,-80, +-124,189, +-17,11, +-4,-52, +-53,223, +56,-209, +40,27, +141,-131, +-30,51, +-161,262, +-38,10, +15,-132, +-148,-170, +-26,-82, +11,145, +69,219, +-98,-60, +29,-41, +-45,27, +-33,68, +-72,32, +-10,-58, +-127,149, +26,42, +-86,111, +6,76, +26,122, +-23,-94, +42,25, +-20,179, +41,127, +-209,39, +194,-22, +12,157, +50,69, +290,44, +-47,130, +-59,-84, +126,-88, +-110,-83, +33,59, +-12,102, +-108,45, +159,-9, +18,-42, +-33,83, +-203,50, +-74,169, +-108,46, +-82,-164, +-2,264, +47,-211, +131,152, +128,-185, +230,-182, +-46,-53, +-85,253, +-113,54, +296,87, +22,-41, +-72,317, +-3,174, +-56,-98, +38,70, +77,123, +48,-157, +-29,-290, +233,53, +-199,81, +64,-38, +-23,241, +-192,-235, +201,34, +201,41, +227,119, +56,27, +-109,-96, +13,150, +-107,-132, +2,-50, +-36,141, +-137,-148, +-192,-80, +-109,42, +-71,-60, +-68,56, +119,124, +115,-109, +33,15, +-124,4, +-47,-130, +-69,-182, +-89,-95, +67,114, +-42,12, +116,67, +160,-108, +-3,98, +-21,79, +-17,-121, +-68,-74, +-22,-115, +-137,87, +243,-34, +77,8, +-53,139, +67,68, +27,66, +178,229, +-64,-201, +-102,126, +59,-15, +55,144, +39,107, +22,0, +26,62, +171,147, +-142,65, +-189,170, +3,153, +-116,-129, +43,-18, +-26,146, +58,-125, +163,119, +-57,20, +-121,-78, +-128,-164, +-96,-27, +-28,48, +114,-113, +-85,125, +35,-116, +10,15, +195,307, +92,31, +67,170, +18,89, +-260,103, +10,-120, +111,-48, +98,43, +19,246, +-218,-58, +39,-101, +-29,-90, +36,33, +-45,4, +-114,64, +19,-323, +89,111, +34,17, +42,-40, +4,-69, +198,-101, +-81,-57, +-2,91, +-63,-179, +11,3, +52,-35, +-25,157, +87,150, +189,-94, +-53,-13, +-111,83, +21,52, +150,32, +121,-10, +264,35, +196,-126, +55,25, +135,-26, +9,-139, +9,54, +-91,-22, +19,44, +34,-118, +82,-145, +-164,-33, +-214,150, +129,-25, +188,0, +-158,88, +144,-328, +24,-13, +74,-54, +233,41, +-29,92, +16,-60, +-151,-151, +41,1, +-58,62, +12,11, +143,-85, +0,-106, +-111,94, +-12,-29, +-95,21, +-161,-42, +181,152, +-119,17, +96,129, +-90,36, +-44,163, +-95,-87, +193,98, +-41,-188, +-71,14, +-141,152, +123,118, +-16,8, +38,-161, +26,-2, +134,39, +179,-32, +98,21, +48,-53, +-46,125, +2,147, +28,-3, +43,-76, +200,83, +38,-10, +-39,37, +172,100, +-38,-255, +207,-15, +-194,114, +16,-72, +-191,-60, +-34,1, +1,-111, +70,135, +-39,14, +-15,112, +-86,-189, +85,17, +-10,-54, +-103,66, +101,177, +-15,161, +-165,72, +-36,-105, +-159,34, +-30,-159, +75,-193, +6,-223, +-74,-29, +-4,30, +-138,-170, +-140,-110, +-118,100, +-47,71, +-107,-56, +80,21, +-155,152, +165,-32, +17,73, +-49,85, +115,63, +-52,-35, +-19,-159, +-19,109, +118,-202, +-14,-66, +-58,117, +-90,27, +-56,-42, +151,-60, +105,-10, +-83,69, +-57,-214, +-77,101, +-138,-66, +-40,-28, +74,41, +83,-48, +-35,-162, +-26,-61, +7,82, +-4,71, +25,124, +-69,55, +106,-23, +-50,-80, +-110,-33, +36,-37, +-40,35, +45,36, +6,-107, +22,-69, +-21,74, +-21,-40, +4,178, +6,-65, +-45,-45, +-52,-31, +79,-2, +35,-19, +-154,-42, +-41,-7, +108,-169, +77,192, +66,110, +-36,42, +-68,99, +125,4, +-147,80, +51,147, +143,51, +92,-17, +-221,4, +-71,118, +-73,4, +-116,-10, +210,-15, +-49,133, +63,-251, +-1,-145, +81,42, +-39,-56, +115,-24, +150,120, +125,15, +-55,26, +248,118, +-77,52, +-17,-146, +18,134, +99,14, +27,138, +63,-1, +48,215, +7,74, +-15,-3, +-32,23, +-122,100, +-143,-103, +-72,171, +195,-19, +-131,39, +9,-99, +163,-152, +-9,-77, +-86,-27, +157,211, +80,-23, +25,-22, +138,-47, +-28,89, +56,-98, +214,12, +-6,181, +13,23, +-108,-56, +1,-49, +-33,-54, +12,81, +-24,20, +-100,-119, +74,27, +-19,50, +131,-81, +-35,2, +-42,47, +-62,-15, +-9,-11, +47,95, +-19,-112, +-60,-33, +-37,16, +-49,-54, +74,83, +83,-51, +83,-7, +57,34, +-43,-30, +-149,-46, +-29,76, +31,97, +-53,-93, +32,-81, +-70,-43, +18,-114, +-128,-13, +105,89, +-57,68, +-118,19, +131,-95, +43,-85, +-110,54, +-7,42, +-114,22, +39,-69, +-108,59, +36,-37, +143,48, +-27,44, +41,-36, +78,120, +47,-150, +-66,24, +66,-47, +88,-114, +-113,-131, +-103,-32, +4,-89, +-25,-20, +-146,29, +-200,17, +-49,-33, +-68,-34, +21,-155, +-29,-38, +163,-6, +148,-11, +-5,24, +37,-47, +-74,10, +-36,50, +-60,-121, +189,28, +-77,45, +37,2, +-23,-73, +-102,-19, +23,-178, +66,85, +-86,-77, +-50,170, +-51,-17, +75,38, +30,40, +-23,74, +14,114, +-24,-30, +95,-6, +91,22, +0,-31, +-58,107, +51,129, +-6,62, +-29,59, +-35,-12, +-82,38, +136,7, +114,14, +-71,-174, +5,81, +-88,55, +86,-9, +-8,-99, +118,54, +6,-101, +92,108, +19,-42, +51,-8, +-57,-89, +47,-34, +-5,-33, +-7,-22, +-96,85, +7,34, +82,-48, +-53,-14, +-74,11, +-10,-149, +3,143, +48,48, +34,45, +-172,116, +-8,-61, +-93,33, +39,52, +44,77, +0,-98, +39,-123, +-95,32, +-86,72, +3,-48, +70,-5, +-81,-39, +0,54, +-26,29, +-45,75, +14,106, +-53,134, +32,118, +7,49, +35,35, +48,-76, +-22,-17, +-18,87, +41,73, +111,-14, +26,4, +-114,36, +44,-30, +-66,-67, +11,69, +-28,-11, +-96,92, +-6,-13, +79,17, +-89,66, +3,-2, +-115,-57, +79,-29, +11,10, +-65,27, +-72,-66, +38,-5, +32,-87, +113,88, +-69,104, +-63,-90, +49,-42, +107,-49, +-30,42, +159,81, +64,53, +18,67, +14,-54, +-50,34, +42,-7, +-32,20, +1,-48, +-74,-84, +-72,-64, +70,10, +-30,22, +39,71, +-1,5, +6,-61, +-24,51, +20,-80, +108,-81, +61,-18, +19,2, +63,82, +16,-15, +13,1, +76,68, +70,-7, +-99,-41, +90,-1, +-31,20, +83,95, +62,-38, +8,1, +34,70, +10,28, +-31,44, +32,-100, +-101,10, +-27,1, +45,-50, +8,36, +5,65, +-30,26, +62,34, +5,-25, +-8,-4, +-102,-39, +-58,-40, +25,-21, +-37,-20, +1,77, +22,36, +24,-19, +4,-40, +-13,-42, +-35,-83, +-21,-67, +-5,-1, +21,-22, +-36,-11, +-22,-42, +73,7, +-71,-13, +54,87, +99,152, +-123,-22, +46,12, +-10,-30, +42,-50, +21,62, +6,-50, +-93,74, +-87,7, +69,5, +11,26, +-28,9, +74,-52, +94,-7, +46,50, +-49,21, +100,60, +46,-102, +-1,8, +-82,81, +-23,70, +-57,8, +94,58, +-83,-11, +66,-55, +-18,-2, +18,-53, +92,-67, +-20,-27, +-9,55, +16,-24, +5,36, +25,-24, +42,-45, +-30,60, +-68,-32, +29,-17, +-2,51, +27,15, +50,58, +14,42, +24,-30, +1,36, +45,-63, +60,28, +8,5, +-19,-2, +9,2, +70,-1, +-6,-3, +44,-37, +29,8, +3,-39, +-20,-7, +50,-17, +5,-3, +-44,-17, +32,7, +30,-17, +48,35, +6,-29, +-84,-32, +-45,-5, +51,-6, +19,-50, +40,-11, +5,39, +-96,29, +56,-16, +-17,21, +11,-21, +22,-23, +21,22, +3,-45, +-44,54, +7,34, +-14,-13, +35,34, +13,-51, +33,-23, +-18,4, +51,5, +24,34, +-29,16, +-15,-21, +-18,25, +16,-15, +-26,7, +7,126, +11,5, +10,31, +-19,-52, +12,-37, +-52,-41, +-21,40, +-12,-40, +38,-2, +-9,16, +-59,-57, +3,28, +-6,21, +-51,-38, +-20,-12, +15,-13, +-32,-29, +19,-10, +3,-41, +54,30, +-37,16, +20,21, +-6,-49, +-15,-8, +56,-29, +26,10, +17,-45, +-12,-13, +40,-18, +-22,8, +-2,45, +9,41, +-4,-43, +-3,-14, +7,-16, +-4,35, +-14,41, +11,-13, +-9,16, +44,-26, +3,-41, +1,13, +35,-1, +33,-12, +-8,-38, +-45,10, +-5,-25, +47,-26, +-41,-11, +-5,-81, +12,-5, +27,-18, +-48,3, +16,-7, +-8,15, +1,33, +-16,-3, +16,12, +-6,8, +13,21, +-47,-20, +-25,8, +12,45, +-7,-9, +-8,20, +19,18, +19,22, +37,15, +26,-1, +2,-42, +20,14, +9,19, +-5,7, +-3,-15, +-13,10, +19,23, +5,-10, +5,10, +-15,1, +-3,-19, +-7,-11, +2,9, +-15,6, +29,20, +19,-26, +-3,18, +24,35, +-7,-4, +-4,-20, +-23,-4, +1,0, +-22,-25, +16,-21, +23,-3, +-14,0, +-4,-24, +4,4, +15,-2, +14,10, +4,1, +5,-2, +12,-6, +15,10, +-21,-27, +2,-13, +9,5, +-2,-2, +20,-25, +3,-23, +4,2, +-7,10, +3,-15, +-3,2, +7,10, +19,-6, +-12,18, +-1,-10, +4,-9, +6,-8, +3,12, +11,18, +-10,-7, +-4,18, +-1,13, +1,1, +16,-9, +-6,-2, +11,8, +8,-13, +5,-3, +-1,-4, +5,10, +0,10, +-2,8, +6,11, +-13,4, +-7,6, +3,2, +-1,-1, +-4,0, +-2,-11, +-2,-6, +-4,5, +4,-6, +-6,1, +-5,8, +4,0, +-4,-4, +-7,0, +9,9, +-5,8, +-3,0, +10,0, +-2,-2, +3,-6, +4,2, +-1,4, +-4,3, +8,-2, +-5,5, +-3,-1, +5,-1, +-2,0, +-2,1, +6,-1, +-2,1, +-3,1, +7,1, +-2,0, +-2,0, +6,0, +-2,0, +-2,0, +7,-1, +-3,-1, +-2,-1, +6,1, +-2,-1, +-2,0, +5,1, +-3,1, +-5,-5, +8,2, +-4,-3, +-1,-4, +4,-2, +3,6, +-2,2, +10,0, +-3,0, +-5,-8, +9,-9, +-7,0, +-4,4, +4,0, +-5,-8, +-6,-1, +4,6, +-4,-5, +-2,6, +-2,11, +-4,0, +-1,1, +3,-2, +-7,-6, +-13,-4, +6,-11, +-2,-8, +0,-10, +5,-10, +-1,4, +5,3, +8,13, +11,-8, +-6,2, +16,9, +1,-1, +-1,-13, +-4,-18, +-10,7, +11,-18, +3,-12, +6,8, +4,9, +-1,10, +-12,-18, +19,6, +7,-10, +-3,-2, +3,15, +-7,-10, +4,-2, +3,23, +20,25, +-2,2, +9,-5, +2,13, +-21,27, +15,-10, +12,6, +5,2, +4,-1, +14,-10, +15,2, +4,-4, +-4,24, +-14,0, +23,3, +16,21, +-22,25, +1,0, +-23,4, +-4,20, +-7,4, +24,-35, +-3,-18, +19,26, +29,-20, +-15,-6, +2,-9, +-7,11, +-3,19, +-15,-1, +5,-10, +5,10, +19,-23, +-13,-10, +-3,15, +-5,-7, +9,-19, +20,-14, +2,42, +26,1, +37,-15, +19,-22, +19,-18, +-8,-20, +-7,9, +12,-45, +-25,-8, +-47,20, +13,-21, +-6,-8, +16,-12, +-16,3, +1,-33, +-8,-15, +16,7, +-48,-3, +27,18, +12,5, +-5,81, +-41,11, +47,26, +-5,25, +-45,-10, +-8,38, +33,12, +35,1, +1,-13, +3,41, +44,26, +-9,-16, +11,13, +-14,-41, +-4,-35, +7,16, +-3,14, +-4,43, +9,-41, +-2,-45, +-22,-8, +40,18, +-12,13, +17,45, +26,-10, +56,29, +-15,8, +-6,49, +20,-21, +-37,-16, +54,-30, +3,41, +19,10, +-32,29, +15,13, +-20,12, +-51,38, +-6,-21, +3,-28, +-59,57, +-9,-16, +38,2, +-12,40, +-21,-40, +-52,41, +12,37, +-19,52, +10,-31, +11,-5, +7,-126, +-26,-7, +16,15, +-18,-25, +-15,21, +-29,-16, +24,-34, +51,-5, +-18,-4, +33,23, +13,51, +35,-34, +-14,13, +7,-34, +-44,-54, +3,45, +21,-22, +22,23, +11,21, +-17,-21, +56,16, +-96,-29, +5,-39, +40,11, +19,50, +51,6, +-45,5, +-84,32, +6,29, +48,-35, +30,17, +32,-7, +-44,17, +5,3, +50,17, +-20,7, +3,39, +29,-8, +44,37, +-6,3, +70,1, +9,-2, +-19,2, +8,-5, +60,-28, +45,63, +1,-36, +24,30, +14,-42, +50,-58, +27,-15, +-2,-51, +29,17, +-68,32, +-30,-60, +42,45, +25,24, +5,-36, +16,24, +-9,-55, +-20,27, +92,67, +18,53, +-18,2, +66,55, +-83,11, +94,-58, +-57,-8, +-23,-70, +-82,-81, +-1,-8, +46,102, +100,-60, +-49,-21, +46,-50, +94,7, +74,52, +-28,-9, +11,-26, +69,-5, +-87,-7, +-93,-74, +6,50, +21,-62, +42,50, +-10,30, +46,-12, +-123,22, +99,-152, +54,-87, +-71,13, +73,-7, +-22,42, +-36,11, +21,22, +-5,1, +-21,67, +-35,83, +-13,42, +4,40, +24,19, +22,-36, +1,-77, +-37,20, +25,21, +-58,40, +-102,39, +-8,4, +5,25, +62,-34, +-30,-26, +5,-65, +8,-36, +45,50, +-27,-1, +-101,-10, +32,100, +-31,-44, +10,-28, +34,-70, +8,-1, +62,38, +83,-95, +-31,-20, +90,1, +-99,41, +70,7, +76,-68, +13,-1, +16,15, +63,-82, +19,-2, +61,18, +108,81, +20,80, +-24,-51, +6,61, +-1,-5, +39,-71, +-30,-22, +70,-10, +-72,64, +-74,84, +1,48, +-32,-20, +42,7, +-50,-34, +14,54, +18,-67, +64,-53, +159,-81, +-30,-42, +107,49, +49,42, +-63,90, +-69,-104, +113,-88, +32,87, +38,5, +-72,66, +-65,-27, +11,-10, +79,29, +-115,57, +3,2, +-89,-66, +79,-17, +-6,13, +-96,-92, +-28,11, +11,-69, +-66,67, +44,30, +-114,-36, +26,-4, +111,14, +41,-73, +-18,-87, +-22,17, +48,76, +35,-35, +7,-49, +32,-118, +-53,-134, +14,-106, +-45,-75, +-26,-29, +0,-54, +-81,39, +70,5, +3,48, +-86,-72, +-95,-32, +39,123, +0,98, +44,-77, +39,-52, +-93,-33, +-8,61, +-172,-116, +34,-45, +48,-48, +3,-143, +-10,149, +-74,-11, +-53,14, +82,48, +7,-34, +-96,-85, +-7,22, +-5,33, +47,34, +-57,89, +51,8, +19,42, +92,-108, +6,101, +118,-54, +-8,99, +86,9, +-88,-55, +5,-81, +-71,174, +114,-14, +136,-7, +-82,-38, +-35,12, +-29,-59, +-6,-62, +51,-129, +-58,-107, +0,31, +91,-22, +95,6, +-24,30, +14,-114, +-23,-74, +30,-40, +75,-38, +-51,17, +-50,-170, +-86,77, +66,-85, +23,178, +-102,19, +-23,73, +37,-2, +-77,-45, +189,-28, +-60,121, +-36,-50, +-74,-10, +37,47, +-5,-24, +148,11, +163,6, +-29,38, +21,155, +-68,34, +-49,33, +-200,-17, +-146,-29, +-25,20, +4,89, +-103,32, +-113,131, +88,114, +66,47, +-66,-24, +47,150, +78,-120, +41,36, +-27,-44, +143,-48, +36,37, +-108,-59, +39,69, +-114,-22, +-7,-42, +-110,-54, +43,85, +131,95, +-118,-19, +-57,-68, +105,-89, +-128,13, +18,114, +-70,43, +32,81, +-53,93, +31,-97, +-29,-76, +-149,46, +-43,30, +57,-34, +83,7, +83,51, +74,-83, +-49,54, +-37,-16, +-60,33, +-19,112, +47,-95, +-9,11, +-62,15, +-42,-47, +-35,-2, +131,81, +-19,-50, +74,-27, +-100,119, +-24,-20, +12,-81, +-33,54, +1,49, +-108,56, +13,-23, +-6,-181, +214,-12, +56,98, +-28,-89, +138,47, +25,22, +80,23, +157,-211, +-86,27, +-9,77, +163,152, +9,99, +-131,-39, +195,19, +-72,-171, +-143,103, +-122,-100, +-32,-23, +-15,3, +7,-74, +48,-215, +63,1, +27,-138, +99,-14, +18,-134, +-17,146, +-77,-52, +248,-118, +-55,-26, +125,-15, +150,-120, +115,24, +-39,56, +81,-42, +-1,145, +63,251, +-49,-133, +210,15, +-116,10, +-73,-4, +-71,-118, +-221,-4, +92,17, +143,-51, +51,-147, +-147,-80, +125,-4, +-68,-99, +-36,-42, +66,-110, +77,-192, +108,169, +-41,7, +-154,42, +35,19, +79,2, +-52,31, +-45,45, +6,65, +4,-178, +-21,40, +-21,-74, +22,69, +6,107, +45,-36, +-40,-35, +36,37, +-110,33, +-50,80, +106,23, +-69,-55, +25,-124, +-4,-71, +7,-82, +-26,61, +-35,162, +83,48, +74,-41, +-40,28, +-138,66, +-77,-101, +-57,214, +-83,-69, +105,10, +151,60, +-56,42, +-90,-27, +-58,-117, +-14,66, +118,202, +-19,-109, +-19,159, +-52,35, +115,-63, +-49,-85, +17,-73, +165,32, +-155,-152, +80,-21, +-107,56, +-47,-71, +-118,-100, +-140,110, +-138,170, +-4,-30, +-74,29, +6,223, +75,193, +-30,159, +-159,-34, +-36,105, +-165,-72, +-15,-161, +101,-177, +-103,-66, +-10,54, +85,-17, +-86,189, +-15,-112, +-39,-14, +70,-135, +1,111, +-34,-1, +-191,60, +16,72, +-194,-114, +207,15, +-38,255, +172,-100, +-39,-37, +38,10, +200,-83, +43,76, +28,3, +2,-147, +-46,-125, +48,53, +98,-21, +179,32, +134,-39, +26,2, +38,161, +-16,-8, +123,-118, +-141,-152, +-71,-14, +-41,188, +193,-98, +-95,87, +-44,-163, +-90,-36, +96,-129, +-119,-17, +181,-152, +-161,42, +-95,-21, +-12,29, +-111,-94, +0,106, +143,85, +12,-11, +-58,-62, +41,-1, +-151,151, +16,60, +-29,-92, +233,-41, +74,54, +24,13, +144,328, +-158,-88, +188,0, +129,25, +-214,-150, +-164,33, +82,145, +34,118, +19,-44, +-91,22, +9,-54, +9,139, +135,26, +55,-25, +196,126, +264,-35, +121,10, +150,-32, +21,-52, +-111,-83, +-53,13, +189,94, +87,-150, +-25,-157, +52,35, +11,-3, +-63,179, +-2,-91, +-81,57, +198,101, +4,69, +42,40, +34,-17, +89,-111, +19,323, +-114,-64, +-45,-4, +36,-33, +-29,90, +39,101, +-218,58, +19,-246, +98,-43, +111,48, +10,120, +-260,-103, +18,-89, +67,-170, +92,-31, +195,-307, +10,-15, +35,116, +-85,-125, +114,113, +-28,-48, +-96,27, +-128,164, +-121,78, +-57,-20, +163,-119, +58,125, +-26,-146, +43,18, +-116,129, +3,-153, +-189,-170, +-142,-65, +171,-147, +26,-62, +22,0, +39,-107, +55,-144, +59,15, +-102,-126, +-64,201, +178,-229, +27,-66, +67,-68, +-53,-139, +77,-8, +243,34, +-137,-87, +-22,115, +-68,74, +-17,121, +-21,-79, +-3,-98, +160,108, +116,-67, +-42,-12, +67,-114, +-89,95, +-69,182, +-47,130, +-124,-4, +33,-15, +115,109, +119,-124, +-68,-56, +-71,60, +-109,-42, +-192,80, +-137,148, +-36,-141, +2,50, +-107,132, +13,-150, +-109,96, +56,-27, +227,-119, +201,-41, +201,-34, +-192,235, +-23,-241, +64,38, +-199,-81, +233,-53, +-29,290, +48,157, +77,-123, +38,-70, +-56,98, +-3,-174, +-72,-317, +22,41, +296,-87, +-113,-54, +-85,-253, +-46,53, +230,182, +128,185, +131,-152, +47,211, +-2,-264, +-82,164, +-108,-46, +-74,-169, +-203,-50, +-33,-83, +18,42, +159,9, +-108,-45, +-12,-102, +33,-59, +-110,83, +126,88, +-59,84, +-47,-130, +290,-44, +50,-69, +12,-157, +194,22, +-209,-39, +41,-127, +-20,-179, +42,-25, +-23,94, +26,-122, +6,-76, +-86,-111, +26,-42, +-127,-149, +-10,58, +-72,-32, +-33,-68, +-45,-27, +29,41, +-98,60, +69,-219, +11,-145, +-26,82, +-148,170, +15,132, +-38,-10, +-161,-262, +-30,-51, +141,131, +40,-27, +56,209, +-53,-223, +-4,52, +-17,-11, +-124,-189, +120,80, +-32,96, +161,41, +125,-69, +-179,45, +79,-222, +-160,31, +-105,-45, +212,-107, +28,-130, +-46,98, +172,132, +-124,-74, +-47,97, +266,-18, +92,21, +359,-42, +-77,-18, +-111,-24, +-252,129, +61,-5, +-138,246, +66,-37, +-25,-152, +-131,86, +48,173, +-69,31, +78,8, +-1,205, +-210,85, +-15,-29, +-12,27, +-238,125, +21,-301, +-18,86, +177,-101, +-27,47, +-59,26, +-228,-31, +79,-113, +-148,-251, +-43,66, +-158,-105, +-54,-4, +53,-52, +203,92, +107,-41, +-12,-32, +-302,51, +94,-20, +158,-18, +41,51, +156,67, +-76,-173, +-108,13, +-109,-151, +-63,-15, +102,-59, +-156,-291, +-64,82, +-115,307, +1,-125, +-123,-83, +-271,73, +-81,175, +-368,-253, +109,93, +-18,6, +-94,123, +136,-97, +168,86, +12,-12, +-44,68, +243,-172, +-80,124, +-34,159, +139,156, +56,-5, +164,-30, +-9,58, +138,-42, +150,-227, +127,-151, +-114,-156, +-111,-108, +-72,-5, +248,-141, +-32,11, +-79,145, +107,-95, +65,25, +54,-115, +-29,-23, +28,98, +-81,95, +-135,-105, +29,184, +210,-51, +-101,-155, +32,-103, +29,-86, +245,-47, +72,-98, +-248,216, +-9,-34, +41,210, +-245,29, +-188,-102, +62,-114, +-128,-6, +-65,130, +-92,-69, +86,-138, +16,-127, +69,-25, +-81,-32, +37,-210, +-46,28, +-96,19, +-262,78, +101,-50, +34,-127, +-360,-23, +-195,-177, +90,69, +-58,-24, +0,59, +-38,-9, +2,-147, +176,-55, +-72,-58, +111,141, +-237,-73, +-74,-107, +225,-75, +103,11, +95,-97, +47,205, +337,51, +-53,-243, +-169,69, +91,-132, +-34,-71, +-46,-156, +-185,-13, +61,-105, +75,10, +225,40, +186,-127, +77,90, +225,115, +28,126, +-8,1, +117,2, +-148,50, +-194,78, +-38,128, +-54,-97, +21,84, +-38,125, +142,-23, +112,52, +-194,138, +23,-81, +342,99, +198,-22, +48,-25, +-3,-29, +-112,-225, +-175,-24, +-19,-116, +323,137, +-27,-153, +135,63, +65,6, +120,99, +-163,-69, +101,-6, +48,-126, +-44,-69, +43,17, +295,-129, +35,-25, +-22,-380, +-137,-141, +11,0, +-167,-76, +42,-60, +272,21, +-4,30, +61,-3, +216,108, +-186,-2, +272,62, +42,-18, +124,37, +103,125, +145,-197, +-17,229, +-78,73, +168,-47, +153,-13, +127,58, +5,85, +160,209, +114,77, +43,-37, +-28,-14, +-43,55, +53,-388, +67,-57, +187,-55, +62,-76, +65,69, +-162,147, +-155,62, +116,154, +159,-4, +-43,51, +13,37, +-171,-131, +133,-122, +-145,191, +-205,0, +-63,203, +16,-21, +153,-67, +34,-24, +-21,1, +-164,-147, +131,222, +6,157, +39,244, +62,-94, +-156,-39, +-98,122, +181,85, +-80,30, +301,-110, +-35,-33, +24,-195, +42,23, +-141,-78, +-186,164, +87,18, +-50,202, +8,226, +-84,-42, +-71,-61, +63,25, +59,-42, +69,13, +-105,161, +148,159, +-260,-362, +-195,36, +11,-70, +321,-81, +-178,48, +63,230, +-109,-22, +-40,-39, +-221,-134, +-171,52, +50,139, +-111,60, +364,156, +-74,-31, +12,-2, +-70,229, +61,276, +-89,17, +-59,-64, +148,-107, +28,-243, +284,-8, +85,137, +265,121, +75,-126, +155,-35, +88,4, +76,67, +-252,164, +153,51, +-11,8, +-240,-47, +87,-38, +-301,-142, +173,64, +132,53, +76,176, +396,186, +-106,-198, +-125,91, +142,-31, +165,-259, +-52,136, +134,-4, +-81,9, +97,52, +50,-145, +-33,95, +-177,-36, +-174,177, +-168,160, +277,66, +-111,22, +-127,-300, +120,-41, +2,-3, +114,-132, +-272,-55, +-93,-182, +-222,233, +57,-34, +67,-22, +124,20, +-197,-188, +-87,-60, +48,98, +-150,28, +-59,-74, +97,134, +59,-90, +-11,67, +-182,-126, +166,4, +119,43, +-6,176, +-20,210, +-172,-213, +175,2, +35,34, +-47,-154, +-82,-60, +227,-228, +-227,-190, +-5,-176, +-139,-155, +-31,-89, +-39,2, +-64,46, +-322,256, +-293,-6, +68,158, +-22,25, +316,-82, +71,13, +-322,77, +48,3, +-130,-193, +214,130, +-96,43, +-141,12, +19,-75, +171,60, +143,-8, +-110,135, +-71,-181, +164,-62, +50,-17, +86,-165, +186,-171, +-53,48, +-45,174, +18,127, +-104,-64, +248,107, +-14,108, +29,-58, +114,-122, +-204,-196, +-90,123, +-144,136, +-1,178, +-49,18, +65,96, +100,-30, +20,-4, +-150,91, +-76,83, +69,40, +-69,-43, +307,97, +47,103, +-122,222, +-65,-86, +-177,65, +70,-42, +-132,-110, +-199,-107, +45,-84, +85,82, +188,-71, +-120,-15, +30,97, +211,114, +-20,-196, +-133,-47, +19,94, +51,106, +97,-1, +-73,40, +-20,10, +-16,-111, +86,43, +-150,90, +-99,39, +-92,234, +245,99, +-47,83, +-57,35, +3,101, +83,32, +-187,28, +-37,-38, +-107,24, +78,-98, +-112,-86, +148,-27, +-135,-201, +-25,200, +-30,11, +-244,-156, +111,8, +182,2, +145,-72, +245,83, +-162,115, +-89,-116, +34,-55, +78,98, +14,-7, +-100,-12, +-162,-35, +54,84, +153,-66, +16,-92, +76,-73, +32,-33, +121,-168, +-93,127, +265,152, +-89,-88, +-200,78, +72,17, +-79,115, +-184,-16, +-6,-83, +41,10, +-142,44, +138,97, +-14,112, +-25,-12, +53,94, +73,9, +-142,143, +-128,-165, +-71,158, +-34,-13, +-106,189, +70,-291, +-250,114, +-139,-150, +52,-184, +-31,-126, +56,-137, +19,-71, +105,118, +-131,175, +-109,-62, +-16,-21, +-55,109, +46,-73, +224,-134, +-8,49, +67,272, +-69,-102, +148,-98, +-10,-31, +120,1, +182,34, +-157,-60, +-105,-115, +-68,-61, +106,-36, +35,106, +-79,-19, +17,117, +-96,38, +-161,-56, +232,-87, +-151,54, +89,-46, +39,-35, +-81,-37, +-122,-52, +-12,126, +155,91, +124,-48, +-37,10, +146,-41, +-145,70, +63,-287, +-17,15, +-24,107, +-15,-122, +-63,196, +22,20, +-19,150, +111,57, +-169,-143, +-98,219, +-151,13, +-124,-268, +-19,-115, +-27,293, +-40,77, +-30,40, +85,133, +73,41, +-108,-48, +14,315, +-4,276, +17,-106, +77,-119, +-14,9, +65,165, +70,-172, +-117,-103, +51,-114, +-32,170, +49,-27, +-3,193, +35,168, +-22,138, +136,-180, +-173,163, +109,15, +-71,-46, +-69,93, +-57,178, +-95,152, +41,-119, +76,157, +-296,49, +4,-22, +24,17, +-1,-82, +-80,49, +-24,115, +67,67, +-129,78, +82,111, +-45,102, +50,-96, +35,38, +47,-72, +70,-181, +-80,153, +39,21, +-85,104, +-83,56, +12,0, +13,-51, +33,64, +-100,57, +256,-255, +37,38, +-116,132, +154,-91, +133,-57, +108,-43, +148,-32, +171,-10, +35,-171, +184,-53, +-44,-176, +-36,34, +92,14, +-65,-74, +2,-86, +-75,25, +4,198, +61,89, +166,140, +-109,23, +-47,-49, +-79,215, +-184,94, +-23,85, +-31,-111, +-85,30, +33,-70, +-42,-16, +-74,-108, +-196,3, +-65,130, +112,-70, +81,14, +164,52, +-100,169, +83,-85, +138,110, +-114,-42, +-68,7, +-32,49, +92,60, +-64,-85, +145,-26, +21,121, +-22,94, +-18,-25, +41,57, +-108,80, +129,27, +-74,-80, +155,-123, +24,-57, +15,84, +-100,-72, +147,8, +232,8, +133,69, +68,-27, +28,-240, +65,59, +69,53, +-12,-158, +191,-4, +-8,20, +-52,-44, +17,80, +111,56, +73,-6, +68,-18, +-23,-139, +-46,-191, +89,26, +170,-56, +20,-51, +-82,119, +-29,-17, +75,29, +99,56, +-71,150, +-15,76, +-153,-80, +2,39, +-129,50, +-92,-47, +45,-152, +-67,-51, +-120,180, +-185,79, +83,82, +18,-25, +42,127, +26,-60, +99,-35, +46,71, +113,69, +28,-138, +-121,32, +74,-52, +-87,20, +-39,-61, +-105,74, +-23,-7, +-1,9, +50,-58, +-39,30, +34,6, +95,84, +-2,-39, +-94,131, +-31,-87, +86,-58, +56,-78, +-61,136, +35,-7, +-87,40, +-33,-28, +-138,-66, +-137,75, +-116,-100, +102,-46, +42,-10, +-10,-154, +25,-72, +-53,130, +11,-30, +230,-36, +-80,-155, +220,-46, +-14,21, +7,94, +174,95, +83,66, +-29,60, +-16,-29, +-85,261, +-202,-58, +153,124, +30,10, +-96,-108, +-52,66, +-80,82, +-72,-22, +24,2, +-72,-186, +26,-121, +-23,-59, +-40,3, +103,-95, +21,55, +28,7, +-162,56, +40,25, +-7,-121, +86,-9, +-23,121, +83,-1, +-31,-17, +-6,31, +-36,26, +42,-68, +4,-29, +30,-120, +-90,26, +73,-52, +-84,4, +-36,-44, +6,100, +95,108, +-57,-5, +-11,98, +38,-1, +85,41, +-50,19, +177,-59, +89,-236, +-24,49, +-118,-2, +-66,-110, +64,-36, +13,-88, +-35,-39, +18,-112, +164,42, +60,0, +-59,98, +117,-1, +-14,-123, +-9,55, +17,149, +-91,37, +-75,-14, +-119,1, +-73,1, +48,107, +58,86, +-11,-11, +44,-40, +6,60, +-80,23, +-20,130, +-8,-21, +-11,38, +-52,91, +-154,-3, +97,108, +76,229, +-126,61, +59,-40, +12,-28, +-45,102, +-81,-31, +-57,139, +-6,-83, +90,34, +31,-15, +-18,0, +64,-46, +114,82, +-44,20, +-54,44, +51,-14, +40,60, +-38,-140, +66,-8, +-51,72, +68,20, +23,31, +113,-7, +-56,162, +22,33, +27,-47, +34,-110, +-53,-108, +-88,39, +45,-48, +-64,-15, +-9,-13, +-15,-82, +165,-50, +42,-91, +52,-81, +-7,35, +49,3, +154,105, +56,-6, +57,-47, +-56,-55, +-74,67, +34,-45, +-10,4, +-56,50, +-143,-16, +10,143, +-103,78, +0,73, +26,96, +-127,129, +-1,8, +95,5, +-45,30, +-76,58, +-36,100, +76,-116, +-35,65, +-19,24, +73,-101, +5,-15, +109,-8, +-13,-4, +-26,-24, +-78,94, +-13,8, +22,-29, +-20,90, +122,-76, +40,13, +25,-9, +96,10, +8,-65, +-24,-6, +-23,68, +12,-111, +41,-37, +29,-70, +45,60, +-36,-9, +197,-112, +41,-15, +-84,30, +105,-96, +-3,85, +-19,-65, +0,58, +189,10, +13,-2, +86,-3, +9,58, +13,-70, +-139,17, +-10,0, +-1,25, +87,39, +-113,-5, +-61,31, +185,17, +151,-44, +-14,0, +16,-2, +94,60, +-19,1, +96,-56, +123,17, +-47,-28, +-158,-71, +43,-58, +38,-102, +29,-23, +-45,-21, +69,68, +126,-49, +-69,3, +86,-19, +-1,-25, +-46,29, +-21,-37, +-108,26, +84,-43, +-42,87, +-24,5, +70,78, +38,45, +-5,-121, +-30,-22, +-24,68, +1,-69, +-10,74, +-7,-27, +-53,18, +35,-82, +38,-17, +32,17, +-9,-29, +46,54, +-70,21, +-55,-144, +1,14, +-21,39, +19,49, +-1,55, +-90,-15, +10,56, +71,-49, +73,66, +-97,52, +-20,52, +54,-24, +-21,-34, +-17,-27, +74,-53, +60,-5, +-45,93, +-42,-55, +-75,30, +-96,26, +-3,-101, +-73,-61, +33,-23, +-85,7, +141,-69, +-44,13, +16,-77, +-15,-71, +78,52, +-22,22, +38,-51, +30,70, +39,-21, +34,-11, +-14,8, +-21,-12, +-6,-83, +22,1, +64,-17, +-43,-63, +30,-3, +37,23, +26,71, +-5,-46, +-78,76, +4,-1, +-37,20, +-37,59, +21,14, +32,-48, +-65,-55, +38,6, +37,45, +-50,5, +-17,-59, +41,5, +13,4, +-10,123, +8,69, +-29,-24, +-33,0, +18,-72, +8,-21, +22,29, +-92,-54, +-2,57, +-9,-41, +-47,9, +34,-59, +-7,-19, +5,-17, +44,36, +26,-46, +-9,13, +86,38, +40,36, +37,-106, +29,0, +4,4, +-23,4, +-11,-20, +23,5, +0,-10, +24,56, +56,-11, +-47,-53, +-35,17, +14,51, +49,9, +-20,-11, +-4,10, +-1,89, +5,-36, +-60,-45, +-30,-20, +9,-36, +-26,17, +33,-76, +12,-27, +76,54, +5,22, +-1,58, +4,-33, +35,-7, +19,-30, +0,-23, +3,52, +3,14, +39,-17, +19,-7, +71,-9, +7,-88, +-28,11, +-65,-15, +5,9, +26,48, +14,-12, +14,46, +2,-31, +69,-23, +16,24, +-65,16, +-29,33, +-5,32, +-42,15, +-5,3, +-13,-32, +39,22, +-11,69, +-2,-13, +-15,-39, +38,7, +-1,-12, +-13,60, +-30,-83, +38,-17, +-2,8, +-25,35, +21,67, +13,-45, +38,-47, +16,-68, +53,-42, +-22,12, +-25,-21, +-18,-11, +-57,-49, +-52,18, +-18,-22, +-61,34, +-1,-34, +5,15, +-30,23, +0,0, +4,-55, +60,31, +15,33, +-25,-7, +11,17, +-30,-43, +25,22, +-9,36, +7,-35, +1,-17, +16,7, +-12,-24, +-26,-29, +-18,6, +8,42, +10,-25, +-5,-6, +33,-55, +-68,-16, +-4,-21, +16,47, +-46,-15, +-20,-15, +-18,10, +20,-8, +31,29, +24,-63, +16,-37, +-23,16, +24,1, +-28,-9, +4,39, +37,-29, +-33,15, +-1,37, +-9,4, +-21,-21, +18,17, +-6,8, +33,59, +30,16, +-18,-18, +-3,29, +-12,-59, +-6,0, +-4,6, +19,-16, +14,9, +13,-23, +6,28, +-15,18, +-9,19, +9,16, +29,47, +-13,1, +-21,35, +-20,4, +-11,-6, +10,-6, +31,-2, +30,5, +2,-22, +-2,25, +7,2, +25,29, +4,-26, +5,-8, +1,-19, +-27,-26, +14,16, +22,-22, +3,7, +-11,12, +8,22, +-24,-39, +-8,-11, +-7,-1, +28,6, +0,-9, +-7,19, +5,-1, +-7,-7, +-2,-1, +19,-11, +18,8, +9,-3, +-1,-11, +14,-12, +-18,1, +-2,1, +-11,9, +-4,0, +-1,24, +11,-11, +5,2, +-2,-5, +-1,-9, +5,11, +28,6, +-2,-8, +2,8, +-4,-11, +-3,2, +-3,13, +3,2, +0,-12, +16,-5, +-2,-6, +-1,-7, +-5,11, +-3,-15, +4,2, +5,14, +-1,-1, +10,-6, +5,-1, +-1,-5, +0,7, +-1,8, +-10,2, +-3,0, +-7,4, +3,-5, +-1,0, +1,9, +6,-1, +4,2, +0,5, +0,2, +0,2, +2,3, +1,-5, +2,2, +-3,7, +3,-4, +1,3, +-2,4, +2,-2, +0,-1, +0,6, +1,-4, +0,0, +0,5, +0,-5, +0,0, +0,5, +0,-5, +0,0, +1,4, +0,-6, +0,1, +2,2, +-2,-4, +1,-3, +3,4, +-3,-7, +2,-2, +1,5, +2,-3, +0,-2, +0,-2, +0,-5, +4,-2, +6,1, +1,-9, +-1,0, +3,5, +-7,-4, +-3,0, +-10,-2, +-1,-8, +0,-7, +-1,5, +5,1, +10,6, +-1,1, +5,-14, +4,-2, +-3,15, +-5,-11, +-1,7, +-2,6, +16,5, +0,12, +3,-2, +-3,-13, +-3,-2, +-4,11, +2,-8, +-2,8, +28,-6, +5,-11, +-1,9, +-2,5, +5,-2, +11,11, +-1,-24, +-4,0, +-11,-9, +-2,-1, +-18,-1, +14,12, +-1,11, +9,3, +18,-8, +19,11, +-2,1, +-7,7, +5,1, +-7,-19, +0,9, +28,-6, +-7,1, +-8,11, +-24,39, +8,-22, +-11,-12, +3,-7, +22,22, +14,-16, +-27,26, +1,19, +5,8, +4,26, +25,-29, +7,-2, +-2,-25, +2,22, +30,-5, +31,2, +10,6, +-11,6, +-20,-4, +-21,-35, +-13,-1, +29,-47, +9,-16, +-9,-19, +-15,-18, +6,-28, +13,23, +14,-9, +19,16, +-4,-6, +-6,0, +-12,59, +-3,-29, +-18,18, +30,-16, +33,-59, +-6,-8, +18,-17, +-21,21, +-9,-4, +-1,-37, +-33,-15, +37,29, +4,-39, +-28,9, +24,-1, +-23,-16, +16,37, +24,63, +31,-29, +20,8, +-18,-10, +-20,15, +-46,15, +16,-47, +-4,21, +-68,16, +33,55, +-5,6, +10,25, +8,-42, +-18,-6, +-26,29, +-12,24, +16,-7, +1,17, +7,35, +-9,-36, +25,-22, +-30,43, +11,-17, +-25,7, +15,-33, +60,-31, +4,55, +0,0, +-30,-23, +5,-15, +-1,34, +-61,-34, +-18,22, +-52,-18, +-57,49, +-18,11, +-25,21, +-22,-12, +53,42, +16,68, +38,47, +13,45, +21,-67, +-25,-35, +-2,-8, +38,17, +-30,83, +-13,-60, +-1,12, +38,-7, +-15,39, +-2,13, +-11,-69, +39,-22, +-13,32, +-5,-3, +-42,-15, +-5,-32, +-29,-33, +-65,-16, +16,-24, +69,23, +2,31, +14,-46, +14,12, +26,-48, +5,-9, +-65,15, +-28,-11, +7,88, +71,9, +19,7, +39,17, +3,-14, +3,-52, +0,23, +19,30, +35,7, +4,33, +-1,-58, +5,-22, +76,-54, +12,27, +33,76, +-26,-17, +9,36, +-30,20, +-60,45, +5,36, +-1,-89, +-4,-10, +-20,11, +49,-9, +14,-51, +-35,-17, +-47,53, +56,11, +24,-56, +0,10, +23,-5, +-11,20, +-23,-4, +4,-4, +29,0, +37,106, +40,-36, +86,-38, +-9,-13, +26,46, +44,-36, +5,17, +-7,19, +34,59, +-47,-9, +-9,41, +-2,-57, +-92,54, +22,-29, +8,21, +18,72, +-33,0, +-29,24, +8,-69, +-10,-123, +13,-4, +41,-5, +-17,59, +-50,-5, +37,-45, +38,-6, +-65,55, +32,48, +21,-14, +-37,-59, +-37,-20, +4,1, +-78,-76, +-5,46, +26,-71, +37,-23, +30,3, +-43,63, +64,17, +22,-1, +-6,83, +-21,12, +-14,-8, +34,11, +39,21, +30,-70, +38,51, +-22,-22, +78,-52, +-15,71, +16,77, +-44,-13, +141,69, +-85,-7, +33,23, +-73,61, +-3,101, +-96,-26, +-75,-30, +-42,55, +-45,-93, +60,5, +74,53, +-17,27, +-21,34, +54,24, +-20,-52, +-97,-52, +73,-66, +71,49, +10,-56, +-90,15, +-1,-55, +19,-49, +-21,-39, +1,-14, +-55,144, +-70,-21, +46,-54, +-9,29, +32,-17, +38,17, +35,82, +-53,-18, +-7,27, +-10,-74, +1,69, +-24,-68, +-30,22, +-5,121, +38,-45, +70,-78, +-24,-5, +-42,-87, +84,43, +-108,-26, +-21,37, +-46,-29, +-1,25, +86,19, +-69,-3, +126,49, +69,-68, +-45,21, +29,23, +38,102, +43,58, +-158,71, +-47,28, +123,-17, +96,56, +-19,-1, +94,-60, +16,2, +-14,0, +151,44, +185,-17, +-61,-31, +-113,5, +87,-39, +-1,-25, +-10,0, +-139,-17, +13,70, +9,-58, +86,3, +13,2, +189,-10, +0,-58, +-19,65, +-3,-85, +105,96, +-84,-30, +41,15, +197,112, +-36,9, +45,-60, +29,70, +41,37, +12,111, +-23,-68, +-24,6, +8,65, +96,-10, +25,9, +40,-13, +122,76, +-20,-90, +22,29, +-13,-8, +-78,-94, +-26,24, +-13,4, +109,8, +5,15, +73,101, +-19,-24, +-35,-65, +76,116, +-36,-100, +-76,-58, +-45,-30, +95,-5, +-1,-8, +-127,-129, +26,-96, +0,-73, +-103,-78, +10,-143, +-143,16, +-56,-50, +-10,-4, +34,45, +-74,-67, +-56,55, +57,47, +56,6, +154,-105, +49,-3, +-7,-35, +52,81, +42,91, +165,50, +-15,82, +-9,13, +-64,15, +45,48, +-88,-39, +-53,108, +34,110, +27,47, +22,-33, +-56,-162, +113,7, +23,-31, +68,-20, +-51,-72, +66,8, +-38,140, +40,-60, +51,14, +-54,-44, +-44,-20, +114,-82, +64,46, +-18,0, +31,15, +90,-34, +-6,83, +-57,-139, +-81,31, +-45,-102, +12,28, +59,40, +-126,-61, +76,-229, +97,-108, +-154,3, +-52,-91, +-11,-38, +-8,21, +-20,-130, +-80,-23, +6,-60, +44,40, +-11,11, +58,-86, +48,-107, +-73,-1, +-119,-1, +-75,14, +-91,-37, +17,-149, +-9,-55, +-14,123, +117,1, +-59,-98, +60,0, +164,-42, +18,112, +-35,39, +13,88, +64,36, +-66,110, +-118,2, +-24,-49, +89,236, +177,59, +-50,-19, +85,-41, +38,1, +-11,-98, +-57,5, +95,-108, +6,-100, +-36,44, +-84,-4, +73,52, +-90,-26, +30,120, +4,29, +42,68, +-36,-26, +-6,-31, +-31,17, +83,1, +-23,-121, +86,9, +-7,121, +40,-25, +-162,-56, +28,-7, +21,-55, +103,95, +-40,-3, +-23,59, +26,121, +-72,186, +24,-2, +-72,22, +-80,-82, +-52,-66, +-96,108, +30,-10, +153,-124, +-202,58, +-85,-261, +-16,29, +-29,-60, +83,-66, +174,-95, +7,-94, +-14,-21, +220,46, +-80,155, +230,36, +11,30, +-53,-130, +25,72, +-10,154, +42,10, +102,46, +-116,100, +-137,-75, +-138,66, +-33,28, +-87,-40, +35,7, +-61,-136, +56,78, +86,58, +-31,87, +-94,-131, +-2,39, +95,-84, +34,-6, +-39,-30, +50,58, +-1,-9, +-23,7, +-105,-74, +-39,61, +-87,-20, +74,52, +-121,-32, +28,138, +113,-69, +46,-71, +99,35, +26,60, +42,-127, +18,25, +83,-82, +-185,-79, +-120,-180, +-67,51, +45,152, +-92,47, +-129,-50, +2,-39, +-153,80, +-15,-76, +-71,-150, +99,-56, +75,-29, +-29,17, +-82,-119, +20,51, +170,56, +89,-26, +-46,191, +-23,139, +68,18, +73,6, +111,-56, +17,-80, +-52,44, +-8,-20, +191,4, +-12,158, +69,-53, +65,-59, +28,240, +68,27, +133,-69, +232,-8, +147,-8, +-100,72, +15,-84, +24,57, +155,123, +-74,80, +129,-27, +-108,-80, +41,-57, +-18,25, +-22,-94, +21,-121, +145,26, +-64,85, +92,-60, +-32,-49, +-68,-7, +-114,42, +138,-110, +83,85, +-100,-169, +164,-52, +81,-14, +112,70, +-65,-130, +-196,-3, +-74,108, +-42,16, +33,70, +-85,-30, +-31,111, +-23,-85, +-184,-94, +-79,-215, +-47,49, +-109,-23, +166,-140, +61,-89, +4,-198, +-75,-25, +2,86, +-65,74, +92,-14, +-36,-34, +-44,176, +184,53, +35,171, +171,10, +148,32, +108,43, +133,57, +154,91, +-116,-132, +37,-38, +256,255, +-100,-57, +33,-64, +13,51, +12,0, +-83,-56, +-85,-104, +39,-21, +-80,-153, +70,181, +47,72, +35,-38, +50,96, +-45,-102, +82,-111, +-129,-78, +67,-67, +-24,-115, +-80,-49, +-1,82, +24,-17, +4,22, +-296,-49, +76,-157, +41,119, +-95,-152, +-57,-178, +-69,-93, +-71,46, +109,-15, +-173,-163, +136,180, +-22,-138, +35,-168, +-3,-193, +49,27, +-32,-170, +51,114, +-117,103, +70,172, +65,-165, +-14,-9, +77,119, +17,106, +-4,-276, +14,-315, +-108,48, +73,-41, +85,-133, +-30,-40, +-40,-77, +-27,-293, +-19,115, +-124,268, +-151,-13, +-98,-219, +-169,143, +111,-57, +-19,-150, +22,-20, +-63,-196, +-15,122, +-24,-107, +-17,-15, +63,287, +-145,-70, +146,41, +-37,-10, +124,48, +155,-91, +-12,-126, +-122,52, +-81,37, +39,35, +89,46, +-151,-54, +232,87, +-161,56, +-96,-38, +17,-117, +-79,19, +35,-106, +106,36, +-68,61, +-105,115, +-157,60, +182,-34, +120,-1, +-10,31, +148,98, +-69,102, +67,-272, +-8,-49, +224,134, +46,73, +-55,-109, +-16,21, +-109,62, +-131,-175, +105,-118, +19,71, +56,137, +-31,126, +52,184, +-139,150, +-250,-114, +70,291, +-106,-189, +-34,13, +-71,-158, +-128,165, +-142,-143, +73,-9, +53,-94, +-25,12, +-14,-112, +138,-97, +-142,-44, +41,-10, +-6,83, +-184,16, +-79,-115, +72,-17, +-200,-78, +-89,88, +265,-152, +-93,-127, +121,168, +32,33, +76,73, +16,92, +153,66, +54,-84, +-162,35, +-100,12, +14,7, +78,-98, +34,55, +-89,116, +-162,-115, +245,-83, +145,72, +182,-2, +111,-8, +-244,156, +-30,-11, +-25,-200, +-135,201, +148,27, +-112,86, +78,98, +-107,-24, +-37,38, +-187,-28, +83,-32, +3,-101, +-57,-35, +-47,-83, +245,-99, +-92,-234, +-99,-39, +-150,-90, +86,-43, +-16,111, +-20,-10, +-73,-40, +97,1, +51,-106, +19,-94, +-133,47, +-20,196, +211,-114, +30,-97, +-120,15, +188,71, +85,-82, +45,84, +-199,107, +-132,110, +70,42, +-177,-65, +-65,86, +-122,-222, +47,-103, +307,-97, +-69,43, +69,-40, +-76,-83, +-150,-91, +20,4, +100,30, +65,-96, +-49,-18, +-1,-178, +-144,-136, +-90,-123, +-204,196, +114,122, +29,58, +-14,-108, +248,-107, +-104,64, +18,-127, +-45,-174, +-53,-48, +186,171, +86,165, +50,17, +164,62, +-71,181, +-110,-135, +143,8, +171,-60, +19,75, +-141,-12, +-96,-43, +214,-130, +-130,193, +48,-3, +-322,-77, +71,-13, +316,82, +-22,-25, +68,-158, +-293,6, +-322,-256, +-64,-46, +-39,-2, +-31,89, +-139,155, +-5,176, +-227,190, +227,228, +-82,60, +-47,154, +35,-34, +175,-2, +-172,213, +-20,-210, +-6,-176, +119,-43, +166,-4, +-182,126, +-11,-67, +59,90, +97,-134, +-59,74, +-150,-28, +48,-98, +-87,60, +-197,188, +124,-20, +67,22, +57,34, +-222,-233, +-93,182, +-272,55, +114,132, +2,3, +120,41, +-127,300, +-111,-22, +277,-66, +-168,-160, +-174,-177, +-177,36, +-33,-95, +50,145, +97,-52, +-81,-9, +134,4, +-52,-136, +165,259, +142,31, +-125,-91, +-106,198, +396,-186, +76,-176, +132,-53, +173,-64, +-301,142, +87,38, +-240,47, +-11,-8, +153,-51, +-252,-164, +76,-67, +88,-4, +155,35, +75,126, +265,-121, +85,-137, +284,8, +28,243, +148,107, +-59,64, +-89,-17, +61,-276, +-70,-229, +12,2, +-74,31, +364,-156, +-111,-60, +50,-139, +-171,-52, +-221,134, +-40,39, +-109,22, +63,-230, +-178,-48, +321,81, +11,70, +-195,-36, +-260,362, +148,-159, +-105,-161, +69,-13, +59,42, +63,-25, +-71,61, +-84,42, +8,-226, +-50,-202, +87,-18, +-186,-164, +-141,78, +42,-23, +24,195, +-35,33, +301,110, +-80,-30, +181,-85, +-98,-122, +-156,39, +62,94, +39,-244, +6,-157, +131,-222, +-164,147, +-21,-1, +34,24, +153,67, +16,21, +-63,-203, +-205,0, +-145,-191, +133,122, +-171,131, +13,-37, +-43,-51, +159,4, +116,-154, +-155,-62, +-162,-147, +65,-69, +62,76, +187,55, +67,57, +53,388, +-43,-55, +-28,14, +43,37, +114,-77, +160,-209, +5,-85, +127,-58, +153,13, +168,47, +-78,-73, +-17,-229, +145,197, +103,-125, +124,-37, +42,18, +272,-62, +-186,2, +216,-108, +61,3, +-4,-30, +272,-21, +42,60, +-167,76, +0,0, +262,-138, +-273,197, +110,37, +39,170, +-38,83, +182,-52, +111,221, +227,-64, +-27,126, +110,-232, +25,123, +118,-31, +-99,-174, +130,150, +-32,28, +-80,-29, +-96,202, +-61,22, +148,23, +95,166, +161,-191, +-27,-91, +156,112, +-92,-90, +129,-179, +69,122, +-70,152, +228,66, +-173,94, +114,131, +146,34, +-8,-177, +133,110, +106,72, +72,79, +78,-106, +33,82, +12,187, +-226,-211, +-18,95, +-13,-99, +-204,227, +106,-188, +165,168, +-14,41, +-35,-5, +68,-104, +175,24, +31,13, +-35,99, +43,122, +20,121, +-91,26, +-7,-24, +-216,212, +-100,-156, +203,41, +-143,-92, +34,-84, +116,81, +-54,152, +5,93, +-90,155, +80,123, +14,-170, +33,-139, +112,29, +203,95, +-18,253, +-52,11, +16,294, +-15,61, +153,79, +88,124, +12,-134, +129,197, +-124,42, +-114,-111, +33,154, +168,-34, +35,-78, +345,-31, +17,-92, +-100,-72, +10,64, +-159,-151, +64,59, +102,159, +8,-134, +-124,116, +-27,-20, +-131,-3, +-35,158, +55,-3, +-28,-41, +-5,79, +-55,-184, +50,-84, +-71,54, +178,-1, +-41,129, +195,-104, +-109,15, +-175,-56, +-72,180, +-52,-95, +21,-11, +239,-17, +59,-49, +167,60, +-59,21, +121,-40, +47,164, +-276,71, +-171,233, +46,-87, +-82,-122, +109,10, +121,-61, +146,-42, +-80,-287, +-3,2, +-103,-126, +-7,110, +-4,-113, +252,132, +-319,-40, +104,-18, +-50,-90, +168,-39, +23,52, +-119,-13, +25,65, +14,35, +42,80, +-43,-96, +116,-38, +190,107, +190,83, +-63,-49, +-104,-179, +33,98, +-46,-87, +-23,18, +-95,-163, +-44,-264, +253,15, +-147,-33, +136,-157, +56,66, +135,17, +11,-99, +-204,-251, +406,-8, +159,173, +4,125, +-210,105, +-62,-377, +-108,28, +-88,121, +-133,39, +-95,97, +-45,167, +57,58, +-16,-153, +133,-36, +45,-173, +52,-87, +-99,35, +-12,-99, +21,45, +176,39, +-127,50, +-166,196, +-95,171, +10,142, +47,-140, +75,-1, +97,17, +269,-104, +4,-115, +164,33, +-18,170, +-91,-145, +-48,-222, +213,33, +-9,1, +38,-140, +40,-8, +20,15, +-24,-62, +-60,-85, +-150,40, +-60,72, +-154,-10, +-187,83, +-153,33, +156,208, +91,-105, +-142,1, +-54,173, +-362,-7, +158,-145, +190,235, +-3,88, +-181,4, +27,-157, +9,105, +-17,170, +-37,88, +64,218, +-98,39, +140,-94, +89,145, +-27,144, +-98,48, +-224,-197, +-62,138, +120,-89, +87,-25, +31,170, +-10,204, +-227,-50, +-158,-102, +-146,173, +62,2, +0,-43, +3,-166, +-52,-196, +-4,133, +89,-216, +303,-60, +192,-137, +-36,-91, +87,10, +28,-60, +-123,-47, +-37,200, +64,78, +-141,-284, +-115,-37, +98,-62, +-20,-106, +250,34, +-116,25, +-27,-194, +-67,40, +222,176, +28,79, +172,-76, +36,122, +257,109, +-126,-39, +76,-138, +-109,-89, +69,8, +136,61, +-78,-59, +-68,-151, +0,239, +383,-11, +143,-207, +-68,-21, +5,-85, +17,76, +-41,77, +-117,93, +14,279, +15,195, +114,-27, +175,42, +-244,98, +-47,-25, +-121,-363, +145,72, +-85,-132, +128,-27, +-46,-93, +-81,72, +72,-54, +-8,-8, +-220,-50, +-96,-261, +180,-39, +118,92, +109,-44, +-56,-272, +-34,132, +153,-141, +81,125, +-127,153, +32,-79, +-95,-141, +10,71, +81,-28, +43,33, +76,-193, +-239,193, +-17,243, +199,46, +-74,335, +146,107, +26,-102, +83,105, +233,-209, +-140,70, +63,-48, +-203,-114, +-116,106, +157,-182, +-93,-78, +70,-163, +26,193, +-223,-160, +-185,-36, +-140,101, +43,83, +99,-92, +115,-127, +-4,-174, +-17,123, +-161,-70, +111,73, +-68,-34, +55,22, +-153,45, +-66,104, +-83,39, +5,-36, +-168,-80, +-44,-120, +11,-101, +-239,-17, +59,12, +73,-72, +-25,16, +78,-1, +-157,-38, +-169,83, +-6,77, +-61,38, +118,-252, +19,-15, +-95,-254, +-57,49, +-51,-32, +116,45, +58,19, +14,7, +70,-247, +57,52, +113,-86, +104,258, +75,-146, +-76,-56, +100,23, +133,10, +-144,-174, +-60,246, +-73,21, +78,-149, +81,92, +84,95, +-134,-74, +-22,123, +-162,224, +-63,-93, +8,127, +-59,10, +87,74, +-12,-65, +63,8, +-47,-136, +-112,83, +41,-10, +55,74, +-24,5, +-144,89, +114,122, +-2,-68, +-9,-72, +149,-24, +162,-27, +102,106, +-39,29, +-132,-10, +-29,-90, +-60,37, +31,-48, +18,-7, +136,-143, +-167,140, +182,160, +131,-23, +-113,171, +133,75, +99,-125, +-44,119, +-106,-64, +57,128, +-60,-122, +-118,-75, +0,-82, +-16,-94, +-31,9, +-100,-2, +-12,-40, +-153,-43, +-25,-134, +-78,-54, +-32,-23, +26,-120, +-36,-16, +111,-82, +-35,-61, +-38,109, +-49,-105, +-119,31, +-38,-256, +203,3, +156,67, +-162,-163, +-135,-46, +-164,-19, +37,55, +-130,54, +27,-88, +-38,149, +-5,138, +44,118, +60,20, +-146,17, +-83,-154, +-28,29, +21,48, +241,-92, +-16,-27, +-18,53, +73,-6, +-1,140, +-76,167, +125,18, +-215,38, +-295,-24, +1,156, +-17,196, +-120,0, +14,-41, +-100,146, +-184,138, +61,134, +155,-2, +-18,13, +69,12, +18,61, +101,-32, +145,-39, +-53,-89, +54,-115, +107,-31, +-12,223, +-30,16, +72,-51, +-87,-68, +25,104, +165,72, +25,-94, +-57,13, +31,111, +-160,-121, +-36,60, +-95,-164, +-42,97, +126,-11, +8,2, +29,73, +-45,79, +23,-75, +-28,-174, +-29,184, +-82,50, +-45,83, +152,-102, +-6,-73, +1,-1, +15,-65, +-32,127, +-85,-83, +132,108, +81,-89, +-1,41, +25,-57, +8,-135, +-68,107, +40,156, +126,28, +-46,-90, +-61,-119, +-60,-68, +-89,42, +-66,-141, +-54,-191, +96,47, +-5,127, +-86,88, +85,23, +45,-22, +-6,14, +118,29, +178,77, +94,121, +67,-22, +22,139, +142,189, +23,69, +-34,33, +46,55, +-16,16, +67,2, +192,-47, +-26,52, +-161,56, +-94,-175, +-40,-41, +-1,-14, +-123,-150, +-123,28, +60,109, +167,3, +24,-35, +-40,18, +-82,-12, +-34,10, +82,122, +-111,34, +127,-2, +-50,-55, +62,0, +-76,-4, +-52,63, +-33,20, +-58,64, +218,-102, +5,-83, +-48,62, +-115,-35, +77,-25, +75,3, +-21,88, +51,-18, +-40,65, +50,-70, +-176,-180, +91,61, +-12,-109, +15,-46, +-13,111, +-13,71, +112,-5, +-2,38, +-159,-49, +137,2, +103,45, +9,36, +-101,19, +-71,70, +-60,0, +18,116, +10,105, +33,-87, +-1,83, +26,131, +51,-14, +195,-110, +56,-52, +-20,-66, +37,-48, +115,9, +125,-70, +52,-199, +-81,-125, +102,-22, +121,60, +53,-51, +74,37, +4,13, +-45,26, +-19,73, +12,153, +-16,-92, +-30,-100, +-82,-8, +75,-54, +68,75, +129,9, +55,-40, +33,-30, +-60,26, +86,-136, +31,20, +-152,-189, +2,-95, +-10,123, +-46,144, +-39,-34, +-184,-74, +115,-44, +-44,-47, +-13,28, +-17,0, +-90,59, +-20,-40, +-45,-14, +-54,-13, +-56,-98, +-74,-22, +-4,-86, +1,-14, +-20,-65, +-29,18, +-86,-14, +-67,-86, +-3,-28, +-67,22, +156,-52, +-100,-67, +16,133, +57,4, +31,2, +88,69, +60,54, +60,36, +6,-79, +-126,140, +60,-34, +-23,-35, +-40,-23, +-29,-58, +60,-71, +15,85, +33,141, +-42,38, +-57,28, +-5,34, +30,-24, +89,18, +18,-88, +-23,51, +105,39, +-62,-75, +-1,-47, +-44,46, +-3,39, +-23,-48, +126,78, +-67,-57, +63,-68, +88,2, +62,-134, +-7,-2, +48,22, +27,58, +-59,19, +31,25, +57,-129, +30,-12, +-109,50, +70,44, +-53,0, +-37,-3, +17,98, +167,46, +-197,48, +5,30, +-38,18, +-16,35, +39,46, +47,18, +-119,-93, +31,-12, +-160,17, +-49,1, +-35,70, +89,-91, +6,-79, +5,-23, +5,-66, +-27,68, +1,46, +-16,-61, +-13,-7, +-43,-81, +-71,-20, +-55,-28, +-7,-85, +23,21, +39,-75, +48,-45, +-9,-41, +9,74, +-18,-67, +62,21, +-60,-73, +18,19, +-122,63, +-56,52, +77,5, +47,-31, +-75,-156, +27,-64, +-30,-2, +36,-8, +-144,53, +6,-35, +-47,6, +19,-68, +-32,-108, +-57,118, +65,-34, +-123,88, +45,83, +80,-68, +44,99, +159,27, +57,-21, +46,-40, +40,-61, +-134,97, +86,15, +12,-29, +-98,30, +-5,-69, +84,-3, +-12,28, +50,47, +-65,13, +-24,-26, +-84,11, +69,114, +-25,40, +-114,-36, +-40,-84, +16,-21, +-28,30, +0,-22, +32,-19, +-116,11, +53,58, +-69,-59, +-82,68, +-73,-121, +92,-33, +-15,23, +-2,84, +103,0, +85,-17, +72,-7, +34,-60, +-11,31, +35,3, +-74,-46, +-64,85, +25,129, +32,49, +10,-93, +-73,31, +36,24, +21,8, +-62,29, +-40,-76, +-18,60, +40,6, +47,99, +-13,-7, +-1,82, +111,26, +-19,31, +-59,-74, +11,37, +5,-5, +-43,94, +2,-29, +-63,-32, +-58,-22, +0,-17, +74,3, +6,-34, +-42,-9, +0,30, +-14,19, +-55,33, +-67,125, +19,60, +-71,-50, +17,17, +-81,-4, +-62,-12, +76,18, +4,-10, +-18,-126, +-7,-21, +57,-23, +66,-10, +-16,63, +0,32, +-16,-45, +15,-37, +-57,-60, +90,-13, +41,60, +-39,9, +20,1, +68,-9, +42,20, +35,-40, +49,28, +-35,1, +-57,-64, +112,-5, +5,98, +-19,-25, +13,-21, +28,-100, +1,1, +10,25, +-5,27, +74,-18, +-7,-83, +1,-26, +27,-38, +14,-29, +-34,-26, +-18,-9, +21,10, +-28,18, +-26,-13, +7,36, +-13,24, +-48,14, +-35,-44, +20,14, +42,13, +-49,52, +-35,20, +24,70, +-20,6, +-22,4, +17,20, +80,-31, +18,-63, +33,1, +22,7, +-27,37, +18,-22, +-14,-14, +-32,-2, +-14,37, +-41,2, +-21,25, +6,-4, +51,-5, +11,-25, +18,-29, +44,-34, +-37,-10, +-28,-32, +-37,-34, +70,-27, +32,86, +-14,30, +-39,24, +-46,-49, +27,39, +-7,55, +-22,-44, +-7,47, +-15,-2, +-36,17, +-48,-20, +-13,-23, +25,12, +-32,-10, +2,-16, +-28,-9, +15,27, +33,60, +-15,8, +-17,0, +10,3, +22,13, +-8,-14, +18,-1, +-1,-6, +-8,14, +-10,46, +-18,-61, +14,21, +-6,-16, +20,38, +-28,-20, +24,-8, +-41,-14, +-21,3, +-35,7, +11,43, +-14,-2, +-19,7, +0,-8, +9,-27, +53,-38, +-6,-7, +10,25, +7,9, +-6,-13, +7,58, +-5,7, +-18,10, +13,7, +-3,-30, +19,-26, +-21,5, +6,-9, +-5,37, +24,-7, +-6,12, +-18,-8, +-4,5, +-17,-14, +9,7, +8,5, +-1,-11, +18,-7, +4,-15, +-18,-11, +26,-2, +-6,18, +3,-4, +11,-1, +-24,-19, +4,-5, +-1,14, +-23,15, +-4,37, +13,-1, +-13,10, +11,-11, +6,-14, +-4,3, +21,19, +-12,-2, +11,12, +27,17, +1,-18, +31,0, +6,11, +20,1, +2,24, +-19,5, +-10,-7, +7,9, +16,7, +11,-26, +12,16, +8,9, +-7,-15, +-5,14, +-8,-2, +8,-5, +-7,-9, +17,-13, +-3,0, +4,1, +20,1, +1,-2, +1,4, +4,10, +-6,8, +-8,-5, +16,1, +-4,11, +4,3, +-4,-5, +16,-9, +-18,1, +7,-6, +1,-12, +4,13, +2,1, +-5,-1, +10,14, +2,0, +-4,1, +-4,10, +12,0, +2,0, +-1,-1, +12,9, +1,-5, +-8,4, +1,7, +1,-9, +-5,10, +0,2, +-1,0, +3,7, +4,1, +0,-10, +2,3, +2,2, +-1,-6, +0,7, +-1,-1, +-1,-3, +2,5, +-3,2, +3,-4, +0,8, +1,0, +0,-5, +0,5, +1,0, +0,-5, +0,5, +0,0, +0,-5, +0,5, +1,0, +0,-5, +0,5, +1,0, +0,-8, +3,4, +-3,-2, +2,-5, +-1,3, +-1,1, +0,-7, +-1,6, +2,-2, +2,-3, +0,10, +4,-1, +3,-7, +-1,0, +0,-2, +-5,-10, +1,9, +1,-7, +-8,-4, +1,5, +12,-9, +-1,1, +2,0, +12,0, +-4,-10, +-4,-1, +2,0, +10,-14, +-5,1, +2,-1, +4,-13, +1,12, +7,6, +-18,-1, +16,9, +-4,5, +4,-3, +-4,-11, +16,-1, +-8,5, +-6,-8, +4,-10, +1,-4, +1,2, +20,-1, +4,-1, +-3,0, +17,13, +-7,9, +8,5, +-8,2, +-5,-14, +-7,15, +8,-9, +12,-16, +11,26, +16,-7, +7,-9, +-10,7, +-19,-5, +2,-24, +20,-1, +6,-11, +31,0, +1,18, +27,-17, +11,-12, +-12,2, +21,-19, +-4,-3, +6,14, +11,11, +-13,-10, +13,1, +-4,-37, +-23,-15, +-1,-14, +4,5, +-24,19, +11,1, +3,4, +-6,-18, +26,2, +-18,11, +4,15, +18,7, +-1,11, +8,-5, +9,-7, +-17,14, +-4,-5, +-18,8, +-6,-12, +24,7, +-5,-37, +6,9, +-21,-5, +19,26, +-3,30, +13,-7, +-18,-10, +-5,-7, +7,-58, +-6,13, +7,-9, +10,-25, +-6,7, +53,38, +9,27, +0,8, +-19,-7, +-14,2, +11,-43, +-35,-7, +-21,-3, +-41,14, +24,8, +-28,20, +20,-38, +-6,16, +14,-21, +-18,61, +-10,-46, +-8,-14, +-1,6, +18,1, +-8,14, +22,-13, +10,-3, +-17,0, +-15,-8, +33,-60, +15,-27, +-28,9, +2,16, +-32,10, +25,-12, +-13,23, +-48,20, +-36,-17, +-15,2, +-7,-47, +-22,44, +-7,-55, +27,-39, +-46,49, +-39,-24, +-14,-30, +32,-86, +70,27, +-37,34, +-28,32, +-37,10, +44,34, +18,29, +11,25, +51,5, +6,4, +-21,-25, +-41,-2, +-14,-37, +-32,2, +-14,14, +18,22, +-27,-37, +22,-7, +33,-1, +18,63, +80,31, +17,-20, +-22,-4, +-20,-6, +24,-70, +-35,-20, +-49,-52, +42,-13, +20,-14, +-35,44, +-48,-14, +-13,-24, +7,-36, +-26,13, +-28,-18, +21,-10, +-18,9, +-34,26, +14,29, +27,38, +1,26, +-7,83, +74,18, +-5,-27, +10,-25, +1,-1, +28,100, +13,21, +-19,25, +5,-98, +112,5, +-57,64, +-35,-1, +49,-28, +35,40, +42,-20, +68,9, +20,-1, +-39,-9, +41,-60, +90,13, +-57,60, +15,37, +-16,45, +0,-32, +-16,-63, +66,10, +57,23, +-7,21, +-18,126, +4,10, +76,-18, +-62,12, +-81,4, +17,-17, +-71,50, +19,-60, +-67,-125, +-55,-33, +-14,-19, +0,-30, +-42,9, +6,34, +74,-3, +0,17, +-58,22, +-63,32, +2,29, +-43,-94, +5,5, +11,-37, +-59,74, +-19,-31, +111,-26, +-1,-82, +-13,7, +47,-99, +40,-6, +-18,-60, +-40,76, +-62,-29, +21,-8, +36,-24, +-73,-31, +10,93, +32,-49, +25,-129, +-64,-85, +-74,46, +35,-3, +-11,-31, +34,60, +72,7, +85,17, +103,0, +-2,-84, +-15,-23, +92,33, +-73,121, +-82,-68, +-69,59, +53,-58, +-116,-11, +32,19, +0,22, +-28,-30, +16,21, +-40,84, +-114,36, +-25,-40, +69,-114, +-84,-11, +-24,26, +-65,-13, +50,-47, +-12,-28, +84,3, +-5,69, +-98,-30, +12,29, +86,-15, +-134,-97, +40,61, +46,40, +57,21, +159,-27, +44,-99, +80,68, +45,-83, +-123,-88, +65,34, +-57,-118, +-32,108, +19,68, +-47,-6, +6,35, +-144,-53, +36,8, +-30,2, +27,64, +-75,156, +47,31, +77,-5, +-56,-52, +-122,-63, +18,-19, +-60,73, +62,-21, +-18,67, +9,-74, +-9,41, +48,45, +39,75, +23,-21, +-7,85, +-55,28, +-71,20, +-43,81, +-13,7, +-16,61, +1,-46, +-27,-68, +5,66, +5,23, +6,79, +89,91, +-35,-70, +-49,-1, +-160,-17, +31,12, +-119,93, +47,-18, +39,-46, +-16,-35, +-38,-18, +5,-30, +-197,-48, +167,-46, +17,-98, +-37,3, +-53,0, +70,-44, +-109,-50, +30,12, +57,129, +31,-25, +-59,-19, +27,-58, +48,-22, +-7,2, +62,134, +88,-2, +63,68, +-67,57, +126,-78, +-23,48, +-3,-39, +-44,-46, +-1,47, +-62,75, +105,-39, +-23,-51, +18,88, +89,-18, +30,24, +-5,-34, +-57,-28, +-42,-38, +33,-141, +15,-85, +60,71, +-29,58, +-40,23, +-23,35, +60,34, +-126,-140, +6,79, +60,-36, +60,-54, +88,-69, +31,-2, +57,-4, +16,-133, +-100,67, +156,52, +-67,-22, +-3,28, +-67,86, +-86,14, +-29,-18, +-20,65, +1,14, +-4,86, +-74,22, +-56,98, +-54,13, +-45,14, +-20,40, +-90,-59, +-17,0, +-13,-28, +-44,47, +115,44, +-184,74, +-39,34, +-46,-144, +-10,-123, +2,95, +-152,189, +31,-20, +86,136, +-60,-26, +33,30, +55,40, +129,-9, +68,-75, +75,54, +-82,8, +-30,100, +-16,92, +12,-153, +-19,-73, +-45,-26, +4,-13, +74,-37, +53,51, +121,-60, +102,22, +-81,125, +52,199, +125,70, +115,-9, +37,48, +-20,66, +56,52, +195,110, +51,14, +26,-131, +-1,-83, +33,87, +10,-105, +18,-116, +-60,0, +-71,-70, +-101,-19, +9,-36, +103,-45, +137,-2, +-159,49, +-2,-38, +112,5, +-13,-71, +-13,-111, +15,46, +-12,109, +91,-61, +-176,180, +50,70, +-40,-65, +51,18, +-21,-88, +75,-3, +77,25, +-115,35, +-48,-62, +5,83, +218,102, +-58,-64, +-33,-20, +-52,-63, +-76,4, +62,0, +-50,55, +127,2, +-111,-34, +82,-122, +-34,-10, +-82,12, +-40,-18, +24,35, +167,-3, +60,-109, +-123,-28, +-123,150, +-1,14, +-40,41, +-94,175, +-161,-56, +-26,-52, +192,47, +67,-2, +-16,-16, +46,-55, +-34,-33, +23,-69, +142,-189, +22,-139, +67,22, +94,-121, +178,-77, +118,-29, +-6,-14, +45,22, +85,-23, +-86,-88, +-5,-127, +96,-47, +-54,191, +-66,141, +-89,-42, +-60,68, +-61,119, +-46,90, +126,-28, +40,-156, +-68,-107, +8,135, +25,57, +-1,-41, +81,89, +132,-108, +-85,83, +-32,-127, +15,65, +1,1, +-6,73, +152,102, +-45,-83, +-82,-50, +-29,-184, +-28,174, +23,75, +-45,-79, +29,-73, +8,-2, +126,11, +-42,-97, +-95,164, +-36,-60, +-160,121, +31,-111, +-57,-13, +25,94, +165,-72, +25,-104, +-87,68, +72,51, +-30,-16, +-12,-223, +107,31, +54,115, +-53,89, +145,39, +101,32, +18,-61, +69,-12, +-18,-13, +155,2, +61,-134, +-184,-138, +-100,-146, +14,41, +-120,0, +-17,-196, +1,-156, +-295,24, +-215,-38, +125,-18, +-76,-167, +-1,-140, +73,6, +-18,-53, +-16,27, +241,92, +21,-48, +-28,-29, +-83,154, +-146,-17, +60,-20, +44,-118, +-5,-138, +-38,-149, +27,88, +-130,-54, +37,-55, +-164,19, +-135,46, +-162,163, +156,-67, +203,-3, +-38,256, +-119,-31, +-49,105, +-38,-109, +-35,61, +111,82, +-36,16, +26,120, +-32,23, +-78,54, +-25,134, +-153,43, +-12,40, +-100,2, +-31,-9, +-16,94, +0,82, +-118,75, +-60,122, +57,-128, +-106,64, +-44,-119, +99,125, +133,-75, +-113,-171, +131,23, +182,-160, +-167,-140, +136,143, +18,7, +31,48, +-60,-37, +-29,90, +-132,10, +-39,-29, +102,-106, +162,27, +149,24, +-9,72, +-2,68, +114,-122, +-144,-89, +-24,-5, +55,-74, +41,10, +-112,-83, +-47,136, +63,-8, +-12,65, +87,-74, +-59,-10, +8,-127, +-63,93, +-162,-224, +-22,-123, +-134,74, +84,-95, +81,-92, +78,149, +-73,-21, +-60,-246, +-144,174, +133,-10, +100,-23, +-76,56, +75,146, +104,-258, +113,86, +57,-52, +70,247, +14,-7, +58,-19, +116,-45, +-51,32, +-57,-49, +-95,254, +19,15, +118,252, +-61,-38, +-6,-77, +-169,-83, +-157,38, +78,1, +-25,-16, +73,72, +59,-12, +-239,17, +11,101, +-44,120, +-168,80, +5,36, +-83,-39, +-66,-104, +-153,-45, +55,-22, +-68,34, +111,-73, +-161,70, +-17,-123, +-4,174, +115,127, +99,92, +43,-83, +-140,-101, +-185,36, +-223,160, +26,-193, +70,163, +-93,78, +157,182, +-116,-106, +-203,114, +63,48, +-140,-70, +233,209, +83,-105, +26,102, +146,-107, +-74,-335, +199,-46, +-17,-243, +-239,-193, +76,193, +43,-33, +81,28, +10,-71, +-95,141, +32,79, +-127,-153, +81,-125, +153,141, +-34,-132, +-56,272, +109,44, +118,-92, +180,39, +-96,261, +-220,50, +-8,8, +72,54, +-81,-72, +-46,93, +128,27, +-85,132, +145,-72, +-121,363, +-47,25, +-244,-98, +175,-42, +114,27, +15,-195, +14,-279, +-117,-93, +-41,-77, +17,-76, +5,85, +-68,21, +143,207, +383,11, +0,-239, +-68,151, +-78,59, +136,-61, +69,-8, +-109,89, +76,138, +-126,39, +257,-109, +36,-122, +172,76, +28,-79, +222,-176, +-67,-40, +-27,194, +-116,-25, +250,-34, +-20,106, +98,62, +-115,37, +-141,284, +64,-78, +-37,-200, +-123,47, +28,60, +87,-10, +-36,91, +192,137, +303,60, +89,216, +-4,-133, +-52,196, +3,166, +0,43, +62,-2, +-146,-173, +-158,102, +-227,50, +-10,-204, +31,-170, +87,25, +120,89, +-62,-138, +-224,197, +-98,-48, +-27,-144, +89,-145, +140,94, +-98,-39, +64,-218, +-37,-88, +-17,-170, +9,-105, +27,157, +-181,-4, +-3,-88, +190,-235, +158,145, +-362,7, +-54,-173, +-142,-1, +91,105, +156,-208, +-153,-33, +-187,-83, +-154,10, +-60,-72, +-150,-40, +-60,85, +-24,62, +20,-15, +40,8, +38,140, +-9,-1, +213,-33, +-48,222, +-91,145, +-18,-170, +164,-33, +4,115, +269,104, +97,-17, +75,1, +47,140, +10,-142, +-95,-171, +-166,-196, +-127,-50, +176,-39, +21,-45, +-12,99, +-99,-35, +52,87, +45,173, +133,36, +-16,153, +57,-58, +-45,-167, +-95,-97, +-133,-39, +-88,-121, +-108,-28, +-62,377, +-210,-105, +4,-125, +159,-173, +406,8, +-204,251, +11,99, +135,-17, +56,-66, +136,157, +-147,33, +253,-15, +-44,264, +-95,163, +-23,-18, +-46,87, +33,-98, +-104,179, +-63,49, +190,-83, +190,-107, +116,38, +-43,96, +42,-80, +14,-35, +25,-65, +-119,13, +23,-52, +168,39, +-50,90, +104,18, +-319,40, +252,-132, +-4,113, +-7,-110, +-103,126, +-3,-2, +-80,287, +146,42, +121,61, +109,-10, +-82,122, +46,87, +-171,-233, +-276,-71, +47,-164, +121,40, +-59,-21, +167,-60, +59,49, +239,17, +21,11, +-52,95, +-72,-180, +-175,56, +-109,-15, +195,104, +-41,-129, +178,1, +-71,-54, +50,84, +-55,184, +-5,-79, +-28,41, +55,3, +-35,-158, +-131,3, +-27,20, +-124,-116, +8,134, +102,-159, +64,-59, +-159,151, +10,-64, +-100,72, +17,92, +345,31, +35,78, +168,34, +33,-154, +-114,111, +-124,-42, +129,-197, +12,134, +88,-124, +153,-79, +-15,-61, +16,-294, +-52,-11, +-18,-253, +203,-95, +112,-29, +33,139, +14,170, +80,-123, +-90,-155, +5,-93, +-54,-152, +116,-81, +34,84, +-143,92, +203,-41, +-100,156, +-216,-212, +-7,24, +-91,-26, +20,-121, +43,-122, +-35,-99, +31,-13, +175,-24, +68,104, +-35,5, +-14,-41, +165,-168, +106,188, +-204,-227, +-13,99, +-18,-95, +-226,211, +12,-187, +33,-82, +78,106, +72,-79, +106,-72, +133,-110, +-8,177, +146,-34, +114,-131, +-173,-94, +228,-66, +-70,-152, +69,-122, +129,179, +-92,90, +156,-112, +-27,91, +161,191, +95,-166, +148,-23, +-61,-22, +-96,-202, +-80,29, +-32,-28, +130,-150, +-99,174, +118,31, +25,-123, +110,232, +-27,-126, +227,64, +111,-221, +182,52, +-38,-83, +39,-170, +110,-37, +-273,-197, +262,138, +6,0, +102,2, +4,-260, +-71,-31, +42,-178, +23,-45, +91,-126, +10,14, +-93,-97, +-76,-41, +-144,167, +-83,2, +80,-145, +-75,-82, +-10,-16, +-151,-82, +-123,-80, +-67,-6, +120,-8, +101,-187, +39,-81, +-134,64, +23,48, +-106,-78, +-181,-84, +-44,-73, +16,-144, +-86,-57, +-24,-71, +315,2, +-43,104, +1,-81, +91,-68, +-25,24, +-167,-123, +153,-134, +133,19, +-35,202, +-161,-39, +9,255, +-117,8, +45,-7, +-25,255, +94,-27, +-53,164, +169,-100, +194,-10, +36,148, +-99,376, +-16,20, +68,-42, +-169,-107, +106,206, +-153,22, +-229,12, +-22,302, +-155,-258, +-145,10, +122,35, +-108,205, +-136,192, +-33,-113, +-13,108, +-133,51, +-3,41, +14,199, +-44,-53, +150,-153, +97,-128, +31,106, +-220,-253, +-81,-19, +139,104, +98,-222, +-98,167, +-9,-22, +-90,89, +-64,234, +-100,149, +-290,-117, +-265,8, +-75,56, +-152,260, +-23,33, +124,81, +-256,139, +-221,-161, +72,-169, +146,270, +56,29, +140,72, +58,95, +-176,194, +2,73, +21,-70, +-47,147, +73,145, +-43,138, +-57,-251, +-107,96, +62,-38, +25,114, +-136,91, +-145,319, +238,54, +202,219, +-14,-239, +-31,-137, +275,-235, +212,-94, +-112,-267, +54,7, +208,-1, +-120,-45, +179,-243, +134,-120, +-117,-234, +-165,129, +314,-142, +60,-84, +79,239, +145,204, +-198,-139, +-10,-101, +-54,83, +-26,-97, +75,243, +-13,-36, +187,-206, +-130,12, +-222,7, +251,152, +-157,246, +-225,-11, +161,-50, +-28,22, +72,115, +44,17, +410,-103, +144,-31, +136,-178, +-25,48, +-161,-15, +9,-166, +-217,36, +-52,-127, +63,-125, +-128,171, +110,92, +260,-264, +-63,-105, +139,-30, +22,-27, +150,52, +1,-3, +-208,-134, +-288,-128, +138,172, +-92,59, +135,178, +38,63, +-272,-91, +103,90, +-116,-145, +137,78, +41,-36, +-38,237, +233,21, +-65,-160, +50,173, +13,62, +-71,8, +-303,-1, +-19,-38, +159,-37, +3,101, +107,35, +-176,34, +-110,-77, +125,-249, +-68,-49, +-74,-220, +49,50, +-4,157, +165,68, +2,-85, +77,34, +60,46, +270,116, +-1,31, +40,39, +142,91, +-116,34, +-88,-1, +-121,4, +-2,-56, +28,-113, +-134,-311, +-145,37, +-214,14, +115,143, +71,95, +58,-164, +-45,-31, +-84,176, +63,-24, +-22,-146, +86,328, +-207,-47, +142,99, +-99,-270, +138,-35, +-199,-143, +-23,-87, +-117,-13, +26,-76, +71,167, +-110,99, +9,-84, +-93,-7, +74,-77, +-19,-236, +-21,104, +-165,-67, +104,-62, +107,43, +242,14, +-101,173, +-28,216, +77,-137, +-72,17, +-102,57, +36,-264, +9,48, +-186,-189, +24,-73, +-103,66, +184,-156, +-232,54, +44,-146, +42,-51, +81,-10, +197,-109, +63,-152, +22,-130, +26,84, +106,-66, +134,154, +-17,20, +-43,-4, +52,196, +128,60, +74,80, +-27,-24, +-42,102, +106,-81, +-50,180, +-43,15, +-84,173, +-91,-225, +171,38, +146,145, +-105,70, +-39,110, +71,-40, +218,137, +-179,10, +134,16, +-89,-103, +10,-75, +5,-156, +-179,-34, +111,-128, +-151,-109, +187,150, +-49,-3, +83,134, +225,-116, +83,81, +259,49, +-49,-118, +2,-113, +158,267, +-12,-43, +20,-75, +-45,-28, +92,16, +50,-164, +-20,-20, +47,133, +242,158, +82,-47, +98,-53, +55,-168, +55,-84, +52,-15, +-23,261, +-41,-27, +-42,149, +34,60, +191,-156, +176,-33, +-23,-148, +54,-54, +-93,172, +-17,-30, +197,84, +-106,-69, +-64,120, +34,-54, +41,50, +228,223, +-214,-101, +-152,21, +38,-95, +-29,16, +-34,174, +-126,13, +126,98, +-40,-18, +-141,21, +-172,-121, +204,0, +-102,-170, +-25,19, +54,150, +102,188, +137,-128, +-41,148, +131,76, +14,-147, +40,-15, +-88,-49, +-47,146, +120,38, +39,-38, +50,82, +122,-8, +-86,1, +2,-44, +-93,-139, +-94,93, +11,-2, +-18,-119, +-74,61, +8,8, +-48,-18, +115,-87, +-44,25, +44,228, +126,65, +-49,221, +36,-33, +19,116, +62,79, +35,184, +128,-198, +-63,1, +134,-3, +21,27, +112,-161, +48,69, +62,-59, +-8,101, +43,-30, +64,113, +-105,-116, +-97,42, +-19,-99, +-121,-134, +-28,15, +97,46, +-192,98, +-165,56, +84,-194, +134,40, +77,52, +-74,-98, +50,-20, +175,-78, +37,10, +-257,-41, +-116,-56, +-46,287, +43,33, +63,251, +84,-74, +-23,-69, +-1,-20, +-50,100, +-89,-57, +16,-111, +2,43, +143,-30, +33,-35, +-21,110, +-94,115, +-68,154, +-87,12, +-173,-46, +62,9, +-263,-99, +-98,26, +79,58, +134,65, +-44,142, +-32,88, +98,224, +33,-32, +-117,-35, +-114,-8, +167,36, +46,-4, +171,-90, +75,36, +9,-164, +-19,-32, +51,2, +-96,-51, +129,25, +-43,7, +-49,125, +34,4, +169,-70, +-105,-2, +-55,40, +68,26, +25,-129, +56,41, +-72,171, +15,37, +215,157, +-4,-34, +-298,9, +-94,-194, +27,91, +166,-51, +27,78, +23,35, +-143,198, +46,-58, +-72,-56, +108,35, +-69,-184, +140,-46, +11,-43, +88,-65, +-92,-33, +42,-30, +31,-25, +85,54, +-130,175, +-38,-45, +-106,7, +96,-40, +-16,34, +-65,35, +-72,95, +39,-51, +-1,-86, +-93,-168, +7,-117, +-78,-177, +-43,225, +-7,21, +28,34, +177,-46, +-180,-135, +130,-61, +94,147, +-118,111, +153,-113, +-39,58, +-34,-141, +171,44, +7,-26, +66,-76, +201,84, +5,13, +6,73, +-54,95, +-86,-41, +-114,-7, +34,131, +164,78, +-75,-114, +-31,47, +105,-167, +57,-2, +-20,8, +156,91, +132,-8, +69,-3, +-161,-34, +-52,-15, +69,-16, +178,8, +50,36, +-27,161, +-29,-4, +39,-121, +-153,-16, +31,87, +-109,143, +56,-44, +4,-72, +7,48, +23,-144, +36,-64, +-34,132, +39,-49, +39,-115, +17,0, +-129,90, +-5,-42, +65,37, +-22,13, +-110,-1, +-54,32, +39,34, +-81,-58, +72,68, +212,-155, +-114,1, +-114,-58, +82,21, +48,-49, +91,62, +17,153, +-46,96, +-18,-105, +21,-71, +-70,-29, +30,206, +77,94, +38,2, +-111,47, +38,109, +-166,-57, +31,-26, +50,100, +67,80, +33,-140, +-6,-73, +7,-2, +109,-97, +70,131, +-69,92, +65,52, +-37,113, +-102,12, +108,39, +-159,39, +7,-64, +95,107, +94,-5, +-45,7, +-91,100, +-54,-124, +-27,192, +161,-13, +4,-145, +22,57, +-217,-61, +-83,-80, +-104,25, +-16,24, +46,-71, +69,-59, +-18,42, +28,-30, +-76,45, +52,-147, +70,-28, +87,12, +-32,91, +-23,-56, +-37,32, +-42,-35, +-20,109, +-104,7, +-40,77, +-78,-76, +0,112, +1,-103, +34,-24, +181,-33, +-74,70, +67,54, +-28,125, +-32,-171, +-143,-185, +134,12, +-13,116, +110,47, +110,-36, +11,-28, +-58,99, +-26,15, +72,-71, +-32,-2, +-42,43, +23,88, +41,-80, +81,22, +-55,7, +7,46, +5,-70, +-79,46, +-29,-2, +-77,51, +20,91, +-51,132, +30,-14, +28,30, +-84,-126, +50,-6, +80,125, +147,-46, +28,-58, +92,135, +43,64, +-33,-164, +12,-24, +-69,-123, +0,-11, +32,-94, +44,-66, +147,-36, +38,-35, +-27,46, +12,49, +-9,79, +-52,-67, +-41,-22, +50,-18, +24,-52, +-111,30, +52,43, +22,34, +199,24, +16,13, +93,-153, +-76,-100, +-33,-5, +51,104, +-123,49, +-1,-32, +50,-7, +-59,153, +-18,24, +-40,-137, +75,-52, +74,-3, +-51,2, +-56,-50, +-32,-55, +-58,-40, +41,-51, +-46,5, +89,53, +-37,-3, +59,8, +-49,76, +-14,12, +-60,84, +73,-7, +-83,60, +-23,-8, +4,76, +153,13, +-28,27, +75,-12, +35,30, +140,13, +45,52, +70,13, +-54,-29, +-59,86, +81,-75, +-35,-27, +-36,26, +15,-43, +-2,-36, +-10,-19, +-77,-76, +8,37, +39,11, +-27,41, +41,50, +13,23, +18,6, +87,-48, +-121,-18, +-26,79, +67,-14, +-5,61, +32,11, +24,89, +129,38, +-25,-69, +-44,40, +-67,-4, +9,13, +-52,-149, +40,19, +0,39, +72,-23, +26,-90, +40,68, +-16,-31, +-91,-101, +78,-9, +14,-25, +55,139, +19,-20, +-34,-87, +73,52, +-58,5, +71,26, +22,-12, +1,-48, +-49,58, +-88,55, +4,88, +-7,43, +30,-40, +102,-23, +-8,11, +92,-1, +-78,39, +-85,39, +-24,8, +9,93, +16,65, +117,52, +-31,-14, +-87,15, +16,42, +13,10, +-105,-55, +73,71, +44,19, +-10,0, +-64,40, +27,15, +8,141, +15,39, +-37,34, +102,51, +-13,-43, +-10,85, +-48,-95, +-58,25, +-14,-38, +-78,-27, +-19,53, +-9,-65, +30,46, +8,-4, +57,94, +-29,-49, +76,-35, +66,70, +-42,53, +1,-15, +-38,-50, +113,-25, +-18,11, +40,-2, +-14,24, +34,-30, +-9,25, +71,70, +31,9, +31,-23, +14,14, +7,30, +59,55, +-49,15, +-4,-13, +-67,56, +-54,46, +3,48, +-21,29, +-36,-39, +-46,13, +48,-61, +-73,89, +-2,-82, +8,-33, +-133,9, +42,-3, +-33,-37, +-43,-6, +51,5, +7,-12, +59,5, +69,15, +-45,116, +-23,-21, +46,-25, +-59,-28, +-17,20, +-36,-16, +-34,22, +3,-51, +32,2, +27,4, +17,7, +-37,-13, +-19,-62, +-30,15, +-63,-55, +-1,73, +-90,-48, +116,10, +4,-35, +3,46, +-7,-21, +35,-4, +-1,-14, +-34,-5, +1,59, +54,-2, +38,-33, +-55,-77, +-27,-11, +-81,-16, +-4,5, +8,-14, +-10,-75, +15,17, +26,13, +14,4, +11,38, +22,31, +40,58, +-19,-7, +-8,31, +19,7, +42,46, +0,-18, +-17,-24, +-80,17, +-12,-9, +-44,-13, +-8,-22, +48,-30, +-2,59, +-6,17, +5,-20, +-13,-44, +-6,-55, +50,26, +1,-6, +-7,17, +-3,5, +38,49, +44,-17, +-52,5, +36,57, +-35,-82, +4,14, +22,-12, +14,-10, +51,59, +13,-43, +-13,-28, +-45,-54, +11,-11, +4,32, +-8,44, +8,-33, +-48,50, +-43,27, +18,14, +30,11, +-22,-22, +-20,-9, +-18,-12, +-8,-54, +-16,7, +-3,-12, +-5,1, +-43,77, +3,43, +-4,47, +19,-22, +18,38, +-29,-8, +17,-27, +37,-12, +29,-4, +22,14, +-26,-51, +-24,10, +5,61, +5,-45, +34,12, +-22,24, +-10,-64, +-13,15, +23,11, +49,-6, +-12,48, +-20,27, +-5,-13, +6,-32, +-70,40, +-12,4, +-17,9, +-1,15, +-7,15, +-20,-12, +-53,25, +-3,52, +-52,-2, +-11,-12, +1,47, +51,24, +9,-12, +45,-28, +0,5, +9,9, +-11,-12, +2,-22, +-23,14, +53,-8, +11,1, +-14,9, +15,-14, +30,-12, +9,3, +1,17, +32,12, +-1,19, +4,10, +-22,-34, +-2,-22, +32,1, +5,6, +5,-16, +46,-22, +-26,-21, +-12,-38, +34,-20, +14,1, +3,-9, +29,-15, +-22,7, +7,1, +1,13, +-11,0, +-8,-26, +-9,-8, +2,31, +-28,-3, +5,1, +11,9, +9,-11, +8,-9, +-1,3, +6,-7, +2,-17, +25,5, +11,-6, +-23,-5, +11,-7, +-5,-16, +18,-10, +4,-7, +0,-10, +14,9, +-20,-9, +9,1, +26,-2, +13,-3, +-8,16, +7,11, +-6,0, +15,-4, +5,12, +4,-9, +4,0, +5,-3, +13,-7, +-3,-7, +10,14, +-8,3, +-10,-7, +5,-1, +-3,5, +-7,-4, +6,5, +2,6, +-8,5, +0,-6, +-3,0, +-9,-1, +2,-7, +-3,-3, +-4,-1, +8,-1, +-4,-2, +-9,6, +4,2, +0,-2, +-7,-3, +3,-2, +-1,-3, +-6,2, +2,-1, +-1,-1, +-2,-2, +5,-2, +-3,0, +-4,0, +5,0, +-4,1, +-3,0, +4,0, +-3,0, +-3,0, +6,0, +-3,0, +-3,0, +4,0, +-3,0, +-4,-1, +5,0, +-4,0, +-3,0, +5,2, +-2,2, +-1,1, +2,1, +-6,-2, +-1,3, +3,2, +-7,3, +0,2, +4,-2, +-9,-6, +-4,2, +8,1, +-4,1, +-3,3, +2,7, +-9,1, +-3,0, +0,6, +-8,-5, +2,-6, +6,-5, +-7,4, +-3,-5, +5,1, +-10,7, +-8,-3, +10,-14, +-3,7, +13,7, +5,3, +4,0, +4,9, +5,-12, +15,4, +-6,0, +7,-11, +-8,-16, +13,3, +26,2, +9,-1, +-20,9, +14,-9, +0,10, +4,7, +18,10, +-5,16, +11,7, +-23,5, +11,6, +25,-5, +2,17, +6,7, +-1,-3, +8,9, +9,11, +11,-9, +5,-1, +-28,3, +2,-31, +-9,8, +-8,26, +-11,0, +1,-13, +7,-1, +-22,-7, +29,15, +3,9, +14,-1, +34,20, +-12,38, +-26,21, +46,22, +5,16, +5,-6, +32,-1, +-2,22, +-22,34, +4,-10, +-1,-19, +32,-12, +1,-17, +9,-3, +30,12, +15,14, +-14,-9, +11,-1, +53,8, +-23,-14, +2,22, +-11,12, +9,-9, +0,-5, +45,28, +9,12, +51,-24, +1,-47, +-11,12, +-52,2, +-3,-52, +-53,-25, +-20,12, +-7,-15, +-1,-15, +-17,-9, +-12,-4, +-70,-40, +6,32, +-5,13, +-20,-27, +-12,-48, +49,6, +23,-11, +-13,-15, +-10,64, +-22,-24, +34,-12, +5,45, +5,-61, +-24,-10, +-26,51, +22,-14, +29,4, +37,12, +17,27, +-29,8, +18,-38, +19,22, +-4,-47, +3,-43, +-43,-77, +-5,-1, +-3,12, +-16,-7, +-8,54, +-18,12, +-20,9, +-22,22, +30,-11, +18,-14, +-43,-27, +-48,-50, +8,33, +-8,-44, +4,-32, +11,11, +-45,54, +-13,28, +13,43, +51,-59, +14,10, +22,12, +4,-14, +-35,82, +36,-57, +-52,-5, +44,17, +38,-49, +-3,-5, +-7,-17, +1,6, +50,-26, +-6,55, +-13,44, +5,20, +-6,-17, +-2,-59, +48,30, +-8,22, +-44,13, +-12,9, +-80,-17, +-17,24, +0,18, +42,-46, +19,-7, +-8,-31, +-19,7, +40,-58, +22,-31, +11,-38, +14,-4, +26,-13, +15,-17, +-10,75, +8,14, +-4,-5, +-81,16, +-27,11, +-55,77, +38,33, +54,2, +1,-59, +-34,5, +-1,14, +35,4, +-7,21, +3,-46, +4,35, +116,-10, +-90,48, +-1,-73, +-63,55, +-30,-15, +-19,62, +-37,13, +17,-7, +27,-4, +32,-2, +3,51, +-34,-22, +-36,16, +-17,-20, +-59,28, +46,25, +-23,21, +-45,-116, +69,-15, +59,-5, +7,12, +51,-5, +-43,6, +-33,37, +42,3, +-133,-9, +8,33, +-2,82, +-73,-89, +48,61, +-46,-13, +-36,39, +-21,-29, +3,-48, +-54,-46, +-67,-56, +-4,13, +-49,-15, +59,-55, +7,-30, +14,-14, +31,23, +31,-9, +71,-70, +-9,-25, +34,30, +-14,-24, +40,2, +-18,-11, +113,25, +-38,50, +1,15, +-42,-53, +66,-70, +76,35, +-29,49, +57,-94, +8,4, +30,-46, +-9,65, +-19,-53, +-78,27, +-14,38, +-58,-25, +-48,95, +-10,-85, +-13,43, +102,-51, +-37,-34, +15,-39, +8,-141, +27,-15, +-64,-40, +-10,0, +44,-19, +73,-71, +-105,55, +13,-10, +16,-42, +-87,-15, +-31,14, +117,-52, +16,-65, +9,-93, +-24,-8, +-85,-39, +-78,-39, +92,1, +-8,-11, +102,23, +30,40, +-7,-43, +4,-88, +-88,-55, +-49,-58, +1,48, +22,12, +71,-26, +-58,-5, +73,-52, +-34,87, +19,20, +55,-139, +14,25, +78,9, +-91,101, +-16,31, +40,-68, +26,90, +72,23, +0,-39, +40,-19, +-52,149, +9,-13, +-67,4, +-44,-40, +-25,69, +129,-38, +24,-89, +32,-11, +-5,-61, +67,14, +-26,-79, +-121,18, +87,48, +18,-6, +13,-23, +41,-50, +-27,-41, +39,-11, +8,-37, +-77,76, +-10,19, +-2,36, +15,43, +-36,-26, +-35,27, +81,75, +-59,-86, +-54,29, +70,-13, +45,-52, +140,-13, +35,-30, +75,12, +-28,-27, +153,-13, +4,-76, +-23,8, +-83,-60, +73,7, +-60,-84, +-14,-12, +-49,-76, +59,-8, +-37,3, +89,-53, +-46,-5, +41,51, +-58,40, +-32,55, +-56,50, +-51,-2, +74,3, +75,52, +-40,137, +-18,-24, +-59,-153, +50,7, +-1,32, +-123,-49, +51,-104, +-33,5, +-76,100, +93,153, +16,-13, +199,-24, +22,-34, +52,-43, +-111,-30, +24,52, +50,18, +-41,22, +-52,67, +-9,-79, +12,-49, +-27,-46, +38,35, +147,36, +44,66, +32,94, +0,11, +-69,123, +12,24, +-33,164, +43,-64, +92,-135, +28,58, +147,46, +80,-125, +50,6, +-84,126, +28,-30, +30,14, +-51,-132, +20,-91, +-77,-51, +-29,2, +-79,-46, +5,70, +7,-46, +-55,-7, +81,-22, +41,80, +23,-88, +-42,-43, +-32,2, +72,71, +-26,-15, +-58,-99, +11,28, +110,36, +110,-47, +-13,-116, +134,-12, +-143,185, +-32,171, +-28,-125, +67,-54, +-74,-70, +181,33, +34,24, +1,103, +0,-112, +-78,76, +-40,-77, +-104,-7, +-20,-109, +-42,35, +-37,-32, +-23,56, +-32,-91, +87,-12, +70,28, +52,147, +-76,-45, +28,30, +-18,-42, +69,59, +46,71, +-16,-24, +-104,-25, +-83,80, +-217,61, +22,-57, +4,145, +161,13, +-27,-192, +-54,124, +-91,-100, +-45,-7, +94,5, +95,-107, +7,64, +-159,-39, +108,-39, +-102,-12, +-37,-113, +65,-52, +-69,-92, +70,-131, +109,97, +7,2, +-6,73, +33,140, +67,-80, +50,-100, +31,26, +-166,57, +38,-109, +-111,-47, +38,-2, +77,-94, +30,-206, +-70,29, +21,71, +-18,105, +-46,-96, +17,-153, +91,-62, +48,49, +82,-21, +-114,58, +-114,-1, +212,155, +72,-68, +-81,58, +39,-34, +-54,-32, +-110,1, +-22,-13, +65,-37, +-5,42, +-129,-90, +17,0, +39,115, +39,49, +-34,-132, +36,64, +23,144, +7,-48, +4,72, +56,44, +-109,-143, +31,-87, +-153,16, +39,121, +-29,4, +-27,-161, +50,-36, +178,-8, +69,16, +-52,15, +-161,34, +69,3, +132,8, +156,-91, +-20,-8, +57,2, +105,167, +-31,-47, +-75,114, +164,-78, +34,-131, +-114,7, +-86,41, +-54,-95, +6,-73, +5,-13, +201,-84, +66,76, +7,26, +171,-44, +-34,141, +-39,-58, +153,113, +-118,-111, +94,-147, +130,61, +-180,135, +177,46, +28,-34, +-7,-21, +-43,-225, +-78,177, +7,117, +-93,168, +-1,86, +39,51, +-72,-95, +-65,-35, +-16,-34, +96,40, +-106,-7, +-38,45, +-130,-175, +85,-54, +31,25, +42,30, +-92,33, +88,65, +11,43, +140,46, +-69,184, +108,-35, +-72,56, +46,58, +-143,-198, +23,-35, +27,-78, +166,51, +27,-91, +-94,194, +-298,-9, +-4,34, +215,-157, +15,-37, +-72,-171, +56,-41, +25,129, +68,-26, +-55,-40, +-105,2, +169,70, +34,-4, +-49,-125, +-43,-7, +129,-25, +-96,51, +51,-2, +-19,32, +9,164, +75,-36, +171,90, +46,4, +167,-36, +-114,8, +-117,35, +33,32, +98,-224, +-32,-88, +-44,-142, +134,-65, +79,-58, +-98,-26, +-263,99, +62,-9, +-173,46, +-87,-12, +-68,-154, +-94,-115, +-21,-110, +33,35, +143,30, +2,-43, +16,111, +-89,57, +-50,-100, +-1,20, +-23,69, +84,74, +63,-251, +43,-33, +-46,-287, +-116,56, +-257,41, +37,-10, +175,78, +50,20, +-74,98, +77,-52, +134,-40, +84,194, +-165,-56, +-192,-98, +97,-46, +-28,-15, +-121,134, +-19,99, +-97,-42, +-105,116, +64,-113, +43,30, +-8,-101, +62,59, +48,-69, +112,161, +21,-27, +134,3, +-63,-1, +128,198, +35,-184, +62,-79, +19,-116, +36,33, +-49,-221, +126,-65, +44,-228, +-44,-25, +115,87, +-48,18, +8,-8, +-74,-61, +-18,119, +11,2, +-94,-93, +-93,139, +2,44, +-86,-1, +122,8, +50,-82, +39,38, +120,-38, +-47,-146, +-88,49, +40,15, +14,147, +131,-76, +-41,-148, +137,128, +102,-188, +54,-150, +-25,-19, +-102,170, +204,0, +-172,121, +-141,-21, +-40,18, +126,-98, +-126,-13, +-34,-174, +-29,-16, +38,95, +-152,-21, +-214,101, +228,-223, +41,-50, +34,54, +-64,-120, +-106,69, +197,-84, +-17,30, +-93,-172, +54,54, +-23,148, +176,33, +191,156, +34,-60, +-42,-149, +-41,27, +-23,-261, +52,15, +55,84, +55,168, +98,53, +82,47, +242,-158, +47,-133, +-20,20, +50,164, +92,-16, +-45,28, +20,75, +-12,43, +158,-267, +2,113, +-49,118, +259,-49, +83,-81, +225,116, +83,-134, +-49,3, +187,-150, +-151,109, +111,128, +-179,34, +5,156, +10,75, +-89,103, +134,-16, +-179,-10, +218,-137, +71,40, +-39,-110, +-105,-70, +146,-145, +171,-38, +-91,225, +-84,-173, +-43,-15, +-50,-180, +106,81, +-42,-102, +-27,24, +74,-80, +128,-60, +52,-196, +-43,4, +-17,-20, +134,-154, +106,66, +26,-84, +22,130, +63,152, +197,109, +81,10, +42,51, +44,146, +-232,-54, +184,156, +-103,-66, +24,73, +-186,189, +9,-48, +36,264, +-102,-57, +-72,-17, +77,137, +-28,-216, +-101,-173, +242,-14, +107,-43, +104,62, +-165,67, +-21,-104, +-19,236, +74,77, +-93,7, +9,84, +-110,-99, +71,-167, +26,76, +-117,13, +-23,87, +-199,143, +138,35, +-99,270, +142,-99, +-207,47, +86,-328, +-22,146, +63,24, +-84,-176, +-45,31, +58,164, +71,-95, +115,-143, +-214,-14, +-145,-37, +-134,311, +28,113, +-2,56, +-121,-4, +-88,1, +-116,-34, +142,-91, +40,-39, +-1,-31, +270,-116, +60,-46, +77,-34, +2,85, +165,-68, +-4,-157, +49,-50, +-74,220, +-68,49, +125,249, +-110,77, +-176,-34, +107,-35, +3,-101, +159,37, +-19,38, +-303,1, +-71,-8, +13,-62, +50,-173, +-65,160, +233,-21, +-38,-237, +41,36, +137,-78, +-116,145, +103,-90, +-272,91, +38,-63, +135,-178, +-92,-59, +138,-172, +-288,128, +-208,134, +1,3, +150,-52, +22,27, +139,30, +-63,105, +260,264, +110,-92, +-128,-171, +63,125, +-52,127, +-217,-36, +9,166, +-161,15, +-25,-48, +136,178, +144,31, +410,103, +44,-17, +72,-115, +-28,-22, +161,50, +-225,11, +-157,-246, +251,-152, +-222,-7, +-130,-12, +187,206, +-13,36, +75,-243, +-26,97, +-54,-83, +-10,101, +-198,139, +145,-204, +79,-239, +60,84, +314,142, +-165,-129, +-117,234, +134,120, +179,243, +-120,45, +208,1, +54,-7, +-112,267, +212,94, +275,235, +-31,137, +-14,239, +202,-219, +238,-54, +-145,-319, +-136,-91, +25,-114, +62,38, +-107,-96, +-57,251, +-43,-138, +73,-145, +-47,-147, +21,70, +2,-73, +-176,-194, +58,-95, +140,-72, +56,-29, +146,-270, +72,169, +-221,161, +-256,-139, +124,-81, +-23,-33, +-152,-260, +-75,-56, +-265,-8, +-290,117, +-100,-149, +-64,-234, +-90,-89, +-9,22, +-98,-167, +98,222, +139,-104, +-81,19, +-220,253, +31,-106, +97,128, +150,153, +-44,53, +14,-199, +-3,-41, +-133,-51, +-13,-108, +-33,113, +-136,-192, +-108,-205, +122,-35, +-145,-10, +-155,258, +-22,-302, +-229,-12, +-153,-22, +106,-206, +-169,107, +68,42, +-16,-20, +-99,-376, +36,-148, +194,10, +169,100, +-53,-164, +94,27, +-25,-255, +45,7, +-117,-8, +9,-255, +-161,39, +-35,-202, +133,-19, +153,134, +-167,123, +-25,-24, +91,68, +1,81, +-43,-104, +315,-2, +-24,71, +-86,57, +16,144, +-44,73, +-181,84, +-106,78, +23,-48, +-134,-64, +39,81, +101,187, +120,8, +-67,6, +-123,80, +-151,82, +-10,16, +-75,82, +80,145, +-83,-2, +-144,-167, +-76,41, +-93,97, +10,-14, +91,126, +23,45, +42,178, +-71,31, +4,260, +102,-2, +11,0, +314,158, +-96,-184, +-360,123, +-152,-59, +19,-161, +-98,-130, +34,1, +-21,-101, +41,-78, +112,7, +-105,-47, +-10,15, +70,167, +82,9, +68,123, +-117,-41, +-47,36, +-59,180, +66,-171, +-141,-12, +76,244, +129,140, +321,-187, +24,105, +-173,140, +-42,4, +-103,-33, +158,135, +-92,10, +6,-109, +-138,8, +40,-80, +9,146, +178,-34, +-251,43, +261,-253, +-218,-132, +-18,-17, +133,-42, +-31,303, +-73,138, +-154,264, +-103,-33, +-3,91, +-218,187, +-42,-78, +-248,130, +-15,63, +53,-112, +21,55, +87,45, +130,115, +12,-30, +-152,42, +80,-132, +18,30, +126,19, +102,-152, +277,13, +-59,-143, +-208,124, +-228,-52, +15,-172, +6,122, +178,189, +112,57, +52,-176, +-152,38, +-92,168, +-90,-163, +67,-119, +99,158, +15,150, +-41,106, +-366,-50, +-172,69, +-140,-15, +-114,-94, +52,135, +35,7, +-17,-82, +-122,21, +-194,171, +21,-37, +12,14, +-32,-178, +-159,220, +-153,-51, +87,20, +7,-34, +-65,77, +-26,-34, +3,-45, +-153,41, +116,-230, +170,17, +-49,-70, +-175,169, +74,-59, +-38,-35, +-82,44, +93,-70, +274,52, +-35,112, +114,-128, +0,112, +-72,36, +125,142, +-171,231, +91,16, +340,-76, +-97,106, +198,-86, +174,-15, +366,160, +-27,-187, +129,34, +24,178, +-29,15, +188,47, +-236,138, +-53,98, +237,-154, +-44,-91, +-58,4, +-15,48, +9,191, +113,-180, +52,-80, +-100,-8, +118,132, +-96,129, +-100,-9, +330,137, +118,36, +-104,97, +-183,-169, +127,-231, +-116,42, +143,-12, +271,-174, +183,51, +16,-6, +-103,-321, +4,-33, +-23,210, +-11,-53, +-152,-23, +-4,-16, +-129,-29, +238,79, +-34,130, +-85,-258, +-144,-133, +5,102, +-108,-51, +-97,-124, +-32,5, +-75,181, +-48,294, +178,174, +130,186, +-11,-11, +-14,2, +52,-187, +126,-52, +-42,20, +166,121, +104,-18, +-6,-59, +7,10, +38,151, +-125,48, +-28,185, +-35,141, +-136,-79, +91,87, +-5,-60, +-239,199, +273,48, +176,185, +-29,-53, +414,-255, +-154,-87, +77,37, +-76,-91, +-123,-132, +-146,-122, +43,-134, +-204,-32, +288,-221, +104,30, +122,-66, +0,-65, +-36,28, +80,169, +-84,-39, +-125,80, +-183,79, +131,-16, +38,-38, +-118,-120, +290,158, +-96,-17, +-105,184, +135,-219, +-61,51, +185,-16, +-243,-16, +144,-30, +105,-180, +140,-74, +20,-136, +-9,95, +0,5, +261,88, +128,53, +-281,58, +-43,-106, +-56,143, +84,-71, +41,-34, +21,74, +64,-74, +72,-26, +-24,-91, +108,198, +195,-53, +13,93, +88,79, +-80,71, +-49,-23, +90,51, +-127,78, +71,152, +9,147, +89,34, +121,8, +134,-8, +-84,-80, +-210,-193, +185,89, +92,-43, +109,44, +53,128, +-54,-7, +-158,-109, +5,54, +14,-40, +-137,2, +95,182, +-24,46, +33,136, +166,-92, +26,-1, +-139,7, +19,-176, +-81,72, +179,-46, +237,-19, +-10,76, +52,247, +7,70, +-32,70, +242,68, +-132,43, +53,70, +-115,-2, +68,297, +77,-66, +22,-68, +-88,-17, +-209,63, +-95,-56, +-3,40, +-38,75, +157,-8, +-18,-35, +-63,-139, +-67,161, +1,217, +-13,-11, +74,-49, +-67,-13, +113,66, +-155,-9, +0,-95, +-82,-74, +51,-232, +85,192, +-105,198, +46,29, +-76,93, +30,41, +-25,-80, +40,-49, +-12,-159, +113,114, +1,-148, +-131,78, +-95,-84, +-18,143, +120,-13, +-97,-158, +-77,-77, +70,144, +-51,-59, +120,103, +-124,23, +65,-7, +-70,65, +-20,204, +-92,-58, +87,42, +67,-128, +169,170, +-172,-46, +120,-8, +-59,176, +12,9, +-94,4, +-15,64, +-157,-69, +-162,145, +36,-85, +137,29, +-98,71, +104,182, +105,146, +85,113, +29,98, +3,154, +-35,203, +82,49, +-5,31, +-39,-94, +-32,126, +-85,-178, +-57,-206, +-329,53, +-32,-71, +-67,-15, +94,84, +96,-6, +-106,100, +-18,115, +-147,54, +32,-72, +-10,-150, +142,103, +-108,-71, +-81,66, +-26,-43, +-126,24, +-219,99, +82,9, +3,45, +110,71, +74,94, +118,109, +162,-137, +-170,30, +-25,0, +-161,-91, +-144,-194, +121,189, +-166,184, +131,-92, +-38,-31, +9,-37, +15,11, +-14,-135, +-6,-81, +-24,-61, +-6,-151, +126,185, +4,-193, +110,-56, +15,43, +95,11, +83,104, +38,-106, +191,-29, +173,35, +28,-12, +143,-109, +-19,142, +23,161, +73,-106, +7,-124, +-7,72, +114,194, +-45,64, +136,-112, +-16,-156, +-31,-69, +145,-57, +12,-128, +-88,-115, +92,-114, +-83,75, +92,-60, +35,-57, +-45,130, +-41,-48, +-133,-59, +-65,-51, +-32,13, +-55,-133, +-91,5, +-16,-66, +-2,62, +208,44, +-2,-154, +-14,-77, +-43,194, +-146,-51, +-141,-75, +226,79, +-88,162, +10,-14, +-43,223, +45,-12, +-35,-4, +-46,-69, +45,22, +-165,-15, +-104,186, +-52,41, +99,-48, +29,-69, +-68,156, +66,-1, +-3,-219, +10,-101, +104,-100, +-10,-44, +-29,-106, +-189,54, +226,-21, +115,23, +-93,49, +-58,-25, +-64,-136, +-104,-64, +-157,257, +-173,-109, +27,50, +38,4, +31,-30, +8,21, +-70,209, +-5,-38, +-96,-71, +293,12, +128,55, +78,15, +-106,57, +168,125, +50,9, +-131,-38, +-60,168, +-131,9, +-66,169, +91,145, +31,40, +-46,95, +55,37, +46,-45, +-29,-165, +65,181, +-146,99, +34,-121, +-1,17, +235,-49, +14,-72, +-111,88, +5,-43, +-4,2, +-207,7, +-2,-53, +30,-13, +7,-58, +-48,-90, +-109,113, +-165,76, +119,65, +-96,-59, +69,-63, +-147,64, +13,75, +232,-249, +76,9, +139,-183, +-58,102, +-67,-25, +117,-7, +85,-86, +83,186, +-198,38, +-11,124, +-35,66, +-62,-128, +129,163, +57,39, +1,36, +-63,47, +55,177, +-164,-29, +-76,-175, +6,-188, +73,152, +-39,41, +-313,-202, +40,-13, +176,-56, +36,-3, +-19,-39, +187,117, +-48,36, +57,18, +-14,-45, +65,-97, +188,-31, +3,-97, +59,219, +-103,43, +66,-65, +-42,5, +44,23, +-260,209, +12,94, +-78,60, +83,-58, +2,-146, +-116,186, +47,-129, +174,-27, +-40,-104, +19,-98, +-58,30, +-92,84, +47,-120, +-24,-72, +-66,-58, +92,-12, +-40,-59, +-24,14, +8,125, +-86,163, +-26,-168, +79,46, +89,-56, +-27,16, +-159,51, +120,19, +38,-23, +40,35, +155,55, +82,-44, +104,-90, +30,-109, +68,-50, +-45,23, +95,85, +107,45, +-51,-110, +67,281, +53,104, +-148,30, +59,-99, +120,26, +30,-54, +-33,37, +58,79, +-88,-63, +94,-62, +27,-161, +74,-110, +-155,9, +-39,-100, +83,-66, +-20,143, +14,77, +2,-13, +-20,-165, +-119,109, +3,19, +-139,4, +-145,58, +4,-31, +92,9, +0,11, +-112,38, +117,28, +68,-150, +42,-65, +-21,-21, +-4,17, +-91,-62, +121,22, +26,52, +103,-146, +60,118, +84,9, +-81,-11, +16,-133, +71,-41, +-1,-16, +-123,50, +4,58, +64,106, +-14,-92, +-91,-38, +19,-23, +-77,-53, +0,-44, +-55,-52, +-1,-105, +23,29, +33,30, +-64,-29, +-9,96, +37,-82, +-184,8, +-58,40, +3,9, +-112,49, +-83,7, +-46,-22, +-6,127, +148,-40, +92,25, +-153,48, +-33,-3, +132,13, +30,64, +-17,-17, +-19,107, +5,94, +-23,85, +-3,88, +-53,21, +119,43, +-1,76, +-123,-15, +45,84, +-68,19, +41,35, +-102,-27, +-57,-19, +-39,24, +-62,-17, +51,-10, +-86,61, +-19,-72, +119,86, +75,-91, +-56,-3, +-121,-79, +52,-129, +-31,48, +-24,-26, +-4,124, +117,80, +25,-28, +-6,112, +69,-35, +8,-90, +16,-87, +32,-12, +-58,-68, +64,-19, +-31,16, +-19,77, +-89,-71, +47,5, +91,-97, +0,6, +65,23, +10,39, +-27,29, +29,-127, +-51,-65, +-79,-142, +-67,21, +-28,-37, +69,-48, +-80,45, +76,1, +109,3, +72,2, +65,10, +64,37, +76,98, +95,-9, +67,19, +-42,20, +40,44, +-27,-88, +64,-90, +-31,-20, +9,-8, +56,-70, +18,73, +41,-58, +5,33, +-22,-22, +92,119, +-127,-6, +61,-18, +80,-40, +25,16, +-6,-52, +54,49, +-25,-55, +54,68, +13,-16, +-14,-35, +-84,-13, +6,3, +27,46, +43,-82, +-79,-61, +60,26, +-72,16, +25,32, +-87,-9, +-23,14, +43,-24, +5,25, +41,-56, +106,24, +35,-4, +-26,22, +-118,9, +8,-81, +-14,24, +5,-45, +37,53, +-62,-25, +14,22, +107,-1, +42,-36, +-18,-41, +-61,35, +26,5, +28,44, +1,-31, +3,-52, +0,-60, +19,-68, +-65,17, +28,51, +46,-6, +94,8, +-46,-67, +50,66, +47,-28, +-19,82, +78,-15, +80,-39, +37,87, +-17,48, +18,46, +-41,60, +8,-90, +-52,-15, +-2,35, +23,19, +-38,29, +104,35, +30,-45, +-4,14, +20,-14, +-17,-22, +-24,-30, +0,-35, +41,18, +12,34, +17,80, +-22,0, +-14,-14, +-74,-62, +12,40, +10,79, +0,3, +60,29, +63,-11, +22,14, +15,-37, +10,25, +-3,-15, +62,-36, +0,85, +24,28, +12,25, +43,39, +-86,-12, +28,21, +11,38, +-36,-7, +25,8, +-6,49, +11,-100, +-17,-35, +49,27, +2,69, +30,34, +1,-29, +-9,19, +-71,37, +-12,63, +-47,-16, +2,24, +30,-70, +-56,104, +22,-31, +-32,-37, +72,45, +-11,-16, +12,48, +-50,-10, +12,0, +36,9, +-10,-90, +31,-7, +21,22, +20,-1, +-22,-20, +-6,39, +-31,82, +-6,-20, +-68,63, +-7,-72, +-35,-28, +-60,-9, +-7,-28, +9,-49, +-40,101, +-58,-38, +-15,83, +28,61, +61,-8, +-6,23, +49,-36, +-35,-5, +19,19, +26,-42, +35,-21, +46,8, +9,-25, +20,8, +-17,13, +-9,18, +26,26, +27,31, +-45,-13, +-18,41, +-22,-4, +16,-20, +25,51, +73,37, +46,-14, +58,-15, +9,-7, +-53,-31, +7,-15, +23,-10, +-50,-20, +-36,-44, +12,30, +25,4, +-8,28, +4,-51, +-23,-3, +9,-15, +36,-3, +-11,-5, +-58,-6, +-14,-18, +13,52, +-30,70, +-12,-2, +11,18, +-43,-9, +-42,-14, +14,-43, +31,52, +-8,35, +34,4, +5,-17, +26,-8, +21,22, +-51,-14, +1,15, +10,31, +25,-22, +-3,-25, +-20,34, +-23,5, +9,-7, +40,-3, +-9,-26, +16,38, +33,4, +-14,-13, +0,45, +-3,22, +10,66, +-3,-5, +-9,31, +10,16, +0,29, +25,-2, +38,-31, +11,31, +-12,-5, +21,-16, +-13,44, +11,10, +10,20, +-20,-1, +5,-11, +7,-1, +-11,-3, +32,-26, +-32,29, +-11,22, +-8,-22, +2,-13, +-8,16, +6,-22, +10,2, +-21,18, +23,-21, +-2,-31, +8,7, +-27,2, +17,-14, +10,0, +5,-31, +-8,-7, +2,24, +7,-13, +4,-9, +-13,-4, +6,-41, +10,-25, +-9,-14, +32,6, +16,7, +-22,9, +-6,-6, +11,-21, +3,-1, +-12,-6, +-1,16, +26,17, +4,5, +-10,-10, +-6,-6, +2,-32, +8,0, +-24,23, +5,15, +-2,-4, +-8,21, +5,-8, +-9,-8, +3,5, +6,7, +10,3, +-8,9, +3,0, +2,-8, +0,-1, +11,-22, +-1,-1, +8,-6, +9,-6, +-1,-9, +26,-7, +6,3, +4,2, +-4,-1, +-7,0, +-10,-12, +-7,18, +12,-14, +-5,9, +4,5, +-2,-9, +-6,-6, +1,12, +6,-10, +-2,4, +-2,-1, +10,-11, +-1,2, +-3,13, +4,4, +8,-3, +-2,6, +-1,-7, +0,1, +4,3, +0,-7, +-2,0, +5,9, +1,-4, +0,-2, +1,6, +-1,-6, +-2,1, +0,6, +0,-7, +-1,0, +-1,5, +0,-6, +-1,-1, +0,5, +0,-5, +0,0, +0,5, +0,-5, +-1,1, +0,6, +-1,-5, +-1,0, +0,7, +0,-6, +-2,-1, +-1,6, +1,-6, +0,2, +1,4, +5,-9, +-2,0, +0,7, +4,-3, +0,-1, +-1,7, +-2,-6, +8,3, +4,-4, +-3,-13, +-1,-2, +10,11, +-2,1, +-2,-4, +6,10, +1,-12, +-6,6, +-2,9, +4,-5, +-5,-9, +12,14, +-7,-18, +-10,12, +-7,0, +-4,1, +4,-2, +6,-3, +26,7, +-1,9, +9,6, +8,6, +-1,1, +11,22, +0,1, +2,8, +3,0, +-8,-9, +10,-3, +6,-7, +3,-5, +-9,8, +5,8, +-8,-21, +-2,4, +5,-15, +-24,-23, +8,0, +2,32, +-6,6, +-10,10, +4,-5, +26,-17, +-1,-16, +-12,6, +3,1, +11,21, +-6,6, +-22,-9, +16,-7, +32,-6, +-9,14, +10,25, +6,41, +-13,4, +4,9, +7,13, +2,-24, +-8,7, +5,31, +10,0, +17,14, +-27,-2, +8,-7, +-2,31, +23,21, +-21,-18, +10,-2, +6,22, +-8,-16, +2,13, +-8,22, +-11,-22, +-32,-29, +32,26, +-11,3, +7,1, +5,11, +-20,1, +10,-20, +11,-10, +-13,-44, +21,16, +-12,5, +11,-31, +38,31, +25,2, +0,-29, +10,-16, +-9,-31, +-3,5, +10,-66, +-3,-22, +0,-45, +-14,13, +33,-4, +16,-38, +-9,26, +40,3, +9,7, +-23,-5, +-20,-34, +-3,25, +25,22, +10,-31, +1,-15, +-51,14, +21,-22, +26,8, +5,17, +34,-4, +-8,-35, +31,-52, +14,43, +-42,14, +-43,9, +11,-18, +-12,2, +-30,-70, +13,-52, +-14,18, +-58,6, +-11,5, +36,3, +9,15, +-23,3, +4,51, +-8,-28, +25,-4, +12,-30, +-36,44, +-50,20, +23,10, +7,15, +-53,31, +9,7, +58,15, +46,14, +73,-37, +25,-51, +16,20, +-22,4, +-18,-41, +-45,13, +27,-31, +26,-26, +-9,-18, +-17,-13, +20,-8, +9,25, +46,-8, +35,21, +26,42, +19,-19, +-35,5, +49,36, +-6,-23, +61,8, +28,-61, +-15,-83, +-58,38, +-40,-101, +9,49, +-7,28, +-60,9, +-35,28, +-7,72, +-68,-63, +-6,20, +-31,-82, +-6,-39, +-22,20, +20,1, +21,-22, +31,7, +-10,90, +36,-9, +12,0, +-50,10, +12,-48, +-11,16, +72,-45, +-32,37, +22,31, +-56,-104, +30,70, +2,-24, +-47,16, +-12,-63, +-71,-37, +-9,-19, +1,29, +30,-34, +2,-69, +49,-27, +-17,35, +11,100, +-6,-49, +25,-8, +-36,7, +11,-38, +28,-21, +-86,12, +43,-39, +12,-25, +24,-28, +0,-85, +62,36, +-3,15, +10,-25, +15,37, +22,-14, +63,11, +60,-29, +0,-3, +10,-79, +12,-40, +-74,62, +-14,14, +-22,0, +17,-80, +12,-34, +41,-18, +0,35, +-24,30, +-17,22, +20,14, +-4,-14, +30,45, +104,-35, +-38,-29, +23,-19, +-2,-35, +-52,15, +8,90, +-41,-60, +18,-46, +-17,-48, +37,-87, +80,39, +78,15, +-19,-82, +47,28, +50,-66, +-46,67, +94,-8, +46,6, +28,-51, +-65,-17, +19,68, +0,60, +3,52, +1,31, +28,-44, +26,-5, +-61,-35, +-18,41, +42,36, +107,1, +14,-22, +-62,25, +37,-53, +5,45, +-14,-24, +8,81, +-118,-9, +-26,-22, +35,4, +106,-24, +41,56, +5,-25, +43,24, +-23,-14, +-87,9, +25,-32, +-72,-16, +60,-26, +-79,61, +43,82, +27,-46, +6,-3, +-84,13, +-14,35, +13,16, +54,-68, +-25,55, +54,-49, +-6,52, +25,-16, +80,40, +61,18, +-127,6, +92,-119, +-22,22, +5,-33, +41,58, +18,-73, +56,70, +9,8, +-31,20, +64,90, +-27,88, +40,-44, +-42,-20, +67,-19, +95,9, +76,-98, +64,-37, +65,-10, +72,-2, +109,-3, +76,-1, +-80,-45, +69,48, +-28,37, +-67,-21, +-79,142, +-51,65, +29,127, +-27,-29, +10,-39, +65,-23, +0,-6, +91,97, +47,-5, +-89,71, +-19,-77, +-31,-16, +64,19, +-58,68, +32,12, +16,87, +8,90, +69,35, +-6,-112, +25,28, +117,-80, +-4,-124, +-24,26, +-31,-48, +52,129, +-121,79, +-56,3, +75,91, +119,-86, +-19,72, +-86,-61, +51,10, +-62,17, +-39,-24, +-57,19, +-102,27, +41,-35, +-68,-19, +45,-84, +-123,15, +-1,-76, +119,-43, +-53,-21, +-3,-88, +-23,-85, +5,-94, +-19,-107, +-17,17, +30,-64, +132,-13, +-33,3, +-153,-48, +92,-25, +148,40, +-6,-127, +-46,22, +-83,-7, +-112,-49, +3,-9, +-58,-40, +-184,-8, +37,82, +-9,-96, +-64,29, +33,-30, +23,-29, +-1,105, +-55,52, +0,44, +-77,53, +19,23, +-91,38, +-14,92, +64,-106, +4,-58, +-123,-50, +-1,16, +71,41, +16,133, +-81,11, +84,-9, +60,-118, +103,146, +26,-52, +121,-22, +-91,62, +-4,-17, +-21,21, +42,65, +68,150, +117,-28, +-112,-38, +0,-11, +92,-9, +4,31, +-145,-58, +-139,-4, +3,-19, +-119,-109, +-20,165, +2,13, +14,-77, +-20,-143, +83,66, +-39,100, +-155,-9, +74,110, +27,161, +94,62, +-88,63, +58,-79, +-33,-37, +30,54, +120,-26, +59,99, +-148,-30, +53,-104, +67,-281, +-51,110, +107,-45, +95,-85, +-45,-23, +68,50, +30,109, +104,90, +82,44, +155,-55, +40,-35, +38,23, +120,-19, +-159,-51, +-27,-16, +89,56, +79,-46, +-26,168, +-86,-163, +8,-125, +-24,-14, +-40,59, +92,12, +-66,58, +-24,72, +47,120, +-92,-84, +-58,-30, +19,98, +-40,104, +174,27, +47,129, +-116,-186, +2,146, +83,58, +-78,-60, +12,-94, +-260,-209, +44,-23, +-42,-5, +66,65, +-103,-43, +59,-219, +3,97, +188,31, +65,97, +-14,45, +57,-18, +-48,-36, +187,-117, +-19,39, +36,3, +176,56, +40,13, +-313,202, +-39,-41, +73,-152, +6,188, +-76,175, +-164,29, +55,-177, +-63,-47, +1,-36, +57,-39, +129,-163, +-62,128, +-35,-66, +-11,-124, +-198,-38, +83,-186, +85,86, +117,7, +-67,25, +-58,-102, +139,183, +76,-9, +232,249, +13,-75, +-147,-64, +69,63, +-96,59, +119,-65, +-165,-76, +-109,-113, +-48,90, +7,58, +30,13, +-2,53, +-207,-7, +-4,-2, +5,43, +-111,-88, +14,72, +235,49, +-1,-17, +34,121, +-146,-99, +65,-181, +-29,165, +46,45, +55,-37, +-46,-95, +31,-40, +91,-145, +-66,-169, +-131,-9, +-60,-168, +-131,38, +50,-9, +168,-125, +-106,-57, +78,-15, +128,-55, +293,-12, +-96,71, +-5,38, +-70,-209, +8,-21, +31,30, +38,-4, +27,-50, +-173,109, +-157,-257, +-104,64, +-64,136, +-58,25, +-93,-49, +115,-23, +226,21, +-189,-54, +-29,106, +-10,44, +104,100, +10,101, +-3,219, +66,1, +-68,-156, +29,69, +99,48, +-52,-41, +-104,-186, +-165,15, +45,-22, +-46,69, +-35,4, +45,12, +-43,-223, +10,14, +-88,-162, +226,-79, +-141,75, +-146,51, +-43,-194, +-14,77, +-2,154, +208,-44, +-2,-62, +-16,66, +-91,-5, +-55,133, +-32,-13, +-65,51, +-133,59, +-41,48, +-45,-130, +35,57, +92,60, +-83,-75, +92,114, +-88,115, +12,128, +145,57, +-31,69, +-16,156, +136,112, +-45,-64, +114,-194, +-7,-72, +7,124, +73,106, +23,-161, +-19,-142, +143,109, +28,12, +173,-35, +191,29, +38,106, +83,-104, +95,-11, +15,-43, +110,56, +4,193, +126,-185, +-6,151, +-24,61, +-6,81, +-14,135, +15,-11, +9,37, +-38,31, +131,92, +-166,-184, +121,-189, +-144,194, +-161,91, +-25,0, +-170,-30, +162,137, +118,-109, +74,-94, +110,-71, +3,-45, +82,-9, +-219,-99, +-126,-24, +-26,43, +-81,-66, +-108,71, +142,-103, +-10,150, +32,72, +-147,-54, +-18,-115, +-106,-100, +96,6, +94,-84, +-67,15, +-32,71, +-329,-53, +-57,206, +-85,178, +-32,-126, +-39,94, +-5,-31, +82,-49, +-35,-203, +3,-154, +29,-98, +85,-113, +105,-146, +104,-182, +-98,-71, +137,-29, +36,85, +-162,-145, +-157,69, +-15,-64, +-94,-4, +12,-9, +-59,-176, +120,8, +-172,46, +169,-170, +67,128, +87,-42, +-92,58, +-20,-204, +-70,-65, +65,7, +-124,-23, +120,-103, +-51,59, +70,-144, +-77,77, +-97,158, +120,13, +-18,-143, +-95,84, +-131,-78, +1,148, +113,-114, +-12,159, +40,49, +-25,80, +30,-41, +-76,-93, +46,-29, +-105,-198, +85,-192, +51,232, +-82,74, +0,95, +-155,9, +113,-66, +-67,13, +74,49, +-13,11, +1,-217, +-67,-161, +-63,139, +-18,35, +157,8, +-38,-75, +-3,-40, +-95,56, +-209,-63, +-88,17, +22,68, +77,66, +68,-297, +-115,2, +53,-70, +-132,-43, +242,-68, +-32,-70, +7,-70, +52,-247, +-10,-76, +237,19, +179,46, +-81,-72, +19,176, +-139,-7, +26,1, +166,92, +33,-136, +-24,-46, +95,-182, +-137,-2, +14,40, +5,-54, +-158,109, +-54,7, +53,-128, +109,-44, +92,43, +185,-89, +-210,193, +-84,80, +134,8, +121,-8, +89,-34, +9,-147, +71,-152, +-127,-78, +90,-51, +-49,23, +-80,-71, +88,-79, +13,-93, +195,53, +108,-198, +-24,91, +72,26, +64,74, +21,-74, +41,34, +84,71, +-56,-143, +-43,106, +-281,-58, +128,-53, +261,-88, +0,-5, +-9,-95, +20,136, +140,74, +105,180, +144,30, +-243,16, +185,16, +-61,-51, +135,219, +-105,-184, +-96,17, +290,-158, +-118,120, +38,38, +131,16, +-183,-79, +-125,-80, +-84,39, +80,-169, +-36,-28, +0,65, +122,66, +104,-30, +288,221, +-204,32, +43,134, +-146,122, +-123,132, +-76,91, +77,-37, +-154,87, +414,255, +-29,53, +176,-185, +273,-48, +-239,-199, +-5,60, +91,-87, +-136,79, +-35,-141, +-28,-185, +-125,-48, +38,-151, +7,-10, +-6,59, +104,18, +166,-121, +-42,-20, +126,52, +52,187, +-14,-2, +-11,11, +130,-186, +178,-174, +-48,-294, +-75,-181, +-32,-5, +-97,124, +-108,51, +5,-102, +-144,133, +-85,258, +-34,-130, +238,-79, +-129,29, +-4,16, +-152,23, +-11,53, +-23,-210, +4,33, +-103,321, +16,6, +183,-51, +271,174, +143,12, +-116,-42, +127,231, +-183,169, +-104,-97, +118,-36, +330,-137, +-100,9, +-96,-129, +118,-132, +-100,8, +52,80, +113,180, +9,-191, +-15,-48, +-58,-4, +-44,91, +237,154, +-53,-98, +-236,-138, +188,-47, +-29,-15, +24,-178, +129,-34, +-27,187, +366,-160, +174,15, +198,86, +-97,-106, +340,76, +91,-16, +-171,-231, +125,-142, +-72,-36, +0,-112, +114,128, +-35,-112, +274,-52, +93,70, +-82,-44, +-38,35, +74,59, +-175,-169, +-49,70, +170,-17, +116,230, +-153,-41, +3,45, +-26,34, +-65,-77, +7,34, +87,-20, +-153,51, +-159,-220, +-32,178, +12,-14, +21,37, +-194,-171, +-122,-21, +-17,82, +35,-7, +52,-135, +-114,94, +-140,15, +-172,-69, +-366,50, +-41,-106, +15,-150, +99,-158, +67,119, +-90,163, +-92,-168, +-152,-38, +52,176, +112,-57, +178,-189, +6,-122, +15,172, +-228,52, +-208,-124, +-59,143, +277,-13, +102,152, +126,-19, +18,-30, +80,132, +-152,-42, +12,30, +130,-115, +87,-45, +21,-55, +53,112, +-15,-63, +-248,-130, +-42,78, +-218,-187, +-3,-91, +-103,33, +-154,-264, +-73,-138, +-31,-303, +133,42, +-18,17, +-218,132, +261,253, +-251,-43, +178,34, +9,-146, +40,80, +-138,-8, +6,109, +-92,-10, +158,-135, +-103,33, +-42,-4, +-173,-140, +24,-105, +321,187, +129,-140, +76,-244, +-141,12, +66,171, +-59,-180, +-47,-36, +-117,41, +68,-123, +82,-9, +70,-167, +-10,-15, +-105,47, +112,-7, +41,78, +-21,101, +34,-1, +-98,130, +19,161, +-152,59, +-360,-123, +-96,184, +314,-158, +0,0, +-72,177, +-110,96, +-33,-151, +-40,-151, +86,-20, +52,107, +-86,33, +89,152, +-21,26, +-71,-46, +-24,-18, +-18,-79, +19,5, +-156,-74, +66,-186, +333,253, +-212,-42, +-57,-63, +17,93, +19,55, +159,237, +-158,42, +25,142, +-147,162, +167,55, +256,-26, +-45,-42, +73,-213, +79,-118, +-254,-98, +-117,344, +-65,163, +-67,-119, +-212,30, +-191,57, +10,9, +159,72, +-192,-21, +-104,57, +-133,29, +-70,275, +57,-87, +91,-41, +130,38, +58,246, +-32,11, +143,8, +-19,-6, +23,143, +104,165, +48,-13, +146,34, +-229,100, +-56,-91, +-164,-157, +190,37, +-180,132, +108,18, +-77,50, +180,-1, +334,-43, +-9,-150, +90,154, +55,-35, +-14,-98, +97,112, +31,-164, +-45,-86, +101,154, +-153,-36, +-71,-75, +-175,20, +111,-222, +39,172, +-50,65, +-78,-22, +-104,47, +-142,-17, +79,-49, +-69,-227, +45,52, +19,-55, +300,219, +210,-338, +274,147, +14,68, +-65,34, +-153,122, +-261,-119, +136,-168, +-90,61, +-36,-43, +203,-69, +-167,-39, +-69,152, +66,93, +-79,135, +-78,-11, +3,27, +-8,77, +38,-170, +-70,-22, +-120,9, +-106,155, +-293,-84, +-148,129, +66,-15, +81,183, +-152,-3, +9,-53, +33,6, +-172,31, +-83,221, +31,-98, +222,-171, +198,106, +-13,243, +23,-95, +121,199, +66,2, +61,-108, +-40,-60, +141,187, +-90,-16, +318,211, +-128,42, +159,89, +-98,-90, +106,-156, +-111,29, +15,-27, +-21,103, +142,-36, +71,-61, +-54,-44, +206,93, +251,82, +-132,25, +89,9, +-98,-14, +50,-32, +129,23, +218,179, +-106,20, +64,-132, +117,-184, +-57,58, +-7,94, +48,-88, +-108,194, +176,40, +-178,104, +108,-22, +-37,174, +-113,67, +-48,-36, +70,-176, +85,-18, +17,41, +19,-117, +-228,120, +90,-75, +131,91, +9,94, +112,-120, +-2,57, +-11,-51, +79,61, +31,50, +100,39, +-314,29, +0,55, +-34,-150, +-116,65, +-12,23, +72,232, +-56,12, +-48,33, +-146,107, +22,-8, +28,95, +297,79, +-33,14, +29,92, +63,-158, +44,20, +-109,-191, +17,43, +93,-117, +95,-61, +3,-87, +-56,-10, +-203,46, +49,-47, +-16,-39, +250,265, +213,139, +328,63, +200,113, +-45,-32, +-185,76, +-160,28, +-154,105, +-186,42, +-161,200, +-75,158, +65,-154, +-31,38, +148,146, +-46,-195, +338,313, +54,7, +-155,191, +-56,44, +0,-22, +-191,131, +63,-59, +-48,94, +112,16, +66,-41, +-28,-349, +8,120, +59,-117, +-183,-84, +86,87, +-81,6, +208,-102, +-89,-27, +46,121, +484,99, +-111,-128, +-23,-91, +111,-16, +-19,175, +47,-85, +-19,25, +-78,136, +40,-103, +114,87, +99,101, +-59,-225, +114,68, +69,23, +-58,100, +104,31, +-164,77, +210,124, +-81,-41, +-180,78, +-116,106, +150,119, +19,286, +-162,124, +-20,-89, +153,149, +-8,14, +-97,132, +-59,127, +-3,126, +-4,59, +-114,-145, +25,86, +10,-158, +-134,-161, +96,97, +64,-12, +-9,-217, +-24,-153, +84,-170, +-123,9, +-48,53, +35,109, +71,87, +-34,-3, +-123,131, +-220,74, +-39,-29, +-139,-84, +58,-22, +136,-153, +8,9, +341,65, +-2,-134, +-208,63, +-52,74, +88,-129, +85,-318, +-207,-71, +-130,-59, +-52,-81, +57,24, +126,-32, +-42,203, +-68,171, +-154,-271, +-151,172, +28,-69, +-2,235, +-57,107, +179,-138, +-8,-155, +-133,228, +-31,62, +9,-124, +-18,133, +47,-51, +-148,-126, +119,-85, +165,69, +51,-33, +73,7, +31,-25, +-118,-18, +10,-205, +209,-330, +71,100, +-110,-230, +-225,82, +-20,60, +-3,-35, +-80,90, +-280,-121, +29,-110, +-127,69, +105,-255, +-222,-59, +-130,24, +-61,-81, +-87,-72, +10,59, +157,2, +-81,166, +-53,-44, +-104,-22, +173,62, +-84,-2, +-129,120, +116,226, +40,-31, +-26,-72, +-87,67, +-123,166, +-80,227, +-75,-63, +128,-33, +35,-161, +-53,1, +-190,-60, +-89,-23, +217,-103, +76,-101, +89,-329, +-161,27, +156,50, +-96,-163, +-110,107, +27,149, +110,1, +72,56, +70,126, +239,110, +41,-246, +151,-9, +-102,23, +180,-16, +86,74, +117,-41, +-24,50, +59,52, +18,145, +149,106, +4,145, +-36,23, +118,-54, +-104,180, +98,-65, +-252,-55, +-30,-195, +28,-13, +46,43, +33,95, +1,-104, +-21,-71, +-1,291, +9,-53, +81,95, +60,160, +67,152, +111,28, +145,33, +-133,-34, +-280,-16, +253,310, +30,5, +174,-124, +-58,182, +-130,-24, +-20,-160, +23,139, +15,187, +-95,-90, +48,-164, +-29,248, +-64,87, +-30,15, +-22,-125, +-51,-83, +-70,41, +118,212, +-42,75, +77,1, +108,-202, +-87,81, +-113,-39, +-59,27, +44,-24, +-57,17, +124,-89, +18,-62, +-2,-75, +48,-105, +-37,-81, +105,-32, +-70,-6, +91,47, +-8,84, +112,-13, +63,-44, +12,54, +94,-36, +-64,99, +20,-294, +-60,-101, +-35,63, +-22,79, +101,-1, +-37,131, +-1,6, +-88,-135, +129,-130, +-31,-68, +120,-20, +-162,-116, +81,7, +-79,38, +-155,29, +-32,29, +37,-13, +125,55, +63,-90, +94,118, +-48,79, +81,-52, +98,29, +-9,60, +49,43, +12,75, +120,-28, +-56,-191, +19,-54, +-22,-96, +-51,117, +-114,-19, +287,-20, +-20,63, +-51,-14, +153,143, +-62,-95, +-3,-79, +-92,26, +25,-104, +88,-78, +2,10, +17,89, +55,-52, +-68,128, +-32,-99, +25,-119, +46,83, +86,81, +-109,77, +-48,75, +-60,-206, +53,-102, +-36,45, +20,69, +-6,-31, +-79,30, +-64,28, +83,-109, +-25,-30, +48,125, +-25,34, +-25,198, +-47,-25, +-12,72, +-52,55, +-79,86, +153,-1, +-170,-37, +-6,-57, +190,-181, +22,15, +-52,35, +-11,40, +27,98, +-138,16, +50,58, +-165,-64, +109,-102, +116,16, +124,56, +-67,196, +-28,-31, +-72,41, +-29,-170, +159,25, +-16,-45, +52,3, +122,-72, +-108,78, +-90,129, +-79,-23, +-43,-34, +-3,-56, +94,110, +76,-136, +-35,-35, +156,38, +-8,-97, +168,16, +71,14, +-44,36, +-77,-12, +24,23, +18,-109, +-30,-21, +73,42, +57,-13, +-168,-34, +-67,63, +-39,-151, +99,-28, +134,35, +-16,78, +-73,-7, +-17,-26, +-37,-17, +106,-23, +-11,66, +34,16, +-77,6, +-55,82, +-38,-48, +-37,-157, +-33,162, +-12,-31, +156,-27, +-65,123, +1,25, +67,98, +-42,-147, +65,1, +-159,15, +-102,-1, +-33,-7, +38,144, +66,-64, +45,32, +-8,108, +6,8, +45,23, +51,26, +39,99, +-90,47, +86,94, +-1,-79, +-8,-115, +77,-7, +-25,-64, +-75,49, +-47,-97, +-2,148, +-152,-31, +-103,28, +57,-79, +24,39, +55,20, +54,31, +42,-65, +-121,-7, +-95,-43, +-124,32, +160,-17, +-56,76, +-43,35, +54,36, +20,94, +26,-57, +38,74, +-48,-35, +-81,65, +-39,-20, +-70,7, +-81,58, +-2,9, +-42,52, +10,-45, +-7,5, +43,-109, +-76,-48, +18,71, +-133,43, +113,18, +160,0, +10,46, +-78,-108, +-22,4, +-79,8, +141,-97, +116,21, +-57,12, +-135,-50, +200,-26, +68,79, +-146,-81, +65,-65, +50,18, +-65,-28, +51,226, +128,-26, +65,-56, +-61,-138, +26,71, +31,134, +81,-1, +157,55, +-31,61, +101,2, +54,-15, +47,11, +-91,-14, +23,12, +98,54, +-79,18, +-60,-85, +-116,-19, +58,-135, +11,125, +46,-51, +-15,10, +72,48, +117,14, +41,85, +76,-10, +-10,17, +25,30, +-9,132, +30,-5, +15,78, +-60,-46, +-54,140, +-45,71, +170,83, +-11,28, +-9,71, +144,21, +-5,-91, +-46,1, +21,-11, +-28,45, +-112,-96, +-158,166, +19,62, +-64,-39, +-7,-92, +-28,-62, +-43,53, +-100,39, +62,3, +41,-99, +152,-31, +34,-56, +-81,-50, +42,84, +85,10, +70,-54, +37,-14, +-13,18, +1,46, +25,-134, +-8,36, +107,42, +-25,13, +-49,-29, +3,-52, +-11,-87, +-80,-46, +-22,-77, +-93,95, +11,-133, +-34,-55, +-61,-80, +90,3, +8,-20, +-56,-83, +72,-115, +-155,85, +-33,98, +-140,-19, +-64,-27, +70,5, +-50,14, +-11,63, +53,75, +-39,15, +-119,16, +66,-69, +-18,40, +-29,16, +59,-59, +55,-41, +-33,24, +-79,17, +57,45, +63,-28, +104,-15, +-118,-20, +62,-104, +-22,-56, +83,41, +81,3, +-85,46, +-5,2, +11,-111, +-103,-52, +-100,5, +-73,71, +35,-52, +7,-87, +-10,35, +-24,67, +20,121, +-31,-23, +-78,31, +15,16, +-26,-130, +17,-20, +67,-67, +25,-50, +-12,60, +86,34, +34,-83, +-56,12, +1,4, +-115,-13, +-94,2, +30,54, +5,-20, +-63,6, +-32,-22, +-29,-13, +13,4, +-36,-42, +83,5, +65,-5, +0,-61, +87,2, +-18,67, +12,-6, +47,-82, +86,25, +84,55, +28,-49, +14,-88, +24,30, +5,-30, +60,69, +12,-65, +4,23, +79,38, +-64,7, +-5,11, +-2,17, +16,64, +23,-10, +-12,-10, +29,1, +10,-28, +-14,52, +67,14, +-67,-51, +-51,67, +47,51, +52,97, +-32,-22, +-26,-21, +22,110, +-6,-96, +-16,12, +5,-1, +-66,-11, +3,11, +-104,22, +37,6, +32,47, +-2,-53, +-15,-6, +69,-24, +-17,-27, +6,-38, +147,32, +-65,53, +59,81, +10,-49, +-18,57, +1,-2, +22,-30, +60,-42, +39,-60, +5,-58, +36,-45, +-9,-57, +30,-22, +0,70, +30,94, +67,87, +37,35, +27,58, +-26,-50, +-1,-15, +18,-36, +-29,1, +-44,31, +12,36, +-43,-12, +1,-15, +-54,2, +15,29, +-28,-14, +37,32, +23,29, +-2,65, +36,-39, +6,-11, +6,-32, +33,-4, +19,14, +56,-3, +-30,-30, +1,-1, +-16,-31, +22,-26, +12,-47, +6,72, +11,-10, +18,-12, +-38,38, +22,-13, +-2,24, +6,44, +35,-14, +-35,-12, +20,-32, +-8,22, +-14,19, +-20,15, +-30,-13, +32,-25, +27,3, +18,-15, +-12,30, +56,-43, +-1,41, +16,-13, +3,-18, +12,19, +-26,12, +-52,-3, +23,17, +30,9, +8,51, +-7,-2, +-1,2, +-2,-26, +8,29, +19,12, +12,48, +1,17, +-22,-18, +2,36, +7,25, +17,-45, +-23,21, +-7,-8, +-23,9, +-4,-20, +51,55, +-8,-30, +35,57, +16,-12, +-4,2, +-30,9, +24,24, +-1,4, +23,12, +15,10, +30,12, +-29,53, +-18,18, +26,-47, +31,-2, +-25,3, +2,-20, +13,2, +-4,0, +40,6, +-15,-16, +10,-41, +9,-40, +19,4, +-27,-14, +0,-16, +-7,27, +7,-11, +11,-27, +1,17, +29,-5, +15,-25, +-3,15, +-17,-8, +9,6, +-9,9, +-14,-21, +-9,-1, +-3,-35, +21,-15, +15,19, +-17,18, +15,43, +-34,23, +38,20, +-14,-14, +-23,10, +-11,-5, +12,-7, +-13,-18, +6,-7, +19,-6, +-11,5, +11,7, +-21,-4, +-7,-32, +12,10, +0,-9, +-6,2, +-3,9, +-10,-1, +4,6, +-2,8, +-1,-3, +7,16, +-20,18, +6,20, +6,4, +-1,-15, +11,17, +7,-16, +-18,11, +-6,-21, +10,-7, +0,-1, +2,18, +12,-3, +10,3, +2,8, +-4,-5, +7,10, +9,1, +12,2, +-12,15, +3,-1, +9,-7, +11,-1, +-6,-14, +7,-5, +-1,4, +1,5, +7,-14, +-3,-10, +-3,-2, +9,-4, +11,-9, +3,-3, +-13,-5, +-3,6, +-5,4, +-1,0, +4,12, +5,0, +4,-14, +5,10, +1,-3, +8,-1, +-1,7, +-2,-7, +4,-4, +-1,7, +1,4, +-4,-8, +-1,2, +1,3, +-2,-7, +0,3, +1,2, +0,-6, +2,5, +0,0, +0,-5, +-1,5, +-1,0, +0,-5, +0,5, +0,0, +0,-5, +0,5, +-1,0, +-1,-5, +0,5, +0,0, +2,-5, +0,6, +1,-2, +0,-3, +-2,7, +1,-3, +-1,-2, +-4,8, +1,-4, +-1,-7, +4,4, +-2,7, +-1,-7, +8,1, +1,3, +5,-10, +4,14, +5,0, +4,-12, +-1,0, +-5,-4, +-3,-6, +-13,5, +3,3, +11,9, +9,4, +-3,2, +-3,10, +7,14, +1,-5, +-1,-4, +7,5, +-6,14, +11,1, +9,7, +3,1, +-12,-15, +12,-2, +9,-1, +7,-10, +-4,5, +2,-8, +10,-3, +12,3, +2,-18, +0,1, +10,7, +-6,21, +-18,-11, +7,16, +11,-17, +-1,15, +6,-4, +6,-20, +-20,-18, +7,-16, +-1,3, +-2,-8, +4,-6, +-10,1, +-3,-9, +-6,-2, +0,9, +12,-10, +-7,32, +-21,4, +11,-7, +-11,-5, +19,6, +6,7, +-13,18, +12,7, +-11,5, +-23,-10, +-14,14, +38,-20, +-34,-23, +15,-43, +-17,-18, +15,-19, +21,15, +-3,35, +-9,1, +-14,21, +-9,-9, +9,-6, +-17,8, +-3,-15, +15,25, +29,5, +1,-17, +11,27, +7,11, +-7,-27, +0,16, +-27,14, +19,-4, +9,40, +10,41, +-15,16, +40,-6, +-4,0, +13,-2, +2,20, +-25,-3, +31,2, +26,47, +-18,-18, +-29,-53, +30,-12, +15,-10, +23,-12, +-1,-4, +24,-24, +-30,-9, +-4,-2, +16,12, +35,-57, +-8,30, +51,-55, +-4,20, +-23,-9, +-7,8, +-23,-21, +17,45, +7,-25, +2,-36, +-22,18, +1,-17, +12,-48, +19,-12, +8,-29, +-2,26, +-1,-2, +-7,2, +8,-51, +30,-9, +23,-17, +-52,3, +-26,-12, +12,-19, +3,18, +16,13, +-1,-41, +56,43, +-12,-30, +18,15, +27,-3, +32,25, +-30,13, +-20,-15, +-14,-19, +-8,-22, +20,32, +-35,12, +35,14, +6,-44, +-2,-24, +22,13, +-38,-38, +18,12, +11,10, +6,-72, +12,47, +22,26, +-16,31, +1,1, +-30,30, +56,3, +19,-14, +33,4, +6,32, +6,11, +36,39, +-2,-65, +23,-29, +37,-32, +-28,14, +15,-29, +-54,-2, +1,15, +-43,12, +12,-36, +-44,-31, +-29,-1, +18,36, +-1,15, +-26,50, +27,-58, +37,-35, +67,-87, +30,-94, +0,-70, +30,22, +-9,57, +36,45, +5,58, +39,60, +60,42, +22,30, +1,2, +-18,-57, +10,49, +59,-81, +-65,-53, +147,-32, +6,38, +-17,27, +69,24, +-15,6, +-2,53, +32,-47, +37,-6, +-104,-22, +3,-11, +-66,11, +5,1, +-16,-12, +-6,96, +22,-110, +-26,21, +-32,22, +52,-97, +47,-51, +-51,-67, +-67,51, +67,-14, +-14,-52, +10,28, +29,-1, +-12,10, +23,10, +16,-64, +-2,-17, +-5,-11, +-64,-7, +79,-38, +4,-23, +12,65, +60,-69, +5,30, +24,-30, +14,88, +28,49, +84,-55, +86,-25, +47,82, +12,6, +-18,-67, +87,-2, +0,61, +65,5, +83,-5, +-36,42, +13,-4, +-29,13, +-32,22, +-63,-6, +5,20, +30,-54, +-94,-2, +-115,13, +1,-4, +-56,-12, +34,83, +86,-34, +-12,-60, +25,50, +67,67, +17,20, +-26,130, +15,-16, +-78,-31, +-31,23, +20,-121, +-24,-67, +-10,-35, +7,87, +35,52, +-73,-71, +-100,-5, +-103,52, +11,111, +-5,-2, +-85,-46, +81,-3, +83,-41, +-22,56, +62,104, +-118,20, +104,15, +63,28, +57,-45, +-79,-17, +-33,-24, +55,41, +59,59, +-29,-16, +-18,-40, +66,69, +-119,-16, +-39,-15, +53,-75, +-11,-63, +-50,-14, +70,-5, +-64,27, +-140,19, +-33,-98, +-155,-85, +72,115, +-56,83, +8,20, +90,-3, +-61,80, +-34,55, +11,133, +-93,-95, +-22,77, +-80,46, +-11,87, +3,52, +-49,29, +-25,-13, +107,-42, +-8,-36, +25,134, +1,-46, +-13,-18, +37,14, +70,54, +85,-10, +42,-84, +-81,50, +34,56, +152,31, +41,99, +62,-3, +-100,-39, +-43,-53, +-28,62, +-7,92, +-64,39, +19,-62, +-158,-166, +-112,96, +-28,-45, +21,11, +-46,-1, +-5,91, +144,-21, +-9,-71, +-11,-28, +170,-83, +-45,-71, +-54,-140, +-60,46, +15,-78, +30,5, +-9,-132, +25,-30, +-10,-17, +76,10, +41,-85, +117,-14, +72,-48, +-15,-10, +46,51, +11,-125, +58,135, +-116,19, +-60,85, +-79,-18, +98,-54, +23,-12, +-91,14, +47,-11, +54,15, +101,-2, +-31,-61, +157,-55, +81,1, +31,-134, +26,-71, +-61,138, +65,56, +128,26, +51,-226, +-65,28, +50,-18, +65,65, +-146,81, +68,-79, +200,26, +-135,50, +-57,-12, +116,-21, +141,97, +-79,-8, +-22,-4, +-78,108, +10,-46, +160,0, +113,-18, +-133,-43, +18,-71, +-76,48, +43,109, +-7,-5, +10,45, +-42,-52, +-2,-9, +-81,-58, +-70,-7, +-39,20, +-81,-65, +-48,35, +38,-74, +26,57, +20,-94, +54,-36, +-43,-35, +-56,-76, +160,17, +-124,-32, +-95,43, +-121,7, +42,65, +54,-31, +55,-20, +24,-39, +57,79, +-103,-28, +-152,31, +-2,-148, +-47,97, +-75,-49, +-25,64, +77,7, +-8,115, +-1,79, +86,-94, +-90,-47, +39,-99, +51,-26, +45,-23, +6,-8, +-8,-108, +45,-32, +66,64, +38,-144, +-33,7, +-102,1, +-159,-15, +65,-1, +-42,147, +67,-98, +1,-25, +-65,-123, +156,27, +-12,31, +-33,-162, +-37,157, +-38,48, +-55,-82, +-77,-6, +34,-16, +-11,-66, +106,23, +-37,17, +-17,26, +-73,7, +-16,-78, +134,-35, +99,28, +-39,151, +-67,-63, +-168,34, +57,13, +73,-42, +-30,21, +18,109, +24,-23, +-77,12, +-44,-36, +71,-14, +168,-16, +-8,97, +156,-38, +-35,35, +76,136, +94,-110, +-3,56, +-43,34, +-79,23, +-90,-129, +-108,-78, +122,72, +52,-3, +-16,45, +159,-25, +-29,170, +-72,-41, +-28,31, +-67,-196, +124,-56, +116,-16, +109,102, +-165,64, +50,-58, +-138,-16, +27,-98, +-11,-40, +-52,-35, +22,-15, +190,181, +-6,57, +-170,37, +153,1, +-79,-86, +-52,-55, +-12,-72, +-47,25, +-25,-198, +-25,-34, +48,-125, +-25,30, +83,109, +-64,-28, +-79,-30, +-6,31, +20,-69, +-36,-45, +53,102, +-60,206, +-48,-75, +-109,-77, +86,-81, +46,-83, +25,119, +-32,99, +-68,-128, +55,52, +17,-89, +2,-10, +88,78, +25,104, +-92,-26, +-3,79, +-62,95, +153,-143, +-51,14, +-20,-63, +287,20, +-114,19, +-51,-117, +-22,96, +19,54, +-56,191, +120,28, +12,-75, +49,-43, +-9,-60, +98,-29, +81,52, +-48,-79, +94,-118, +63,90, +125,-55, +37,13, +-32,-29, +-155,-29, +-79,-38, +81,-7, +-162,116, +120,20, +-31,68, +129,130, +-88,135, +-1,-6, +-37,-131, +101,1, +-22,-79, +-35,-63, +-60,101, +20,294, +-64,-99, +94,36, +12,-54, +63,44, +112,13, +-8,-84, +91,-47, +-70,6, +105,32, +-37,81, +48,105, +-2,75, +18,62, +124,89, +-57,-17, +44,24, +-59,-27, +-113,39, +-87,-81, +108,202, +77,-1, +-42,-75, +118,-212, +-70,-41, +-51,83, +-22,125, +-30,-15, +-64,-87, +-29,-248, +48,164, +-95,90, +15,-187, +23,-139, +-20,160, +-130,24, +-58,-182, +174,124, +30,-5, +253,-310, +-280,16, +-133,34, +145,-33, +111,-28, +67,-152, +60,-160, +81,-95, +9,53, +-1,-291, +-21,71, +1,104, +33,-95, +46,-43, +28,13, +-30,195, +-252,55, +98,65, +-104,-180, +118,54, +-36,-23, +4,-145, +149,-106, +18,-145, +59,-52, +-24,-50, +117,41, +86,-74, +180,16, +-102,-23, +151,9, +41,246, +239,-110, +70,-126, +72,-56, +110,-1, +27,-149, +-110,-107, +-96,163, +156,-50, +-161,-27, +89,329, +76,101, +217,103, +-89,23, +-190,60, +-53,-1, +35,161, +128,33, +-75,63, +-80,-227, +-123,-166, +-87,-67, +-26,72, +40,31, +116,-226, +-129,-120, +-84,2, +173,-62, +-104,22, +-53,44, +-81,-166, +157,-2, +10,-59, +-87,72, +-61,81, +-130,-24, +-222,59, +105,255, +-127,-69, +29,110, +-280,121, +-80,-90, +-3,35, +-20,-60, +-225,-82, +-110,230, +71,-100, +209,330, +10,205, +-118,18, +31,25, +73,-7, +51,33, +165,-69, +119,85, +-148,126, +47,51, +-18,-133, +9,124, +-31,-62, +-133,-228, +-8,155, +179,138, +-57,-107, +-2,-235, +28,69, +-151,-172, +-154,271, +-68,-171, +-42,-203, +126,32, +57,-24, +-52,81, +-130,59, +-207,71, +85,318, +88,129, +-52,-74, +-208,-63, +-2,134, +341,-65, +8,-9, +136,153, +58,22, +-139,84, +-39,29, +-220,-74, +-123,-131, +-34,3, +71,-87, +35,-109, +-48,-53, +-123,-9, +84,170, +-24,153, +-9,217, +64,12, +96,-97, +-134,161, +10,158, +25,-86, +-114,145, +-4,-59, +-3,-126, +-59,-127, +-97,-132, +-8,-14, +153,-149, +-20,89, +-162,-124, +19,-286, +150,-119, +-116,-106, +-180,-78, +-81,41, +210,-124, +-164,-77, +104,-31, +-58,-100, +69,-23, +114,-68, +-59,225, +99,-101, +114,-87, +40,103, +-78,-136, +-19,-25, +47,85, +-19,-175, +111,16, +-23,91, +-111,128, +484,-99, +46,-121, +-89,27, +208,102, +-81,-6, +86,-87, +-183,84, +59,117, +8,-120, +-28,349, +66,41, +112,-16, +-48,-94, +63,59, +-191,-131, +0,22, +-56,-44, +-155,-191, +54,-7, +338,-313, +-46,195, +148,-146, +-31,-38, +65,154, +-75,-158, +-161,-200, +-186,-42, +-154,-105, +-160,-28, +-185,-76, +-45,32, +200,-113, +328,-63, +213,-139, +250,-265, +-16,39, +49,47, +-203,-46, +-56,10, +3,87, +95,61, +93,117, +17,-43, +-109,191, +44,-20, +63,158, +29,-92, +-33,-14, +297,-79, +28,-95, +22,8, +-146,-107, +-48,-33, +-56,-12, +72,-232, +-12,-23, +-116,-65, +-34,150, +0,-55, +-314,-29, +100,-39, +31,-50, +79,-61, +-11,51, +-2,-57, +112,120, +9,-94, +131,-91, +90,75, +-228,-120, +19,117, +17,-41, +85,18, +70,176, +-48,36, +-113,-67, +-37,-174, +108,22, +-178,-104, +176,-40, +-108,-194, +48,88, +-7,-94, +-57,-58, +117,184, +64,132, +-106,-20, +218,-179, +129,-23, +50,32, +-98,14, +89,-9, +-132,-25, +251,-82, +206,-93, +-54,44, +71,61, +142,36, +-21,-103, +15,27, +-111,-29, +106,156, +-98,90, +159,-89, +-128,-42, +318,-211, +-90,16, +141,-187, +-40,60, +61,108, +66,-2, +121,-199, +23,95, +-13,-243, +198,-106, +222,171, +31,98, +-83,-221, +-172,-31, +33,-6, +9,53, +-152,3, +81,-183, +66,15, +-148,-129, +-293,84, +-106,-155, +-120,-9, +-70,22, +38,170, +-8,-77, +3,-27, +-78,11, +-79,-135, +66,-93, +-69,-152, +-167,39, +203,69, +-36,43, +-90,-61, +136,168, +-261,119, +-153,-122, +-65,-34, +14,-68, +274,-147, +210,338, +300,-219, +19,55, +45,-52, +-69,227, +79,49, +-142,17, +-104,-47, +-78,22, +-50,-65, +39,-172, +111,222, +-175,-20, +-71,75, +-153,36, +101,-154, +-45,86, +31,164, +97,-112, +-14,98, +55,35, +90,-154, +-9,150, +334,43, +180,1, +-77,-50, +108,-18, +-180,-132, +190,-37, +-164,157, +-56,91, +-229,-100, +146,-34, +48,13, +104,-165, +23,-143, +-19,6, +143,-8, +-32,-11, +58,-246, +130,-38, +91,41, +57,87, +-70,-275, +-133,-29, +-104,-57, +-192,21, +159,-72, +10,-9, +-191,-57, +-212,-30, +-67,119, +-65,-163, +-117,-344, +-254,98, +79,118, +73,213, +-45,42, +256,26, +167,-55, +-147,-162, +25,-142, +-158,-42, +159,-237, +19,-55, +17,-93, +-57,63, +-212,42, +333,-253, +66,186, +-156,74, +19,-5, +-18,79, +-24,18, +-71,46, +-21,-26, +89,-152, +-86,-33, +52,-107, +86,20, +-40,151, +-33,151, +-110,-96, +-72,-177, +6,0, +203,218, +28,-184, +198,-4, +-29,72, +-35,-77, +-77,-76, +48,-152, +-19,59, +-40,53, +-1,-42, +142,88, +70,186, +47,-130, +-161,-165, +88,-49, +27,82, +42,248, +23,225, +-270,212, +-55,-57, +-337,-76, +-21,-106, +-131,-122, +163,169, +14,61, +-279,134, +-266,21, +100,-152, +-288,97, +-285,309, +223,68, +-118,-104, +-13,-102, +123,151, +102,-40, +69,82, +-46,141, +114,96, +-176,165, +-83,-21, +148,129, +238,-32, +-46,-100, +-187,78, +41,73, +-81,119, +-38,-54, +179,23, +-96,32, +151,-96, +81,128, +126,-93, +90,2, +-46,-143, +-29,-54, +45,16, +-189,180, +47,-177, +165,-16, +148,-113, +135,23, +-264,20, +201,-90, +-47,-131, +313,-48, +82,197, +225,146, +-107,-29, +202,167, +91,165, +148,0, +-177,-226, +100,214, +-134,108, +-18,80, +-20,169, +46,24, +-135,-89, +44,47, +229,157, +25,-216, +65,54, +82,-31, +-121,58, +-340,4, +-88,52, +-67,14, +139,0, +-53,-36, +164,129, +167,-59, +-177,10, +-34,60, +9,115, +94,37, +-179,191, +39,-153, +14,-63, +117,-29, +-28,120, +191,-76, +-176,-78, +200,-34, +-202,-175, +-202,176, +-13,-130, +-41,142, +8,40, +-100,-138, +13,87, +-21,46, +118,-119, +181,-22, +-92,-5, +49,-79, +106,77, +53,78, +12,-79, +-5,-84, +-95,43, +-4,-76, +-114,-256, +-36,68, +100,168, +164,142, +-150,80, +132,212, +137,68, +76,-63, +114,146, +-125,78, +-135,66, +-23,-160, +-173,-87, +29,8, +46,-12, +28,-155, +122,16, +-46,-17, +-72,159, +-220,100, +198,4, +76,60, +198,-41, +0,-112, +77,-121, +104,182, +-127,-95, +-75,52, +-27,-128, +73,49, +92,117, +-17,106, +-171,236, +52,74, +-166,-147, +205,-32, +155,44, +154,-92, +19,344, +-29,-243, +91,-150, +-17,135, +-280,70, +-75,-26, +24,-14, +-44,77, +-44,137, +-8,57, +30,120, +42,43, +-141,-101, +-110,44, +-155,-4, +18,22, +132,151, +-29,27, +-112,84, +43,52, +108,209, +-155,91, +-219,371, +314,20, +-68,-16, +-84,79, +-36,4, +96,350, +40,75, +-95,-80, +-129,-67, +99,164, +72,27, +-71,-43, +-114,-105, +15,187, +-120,-64, +-34,-207, +-143,210, +74,-21, +135,49, +-36,-139, +86,111, +97,12, +-15,-13, +78,-45, +-89,-62, +65,52, +-144,-57, +-212,150, +-121,124, +215,128, +-73,-237, +163,84, +-15,175, +-39,-237, +160,52, +-24,41, +-137,-196, +-253,69, +211,40, +-46,45, +139,-53, +30,88, +6,-1, +103,239, +97,87, +52,108, +-225,-227, +-135,48, +155,-130, +-89,148, +-25,-88, +-118,147, +17,-44, +-15,-15, +115,-132, +31,-36, +84,141, +-3,-154, +42,128, +-51,30, +57,-81, +-19,-79, +16,-68, +-11,132, +-92,-5, +22,-13, +-91,-30, +-182,6, +-121,93, +-21,-32, +-29,189, +-48,32, +119,0, +-46,81, +131,87, +47,-145, +-170,-123, +119,108, +55,-115, +19,51, +148,15, +144,38, +175,-60, +191,-217, +-79,-112, +140,144, +53,-27, +-32,-181, +-42,-28, +-190,62, +-105,-31, +-176,209, +-106,123, +183,-49, +-15,56, +59,27, +-227,-92, +6,143, +-72,108, +54,-128, +24,-11, +31,-68, +-53,-183, +110,15, +-201,66, +-101,-89, +130,-96, +1,196, +20,-189, +145,-186, +-22,-193, +-244,-83, +-177,79, +52,44, +46,38, +143,107, +-121,-5, +21,-181, +132,60, +-78,93, +32,-145, +189,138, +-11,-27, +146,-47, +79,149, +-48,82, +73,226, +49,73, +-24,-63, +57,-8, +48,68, +-60,213, +183,-22, +126,-182, +-56,-8, +168,-227, +106,-105, +61,-221, +128,98, +238,-154, +214,56, +-9,83, +85,-127, +-244,21, +39,248, +38,62, +-37,-13, +-97,-203, +-155,-132, +90,-56, +-11,-91, +145,10, +140,-73, +-132,16, +146,191, +129,178, +201,-28, +-50,190, +-148,166, +105,-36, +122,-216, +253,-299, +-196,205, +-81,36, +28,-77, +-40,80, +150,-105, +34,69, +-36,-12, +-285,-99, +133,56, +-146,-46, +-3,-107, +46,-6, +-107,68, +-9,34, +65,-19, +-53,-11, +-129,-65, +-39,32, +22,-8, +164,-152, +163,54, +-10,8, +-41,18, +-164,-65, +-35,130, +-44,32, +-133,187, +-3,130, +47,-99, +-103,76, +223,141, +-27,204, +-224,114, +-116,137, +92,9, +-271,-79, +287,-127, +-202,21, +-133,37, +17,-89, +-25,54, +-26,-27, +-94,-115, +63,34, +21,71, +-73,-168, +-28,-60, +-60,-80, +-115,161, +104,-143, +51,195, +29,35, +-91,-39, +-118,85, +-42,-40, +-121,-115, +77,86, +-68,8, +61,-95, +114,-86, +22,-3, +139,7, +-62,13, +166,-44, +12,105, +213,-51, +53,110, +37,59, +-35,-78, +-21,-4, +-64,30, +-46,-99, +-59,127, +64,124, +-161,298, +26,30, +-32,-216, +-142,-110, +-4,42, +-30,15, +98,-50, +5,-81, +54,77, +-134,-25, +186,-167, +100,-1, +-41,145, +-20,-7, +66,-51, +-12,-214, +-111,9, +-112,-144, +86,81, +162,33, +40,-42, +-95,13, +31,-65, +135,85, +-84,98, +49,24, +47,145, +42,-50, +89,27, +-77,-8, +-21,-161, +5,-10, +-131,58, +155,-56, +-207,60, +8,-45, +15,-163, +119,218, +98,-21, +-138,-53, +-110,-21, +78,-57, +-125,267, +-152,23, +-103,108, +-30,-39, +121,80, +-20,104, +-51,-42, +-9,15, +-41,-29, +-13,117, +24,-3, +-192,223, +-66,43, +-72,-8, +89,-80, +3,70, +110,67, +-91,-33, +84,134, +-25,92, +112,104, +80,-57, +115,-225, +-1,-73, +-19,48, +7,1, +17,7, +-106,41, +43,92, +29,92, +-114,-81, +199,55, +29,-28, +53,42, +13,86, +-69,-6, +54,-30, +-37,-112, +60,-112, +20,3, +-16,-58, +-61,106, +146,-174, +-14,106, +-123,175, +-122,13, +-160,131, +-62,25, +-52,-45, +-75,8, +80,40, +25,134, +-28,-45, +51,16, +172,59, +-107,-12, +-22,-116, +118,-53, +-32,-90, +148,-217, +144,-73, +-2,42, +31,3, +-118,85, +120,-91, +-95,17, +-85,72, +-76,15, +-85,-87, +51,97, +50,-69, +26,-19, +41,228, +-59,-47, +46,53, +-8,-7, +121,-24, +63,-6, +-50,-48, +48,29, +41,-23, +-110,14, +-144,70, +-87,127, +71,25, +165,86, +13,-68, +60,79, +23,-47, +40,107, +-4,9, +-97,7, +137,-160, +87,-43, +121,-86, +-28,28, +96,2, +-78,-76, +14,-14, +78,33, +48,-5, +24,76, +-17,-117, +193,-194, +11,9, +151,-32, +-123,-63, +-87,-75, +158,11, +-43,140, +32,54, +-75,-137, +-34,55, +79,-127, +-23,102, +-38,-96, +-33,-47, +-91,57, +14,-54, +73,86, +-46,89, +146,-80, +52,51, +-3,47, +66,24, +-87,-47, +-2,13, +68,129, +-32,66, +14,-65, +-134,-127, +-29,18, +-158,59, +68,-47, +96,-19, +-29,125, +-89,29, +-33,41, +28,-84, +2,88, +-100,15, +39,43, +49,-85, +-126,-38, +-130,-34, +36,-55, +149,16, +211,-93, +-37,48, +28,-62, +-21,-59, +-21,-5, +-9,-6, +13,-27, +50,118, +63,56, +-60,130, +85,-25, +-43,111, +-13,-40, +46,107, +-84,57, +-101,2, +82,41, +-12,-57, +-58,21, +10,-106, +-4,-51, +4,-47, +69,-34, +6,104, +85,9, +-82,-35, +106,-63, +-149,-17, +-62,-34, +41,-8, +5,51, +-61,-29, +-9,-106, +-6,95, +1,-52, +-24,-151, +23,81, +-49,-123, +-108,118, +51,-117, +73,-39, +76,-111, +114,-19, +149,53, +-38,88, +14,-98, +56,24, +81,-12, +104,-119, +-8,-2, +30,-22, +-42,-157, +58,85, +-30,103, +-31,28, +-42,88, +14,-40, +-1,-124, +-50,18, +10,41, +22,-70, +34,16, +-7,-1, +-57,-64, +-16,53, +-12,-89, +3,-23, +-36,-128, +-7,97, +62,24, +-95,31, +31,-10, +64,-74, +-26,-26, +-2,17, +-234,204, +-17,-38, +174,-46, +12,-6, +42,45, +95,170, +90,-19, +13,12, +-11,24, +-49,87, +2,43, +-58,-44, +-83,21, +-67,-131, +-73,-9, +101,84, +92,-93, +14,-8, +-35,-55, +6,63, +28,71, +-7,159, +-92,53, +50,15, +-195,115, +-38,9, +-40,30, +-77,63, +-30,44, +117,37, +65,-11, +-71,15, +34,24, +29,14, +38,1, +173,32, +-31,20, +-12,23, +79,96, +-69,9, +28,27, +31,25, +-20,-14, +-34,32, +-17,7, +28,-46, +41,118, +36,-5, +-8,-109, +-4,-90, +-75,-4, +-167,36, +12,29, +10,25, +-3,8, +-58,-17, +46,-58, +-15,-46, +-71,83, +-19,-48, +-42,14, +-23,41, +43,-12, +37,-83, +-4,27, +-4,-99, +11,79, +3,40, +52,-28, +61,-87, +36,-57, +-9,-42, +-6,-84, +-68,36, +-16,33, +46,-22, +-23,84, +-105,-6, +-38,87, +31,118, +21,-7, +-39,28, +41,75, +-32,-44, +-19,5, +-47,4, +4,8, +56,55, +-9,-14, +26,13, +39,-19, +51,-10, +-27,-48, +40,-77, +-9,-22, +-39,-17, +42,-8, +11,-22, +10,3, +-60,16, +-21,-13, +36,19, +-17,-19, +34,29, +-31,6, +30,36, +-39,18, +-59,25, +55,-31, +-19,1, +44,-62, +-31,22, +47,7, +-78,-17, +2,-85, +-32,-11, +93,86, +29,-10, +50,15, +-6,46, +6,-27, +-10,77, +56,-11, +-36,-23, +-14,-99, +0,38, +-25,14, +-1,6, +-9,18, +40,-14, +-22,69, +-52,-12, +125,8, +6,-84, +-9,-44, +13,-3, +0,26, +-46,-44, +12,46, +24,23, +-21,-6, +30,37, +-57,13, +57,13, +9,1, +-18,-71, +-41,10, +38,-17, +27,-34, +-85,-19, +56,30, +44,8, +-40,-15, +-19,-40, +63,5, +21,41, +87,-7, +-21,-63, +-22,52, +69,8, +33,0, +81,-68, +27,20, +39,37, +-5,-48, +41,-8, +17,46, +12,-4, +13,-37, +-12,-40, +-5,-16, +-1,-18, +31,30, +28,-3, +14,-31, +42,11, +-11,4, +-23,-44, +51,-34, +9,-30, +-52,20, +6,18, +-16,-19, +70,35, +-35,77, +-19,-13, +5,26, +-9,-39, +45,-11, +66,-17, +-6,23, +7,20, +20,-7, +-60,-27, +41,-7, +5,-2, +-14,31, +-34,15, +7,-2, +-7,79, +14,-12, +27,-12, +13,-35, +26,8, +-22,1, +-16,31, +-12,4, +7,-19, +-24,9, +-23,-43, +-3,-21, +39,3, +3,-18, +8,36, +7,42, +32,-16, +37,14, +6,7, +46,24, +7,-7, +-43,-12, +-24,-22, +21,3, +-23,-8, +-19,-4, +29,18, +-3,22, +-8,-9, +7,8, +-19,14, +-12,25, +15,4, +-6,-12, +-3,0, +3,-19, +1,15, +25,-17, +-26,-36, +17,-3, +-28,-21, +-13,32, +5,-21, +-3,28, +15,1, +-27,15, +-4,-11, +5,-4, +29,-10, +-1,23, +16,-24, +0,-9, +-4,13, +4,22, +16,9, +-18,-10, +8,23, +13,-34, +-7,-36, +2,-14, +21,9, +-30,3, +6,15, +3,17, +6,9, +-6,-10, +4,-8, +12,13, +15,-17, +19,1, +2,-10, +3,6, +-21,-11, +25,34, +20,1, +-5,8, +11,2, +27,35, +-7,0, +-21,30, +4,-15, +-5,5, +-4,-10, +8,26, +-24,16, +2,-8, +6,1, +7,-10, +-11,2, +-2,1, +-13,-1, +5,14, +-2,14, +3,-6, +-6,14, +5,-3, +0,2, +-3,0, +18,-8, +-3,-4, +-7,-5, +5,11, +-1,15, +6,-10, +5,-7, +9,2, +5,5, +5,-6, +3,13, +-2,6, +6,-10, +-12,9, +3,-2, +19,-8, +1,-9, +-7,-5, +4,-3, +2,-14, +4,0, +5,6, +-1,0, +-9,-10, +1,1, +0,-12, +0,-1, +14,-2, +3,1, +0,3, +4,-1, +-7,0, +-4,-2, +7,4, +0,1, +-3,0, +5,0, +-2,0, +-4,0, +3,0, +-2,-1, +-3,0, +5,0, +-2,1, +-3,0, +6,0, +-3,0, +-2,-1, +5,0, +-3,0, +-2,1, +3,0, +-4,0, +-2,0, +5,0, +-3,0, +0,-1, +7,-4, +-4,2, +-7,0, +4,1, +0,-3, +3,-1, +14,2, +0,1, +0,12, +1,-1, +-9,10, +-1,0, +5,-6, +4,0, +2,14, +4,3, +-7,5, +1,9, +19,8, +3,2, +-12,-9, +6,10, +-2,-6, +3,-13, +5,6, +5,-5, +9,-2, +5,7, +6,10, +-1,-15, +5,-11, +-7,5, +-3,4, +18,8, +-3,0, +0,-2, +5,3, +-6,-14, +3,6, +-2,-14, +5,-14, +-13,1, +-2,-1, +-11,-2, +7,10, +6,-1, +2,8, +-24,-16, +8,-26, +-4,10, +-5,-5, +4,15, +-21,-30, +-7,0, +27,-35, +11,-2, +-5,-8, +20,-1, +25,-34, +-21,11, +3,-6, +2,10, +19,-1, +15,17, +12,-13, +4,8, +-6,10, +6,-9, +3,-17, +6,-15, +-30,-3, +21,-9, +2,14, +-7,36, +13,34, +8,-23, +-18,10, +16,-9, +4,-22, +-4,-13, +0,9, +16,24, +-1,-23, +29,10, +5,4, +-4,11, +-27,-15, +15,-1, +-3,-28, +5,21, +-13,-32, +-28,21, +17,3, +-26,36, +25,17, +1,-15, +3,19, +-3,0, +-6,12, +15,-4, +-12,-25, +-19,-14, +7,-8, +-8,9, +-3,-22, +29,-18, +-19,4, +-23,8, +21,-3, +-24,22, +-43,12, +7,7, +46,-24, +6,-7, +37,-14, +32,16, +7,-42, +8,-36, +3,18, +39,-3, +-3,21, +-23,43, +-24,-9, +7,19, +-12,-4, +-16,-31, +-22,-1, +26,-8, +13,35, +27,12, +14,12, +-7,-79, +7,2, +-34,-15, +-14,-31, +5,2, +41,7, +-60,27, +20,7, +7,-20, +-6,-23, +66,17, +45,11, +-9,39, +5,-26, +-19,13, +-35,-77, +70,-35, +-16,19, +6,-18, +-52,-20, +9,30, +51,34, +-23,44, +-11,-4, +42,-11, +14,31, +28,3, +31,-30, +-1,18, +-5,16, +-12,40, +13,37, +12,4, +17,-46, +41,8, +-5,48, +39,-37, +27,-20, +81,68, +33,0, +69,-8, +-22,-52, +-21,63, +87,7, +21,-41, +63,-5, +-19,40, +-40,15, +44,-8, +56,-30, +-85,19, +27,34, +38,17, +-41,-10, +-18,71, +9,-1, +57,-13, +-57,-13, +30,-37, +-21,6, +24,-23, +12,-46, +-46,44, +0,-26, +13,3, +-9,44, +6,84, +125,-8, +-52,12, +-22,-69, +40,14, +-9,-18, +-1,-6, +-25,-14, +0,-38, +-14,99, +-36,23, +56,11, +-10,-77, +6,27, +-6,-46, +50,-15, +29,10, +93,-86, +-32,11, +2,85, +-78,17, +47,-7, +-31,-22, +44,62, +-19,-1, +55,31, +-59,-25, +-39,-18, +30,-36, +-31,-6, +34,-29, +-17,19, +36,-19, +-21,13, +-60,-16, +10,-3, +11,22, +42,8, +-39,17, +-9,22, +40,77, +-27,48, +51,10, +39,19, +26,-13, +-9,14, +56,-55, +4,-8, +-47,-4, +-19,-5, +-32,44, +41,-75, +-39,-28, +21,7, +31,-118, +-38,-87, +-105,6, +-23,-84, +46,22, +-16,-33, +-68,-36, +-6,84, +-9,42, +36,57, +61,87, +52,28, +3,-40, +11,-79, +-4,99, +-4,-27, +37,83, +43,12, +-23,-41, +-42,-14, +-19,48, +-71,-83, +-15,46, +46,58, +-58,17, +-3,-8, +10,-25, +12,-29, +-167,-36, +-75,4, +-4,90, +-8,109, +36,5, +41,-118, +28,46, +-17,-7, +-34,-32, +-20,14, +31,-25, +28,-27, +-69,-9, +79,-96, +-12,-23, +-31,-20, +173,-32, +38,-1, +29,-14, +34,-24, +-71,-15, +65,11, +117,-37, +-30,-44, +-77,-63, +-40,-30, +-38,-9, +-195,-115, +50,-15, +-92,-53, +-7,-159, +28,-71, +6,-63, +-35,55, +14,8, +92,93, +101,-84, +-73,9, +-67,131, +-83,-21, +-58,44, +2,-43, +-49,-87, +-11,-24, +13,-12, +90,19, +95,-170, +42,-45, +12,6, +174,46, +-17,38, +-234,-204, +-2,-17, +-26,26, +64,74, +31,10, +-95,-31, +62,-24, +-7,-97, +-36,128, +3,23, +-12,89, +-16,-53, +-57,64, +-7,1, +34,-16, +22,70, +10,-41, +-50,-18, +-1,124, +14,40, +-42,-88, +-31,-28, +-30,-103, +58,-85, +-42,157, +30,22, +-8,2, +104,119, +81,12, +56,-24, +14,98, +-38,-88, +149,-53, +114,19, +76,111, +73,39, +51,117, +-108,-118, +-49,123, +23,-81, +-24,151, +1,52, +-6,-95, +-9,106, +-61,29, +5,-51, +41,8, +-62,34, +-149,17, +106,63, +-82,35, +85,-9, +6,-104, +69,34, +4,47, +-4,51, +10,106, +-58,-21, +-12,57, +82,-41, +-101,-2, +-84,-57, +46,-107, +-13,40, +-43,-111, +85,25, +-60,-130, +63,-56, +50,-118, +13,27, +-9,6, +-21,5, +-21,59, +28,62, +-37,-48, +211,93, +149,-16, +36,55, +-130,34, +-126,38, +49,85, +39,-43, +-100,-15, +2,-88, +28,84, +-33,-41, +-89,-29, +-29,-125, +96,19, +68,47, +-158,-59, +-29,-18, +-134,127, +14,65, +-32,-66, +68,-129, +-2,-13, +-87,47, +66,-24, +-3,-47, +52,-51, +146,80, +-46,-89, +73,-86, +14,54, +-91,-57, +-33,47, +-38,96, +-23,-102, +79,127, +-34,-55, +-75,137, +32,-54, +-43,-140, +158,-11, +-87,75, +-123,63, +151,32, +11,-9, +193,194, +-17,117, +24,-76, +48,5, +78,-33, +14,14, +-78,76, +96,-2, +-28,-28, +121,86, +87,43, +137,160, +-97,-7, +-4,-9, +40,-107, +23,47, +60,-79, +13,68, +165,-86, +71,-25, +-87,-127, +-144,-70, +-110,-14, +41,23, +48,-29, +-50,48, +63,6, +121,24, +-8,7, +46,-53, +-59,47, +41,-228, +26,19, +50,69, +51,-97, +-85,87, +-76,-15, +-85,-72, +-95,-17, +120,91, +-118,-85, +31,-3, +-2,-42, +144,73, +148,217, +-32,90, +118,53, +-22,116, +-107,12, +172,-59, +51,-16, +-28,45, +25,-134, +80,-40, +-75,-8, +-52,45, +-62,-25, +-160,-131, +-122,-13, +-123,-175, +-14,-106, +146,174, +-61,-106, +-16,58, +20,-3, +60,112, +-37,112, +54,30, +-69,6, +13,-86, +53,-42, +29,28, +199,-55, +-114,81, +29,-92, +43,-92, +-106,-41, +17,-7, +7,-1, +-19,-48, +-1,73, +115,225, +80,57, +112,-104, +-25,-92, +84,-134, +-91,33, +110,-67, +3,-70, +89,80, +-72,8, +-66,-43, +-192,-223, +24,3, +-13,-117, +-41,29, +-9,-15, +-51,42, +-20,-104, +121,-80, +-30,39, +-103,-108, +-152,-23, +-125,-267, +78,57, +-110,21, +-138,53, +98,21, +119,-218, +15,163, +8,45, +-207,-60, +155,56, +-131,-58, +5,10, +-21,161, +-77,8, +89,-27, +42,50, +47,-145, +49,-24, +-84,-98, +135,-85, +31,65, +-95,-13, +40,42, +162,-33, +86,-81, +-112,144, +-111,-9, +-12,214, +66,51, +-20,7, +-41,-145, +100,1, +186,167, +-134,25, +54,-77, +5,81, +98,50, +-30,-15, +-4,-42, +-142,110, +-32,216, +26,-30, +-161,-298, +64,-124, +-59,-127, +-46,99, +-64,-30, +-21,4, +-35,78, +37,-59, +53,-110, +213,51, +12,-105, +166,44, +-62,-13, +139,-7, +22,3, +114,86, +61,95, +-68,-8, +77,-86, +-121,115, +-42,40, +-118,-85, +-91,39, +29,-35, +51,-195, +104,143, +-115,-161, +-60,80, +-28,60, +-73,168, +21,-71, +63,-34, +-94,115, +-26,27, +-25,-54, +17,89, +-133,-37, +-202,-21, +287,127, +-271,79, +92,-9, +-116,-137, +-224,-114, +-27,-204, +223,-141, +-103,-76, +47,99, +-3,-130, +-133,-187, +-44,-32, +-35,-130, +-164,65, +-41,-18, +-10,-8, +163,-54, +164,152, +22,8, +-39,-32, +-129,65, +-53,11, +65,19, +-9,-34, +-107,-68, +46,6, +-3,107, +-146,46, +133,-56, +-285,99, +-36,12, +34,-69, +150,105, +-40,-80, +28,77, +-81,-36, +-196,-205, +253,299, +122,216, +105,36, +-148,-166, +-50,-190, +201,28, +129,-178, +146,-191, +-132,-16, +140,73, +145,-10, +-11,91, +90,56, +-155,132, +-97,203, +-37,13, +38,-62, +39,-248, +-244,-21, +85,127, +-9,-83, +214,-56, +238,154, +128,-98, +61,221, +106,105, +168,227, +-56,8, +126,182, +183,22, +-60,-213, +48,-68, +57,8, +-24,63, +49,-73, +73,-226, +-48,-82, +79,-149, +146,47, +-11,27, +189,-138, +32,145, +-78,-93, +132,-60, +21,181, +-121,5, +143,-107, +46,-38, +52,-44, +-177,-79, +-244,83, +-22,193, +145,186, +20,189, +1,-196, +130,96, +-101,89, +-201,-66, +110,-15, +-53,183, +31,68, +24,11, +54,128, +-72,-108, +6,-143, +-227,92, +59,-27, +-15,-56, +183,49, +-106,-123, +-176,-209, +-105,31, +-190,-62, +-42,28, +-32,181, +53,27, +140,-144, +-79,112, +191,217, +175,60, +144,-38, +148,-15, +19,-51, +55,115, +119,-108, +-170,123, +47,145, +131,-87, +-46,-81, +119,0, +-48,-32, +-29,-189, +-21,32, +-121,-93, +-182,-6, +-91,30, +22,13, +-92,5, +-11,-132, +16,68, +-19,79, +57,81, +-51,-30, +42,-128, +-3,154, +84,-141, +31,36, +115,132, +-15,15, +17,44, +-118,-147, +-25,88, +-89,-148, +155,130, +-135,-48, +-225,227, +52,-108, +97,-87, +103,-239, +6,1, +30,-88, +139,53, +-46,-45, +211,-40, +-253,-69, +-137,196, +-24,-41, +160,-52, +-39,237, +-15,-175, +163,-84, +-73,237, +215,-128, +-121,-124, +-212,-150, +-144,57, +65,-52, +-89,62, +78,45, +-15,13, +97,-12, +86,-111, +-36,139, +135,-49, +74,21, +-143,-210, +-34,207, +-120,64, +15,-187, +-114,105, +-71,43, +72,-27, +99,-164, +-129,67, +-95,80, +40,-75, +96,-350, +-36,-4, +-84,-79, +-68,16, +314,-20, +-219,-371, +-155,-91, +108,-209, +43,-52, +-112,-84, +-29,-27, +132,-151, +18,-22, +-155,4, +-110,-44, +-141,101, +42,-43, +30,-120, +-8,-57, +-44,-137, +-44,-77, +24,14, +-75,26, +-280,-70, +-17,-135, +91,150, +-29,243, +19,-344, +154,92, +155,-44, +205,32, +-166,147, +52,-74, +-171,-236, +-17,-106, +92,-117, +73,-49, +-27,128, +-75,-52, +-127,95, +104,-182, +77,121, +0,112, +198,41, +76,-60, +198,-4, +-220,-100, +-72,-159, +-46,17, +122,-16, +28,155, +46,12, +29,-8, +-173,87, +-23,160, +-135,-66, +-125,-78, +114,-146, +76,63, +137,-68, +132,-212, +-150,-80, +164,-142, +100,-168, +-36,-68, +-114,256, +-4,76, +-95,-43, +-5,84, +12,79, +53,-78, +106,-77, +49,79, +-92,5, +181,22, +118,119, +-21,-46, +13,-87, +-100,138, +8,-40, +-41,-142, +-13,130, +-202,-176, +-202,175, +200,34, +-176,78, +191,76, +-28,-120, +117,29, +14,63, +39,153, +-179,-191, +94,-37, +9,-115, +-34,-60, +-177,-10, +167,59, +164,-129, +-53,36, +139,0, +-67,-14, +-88,-52, +-340,-4, +-121,-58, +82,31, +65,-54, +25,216, +229,-157, +44,-47, +-135,89, +46,-24, +-20,-169, +-18,-80, +-134,-108, +100,-214, +-177,226, +148,0, +91,-165, +202,-167, +-107,29, +225,-146, +82,-197, +313,48, +-47,131, +201,90, +-264,-20, +135,-23, +148,113, +165,16, +47,177, +-189,-180, +45,-16, +-29,54, +-46,143, +90,-2, +126,93, +81,-128, +151,96, +-96,-32, +179,-23, +-38,54, +-81,-119, +41,-73, +-187,-78, +-46,100, +238,32, +148,-129, +-83,21, +-176,-165, +114,-96, +-46,-141, +69,-82, +102,40, +123,-151, +-13,102, +-118,104, +223,-68, +-285,-309, +-288,-97, +100,152, +-266,-21, +-279,-134, +14,-61, +163,-169, +-131,122, +-21,106, +-337,76, +-55,57, +-270,-212, +23,-225, +42,-248, +27,-82, +88,49, +-161,165, +47,130, +70,-186, +142,-88, +-1,42, +-40,-53, +-19,-59, +48,152, +-77,76, +-35,77, +-29,-72, +198,4, +28,184, +203,-218, +11,0, +22,24, +92,67, +-44,21, +175,-61, +38,-50, +-79,-28, +185,148, +-187,-108, +122,-117, +-254,125, +69,-65, +-195,-110, +-63,243, +33,-138, +200,-69, +-101,-49, +-51,-48, +28,-180, +30,-82, +283,78, +-56,5, +-208,-3, +261,101, +-206,-3, +-287,-67, +14,-72, +-132,-11, +34,179, +-54,133, +-62,-177, +-143,139, +173,-33, +196,163, +-143,-15, +73,86, +16,191, +50,-16, +96,58, +223,-266, +-50,-22, +156,-37, +-43,69, +135,264, +65,-185, +83,-12, +-121,160, +-104,-74, +129,-209, +79,6, +-30,15, +56,203, +109,-190, +18,100, +-121,-80, +-316,-235, +171,-20, +15,18, +-78,91, +356,44, +94,204, +205,318, +-110,-100, +49,32, +-108,285, +-151,28, +-225,49, +75,147, +143,97, +85,-132, +-194,253, +-89,-69, +126,166, +51,116, +70,8, +181,-76, +-118,-24, +5,-5, +166,-141, +-17,204, +59,10, +37,10, +-222,-175, +37,83, +-6,180, +-29,85, +-143,-91, +129,306, +-39,-131, +115,153, +-165,-263, +4,-149, +-97,5, +162,154, +13,59, +14,168, +-86,252, +191,-58, +-172,136, +-141,141, +-50,168, +81,-125, +-137,108, +63,44, +19,164, +113,-140, +-83,-311, +118,-185, +112,-65, +-114,28, +132,86, +-171,-97, +263,57, +-62,12, +-98,109, +-148,-166, +-106,-4, +167,63, +154,81, +-73,-29, +144,137, +-159,34, +75,-12, +-4,108, +-81,127, +235,15, +-17,-101, +16,-20, +205,-28, +46,-30, +-113,40, +308,-50, +155,-55, +46,-32, +-229,7, +114,-11, +-224,40, +303,-146, +219,-69, +170,77, +253,-122, +-228,92, +-4,62, +172,155, +169,27, +169,-26, +-325,-185, +50,163, +-208,-11, +-192,-246, +-76,153, +-169,208, +-122,61, +-168,27, +-28,3, +-57,239, +-13,-1, +51,62, +18,215, +-37,-195, +-89,-36, +-142,-37, +69,87, +4,-277, +-82,81, +-82,33, +74,-46, +166,49, +-48,277, +-95,-42, +86,-138, +5,162, +-54,148, +2,-52, +279,129, +-215,29, +-6,150, +-135,22, +-108,-155, +-4,-40, +106,-84, +-104,135, +108,164, +-9,46, +-340,-43, +-219,-40, +128,87, +38,-42, +135,-231, +-20,-201, +-39,124, +-181,168, +65,33, +29,39, +-84,-119, +-268,100, +-42,-135, +-144,61, +113,85, +-144,6, +-112,14, +-157,-188, +172,16, +13,109, +82,-133, +216,68, +-160,4, +-60,-157, +30,87, +-141,100, +36,13, +-81,140, +67,30, +29,-136, +-61,-17, +-2,83, +118,-92, +124,57, +-34,-57, +0,-104, +44,11, +156,-94, +-118,-119, +-5,44, +-108,81, +-269,-51, +-327,21, +-25,123, +99,-79, +34,77, +-129,-47, +250,-23, +35,-43, +28,-42, +190,-71, +43,-167, +-43,49, +61,60, +73,72, +-26,71, +-24,-193, +0,-145, +-11,-88, +-48,-85, +-76,88, +53,53, +-139,-41, +59,70, +-66,137, +-186,10, +132,136, +177,-116, +20,133, +-77,219, +-26,-15, +0,-51, +88,73, +-102,360, +-35,-22, +34,29, +-36,129, +-151,64, +28,12, +1,-349, +27,-17, +-72,74, +-92,75, +122,-87, +-270,-51, +-18,-38, +98,-68, +-25,-113, +260,-213, +57,-115, +102,147, +128,75, +132,221, +215,157, +-86,139, +119,58, +138,-92, +-52,-254, +84,67, +28,29, +-72,28, +20,-20, +183,-143, +47,10, +123,212, +28,317, +145,-25, +73,46, +-85,-132, +33,69, +76,-3, +-65,-27, +180,10, +36,170, +-25,-21, +-107,52, +52,71, +-19,18, +-187,155, +30,-67, +-140,23, +-92,229, +-225,-69, +-97,10, +32,-44, +-104,223, +-221,198, +-10,213, +46,15, +-54,-44, +273,86, +-141,70, +-41,26, +-1,-103, +12,102, +152,-39, +4,-32, +-78,267, +19,135, +91,92, +-99,45, +352,-137, +-109,95, +-261,-163, +39,3, +-1,112, +78,-32, +-87,147, +26,164, +201,-33, +89,-305, +79,-28, +-3,-193, +71,-45, +117,33, +161,11, +71,-49, +-8,-131, +131,179, +57,-6, +22,160, +142,-68, +27,27, +174,-100, +33,40, +-144,47, +-74,-139, +-4,-31, +-266,-32, +-63,34, +-78,-76, +92,167, +66,10, +102,63, +-144,-32, +27,-17, +84,-61, +44,-45, +-77,-3, +-11,-97, +-9,7, +13,178, +75,-20, +-70,-200, +107,-58, +-35,-192, +20,36, +-12,-97, +-30,-96, +-19,-185, +-191,49, +205,29, +-64,105, +-93,16, +-208,109, +34,19, +-35,36, +58,-39, +26,153, +-53,93, +195,-52, +30,47, +-61,-79, +16,-27, +-157,-46, +-11,10, +-145,-79, +-50,209, +56,7, +-10,-14, +-54,29, +29,-10, +7,-26, +3,-127, +-24,-1, +-136,-79, +74,-31, +134,166, +109,-34, +26,17, +-152,-67, +-177,107, +51,-3, +78,47, +10,-33, +106,46, +132,-88, +-91,-18, +109,-17, +104,-67, +40,102, +80,121, +-18,17, +15,-69, +-39,17, +-97,82, +12,45, +30,67, +-72,0, +-62,38, +22,-65, +153,143, +70,-80, +-164,28, +156,-63, +4,1, +14,-124, +-19,252, +112,132, +82,26, +69,109, +-46,-203, +20,-80, +-87,-66, +151,-5, +-132,91, +-31,64, +111,-8, +82,84, +28,34, +-3,64, +-70,-47, +133,167, +-71,-163, +81,-140, +-6,-75, +204,53, +-98,52, +-322,52, +-86,-169, +-23,74, +157,-231, +121,-77, +75,-17, +6,-36, +56,-138, +26,66, +155,205, +66,-49, +-24,-181, +130,59, +-14,56, +-39,-3, +-21,-102, +-173,-93, +-119,65, +144,-49, +12,235, +13,74, +-71,-105, +21,-112, +-16,-68, +4,-83, +101,26, +-68,51, +6,48, +-91,34, +143,-29, +82,-75, +37,-121, +60,102, +9,-123, +-67,-96, +-70,-108, +111,69, +-27,-35, +10,-143, +-100,-16, +-68,-35, +109,149, +-5,-50, +-78,105, +-41,3, +-38,13, +-49,124, +-12,-84, +25,14, +16,-124, +-94,90, +122,58, +-75,-135, +-20,3, +227,60, +-48,-29, +28,144, +-35,67, +-175,-58, +-16,24, +28,39, +-40,-120, +-2,-47, +90,-76, +38,-78, +88,166, +11,20, +-46,58, +-30,7, +-12,-60, +57,85, +17,-84, +-186,39, +111,19, +-10,-81, +49,-18, +60,-41, +-30,-90, +122,35, +-29,42, +104,-10, +-101,-98, +-97,-62, +-29,103, +23,-25, +-21,11, +-206,-75, +26,-9, +-39,59, +-13,50, +-122,76, +-6,65, +26,57, +41,-166, +63,77, +-11,25, +-34,8, +-82,7, +-110,-6, +-73,-22, +86,-72, +105,137, +129,6, +-122,-51, +24,-113, +-81,-102, +-95,12, +152,39, +-2,-16, +-162,102, +-14,23, +166,57, +38,147, +-94,-42, +-40,17, +3,99, +-137,92, +-33,64, +-163,113, +72,-204, +-80,-205, +59,-46, +82,57, +-68,142, +-195,-87, +21,92, +-32,-32, +90,54, +-26,-56, +82,9, +13,120, +41,52, +39,-57, +39,12, +44,-50, +-51,98, +-157,-103, +8,23, +-81,35, +97,72, +154,66, +49,32, +73,-68, +-131,114, +35,-14, +-46,7, +32,-42, +-20,146, +89,54, +-79,-118, +53,1, +43,19, +25,-39, +60,-11, +29,-56, +-67,-25, +9,71, +123,-26, +23,63, +-1,118, +-31,-16, +-37,34, +-4,36, +-43,83, +49,31, +-24,41, +50,22, +13,-93, +40,-132, +-97,11, +84,105, +37,83, +14,17, +-45,-17, +-48,-97, +-19,34, +-92,40, +51,-49, +1,9, +-47,6, +95,-17, +24,3, +54,-58, +-64,-136, +5,56, +-48,-105, +-2,-27, +-43,101, +34,12, +39,53, +62,-5, +56,1, +-59,45, +67,-52, +43,-56, +40,-160, +13,85, +98,-12, +-46,15, +-61,-118, +-106,35, +-2,-4, +-76,-43, +6,71, +-151,-38, +-69,46, +1,-7, +59,21, +46,9, +-57,-28, +-44,-31, +19,9, +-54,85, +-37,-39, +39,-20, +-33,-2, +80,94, +25,3, +34,24, +-57,-133, +47,-59, +-67,-73, +-49,-27, +7,-62, +26,-1, +-26,76, +-64,97, +81,-16, +-43,74, +120,43, +8,9, +-3,69, +-87,10, +47,68, +18,118, +-83,2, +-1,9, +-137,41, +-83,78, +-56,55, +100,69, +60,-45, +38,-47, +0,147, +13,-104, +-11,-122, +-100,50, +82,-1, +-57,129, +23,-46, +175,6, +40,6, +24,-14, +14,29, +-25,94, +23,-47, +-36,-78, +59,81, +34,-45, +-18,104, +12,-6, +87,-57, +146,-48, +54,-74, +50,-15, +-80,-9, +58,-109, +36,-121, +46,46, +-1,-90, +-10,-39, +103,-11, +-8,-1, +-10,-23, +79,-45, +-3,69, +41,12, +-1,50, +-15,-13, +-3,10, +36,9, +-105,-12, +87,68, +109,77, +101,-36, +2,97, +-35,63, +-54,-10, +29,-12, +58,25, +-60,-13, +-29,36, +-81,35, +11,25, +94,40, +76,2, +40,132, +122,36, +-2,8, +-36,112, +-66,7, +-85,79, +-22,8, +4,-49, +-48,-12, +-27,-73, +30,52, +53,-53, +-71,-34, +-48,75, +-96,-45, +85,-48, +59,-1, +-42,2, +62,-31, +87,4, +80,-17, +-66,33, +31,-13, +76,-47, +23,15, +29,92, +-39,11, +75,-34, +35,-37, +4,-11, +15,16, +16,-57, +4,25, +8,-33, +-54,-24, +-76,29, +-27,-24, +-19,-20, +45,51, +38,9, +-18,-28, +-24,50, +-57,40, +1,12, +-14,54, +-33,19, +29,30, +-31,-42, +23,58, +15,-7, +12,-123, +-10,-105, +23,-11, +14,-43, +-42,5, +-21,10, +-19,54, +-20,-26, +-10,0, +-21,43, +20,38, +-5,-5, +-4,-7, +-29,0, +0,9, +33,22, +33,-62, +20,22, +8,-19, +-8,-46, +-28,12, +6,6, +18,53, +-31,29, +28,-7, +-20,21, +-74,-93, +65,-3, +21,-6, +-37,8, +43,-75, +-44,-25, +8,-63, +-8,22, +21,17, +41,-42, +39,-49, +-47,51, +-93,-18, +9,48, +20,29, +-18,-74, +-9,-90, +23,7, +31,3, +38,4, +9,5, +-68,12, +6,-41, +-3,-11, +2,-55, +73,15, +-18,0, +4,57, +53,-42, +24,5, +-34,28, +6,-27, +50,-16, +28,45, +-21,25, +26,-32, +-17,-17, +-14,12, +-40,-9, +44,-6, +-52,-41, +-9,-8, +15,17, +41,0, +4,-1, +16,-3, +63,-26, +-43,-18, +22,-50, +86,-20, +-19,-34, +-23,-43, +5,-23, +-4,-47, +5,9, +-36,-44, +16,89, +29,40, +34,-51, +-19,23, +18,-5, +-13,56, +-12,77, +-13,0, +-16,29, +14,-45, +-4,6, +-7,-33, +-13,69, +-4,32, +-2,-3, +2,4, +-8,36, +-8,6, +-10,11, +-8,12, +33,23, +18,-21, +-6,-3, +16,24, +13,-41, +7,38, +3,14, +25,9, +-17,15, +-9,-45, +-4,-31, +27,35, +-15,-18, +6,33, +-3,-27, +12,12, +-6,6, +-43,15, +-42,7, +-18,-13, +5,36, +39,-16, +-15,-6, +5,4, +9,2, +39,-40, +-2,1, +18,-2, +17,15, +31,-19, +16,17, +10,8, +11,7, +-31,-27, +-16,9, +-20,-17, +41,22, +-19,-3, +28,-5, +1,-17, +13,15, +19,-15, +-12,-9, +-29,-7, +38,5, +-2,11, +-6,6, +-2,4, +0,-3, +-17,1, +8,24, +19,3, +-6,4, +29,3, +-7,-24, +7,-2, +3,35, +18,-10, +-1,-15, +14,-15, +18,-10, +4,-6, +0,13, +14,-12, +31,39, +2,11, +0,2, +15,5, +-14,2, +-14,-9, +-3,-27, +-6,11, +8,9, +-9,-3, +21,6, +-8,4, +-18,4, +3,1, +7,-13, +-6,1, +2,17, +1,-6, +14,10, +-1,1, +-13,4, +0,5, +-11,15, +9,-5, +5,5, +5,2, +4,-4, +-1,4, +12,14, +-7,-8, +2,-9, +1,9, +7,-11, +2,2, +-5,-1, +-2,-14, +2,-2, +1,4, +1,-2, +0,-5, +1,9, +-1,4, +-6,-5, +-2,4, +1,-2, +-6,-2, +2,9, +1,-7, +0,-3, +-1,3, +1,-3, +0,-6, +-2,8, +1,-6, +1,0, +-1,6, +0,-4, +0,0, +0,5, +0,-5, +0,0, +0,5, +0,-5, +0,0, +0,4, +-1,-6, +1,0, +1,6, +-2,-8, +0,6, +1,3, +-1,-3, +0,3, +1,7, +2,-9, +-6,2, +1,2, +-2,-4, +-6,5, +-1,-4, +1,-9, +0,5, +1,2, +1,-4, +2,2, +-2,14, +-5,1, +2,-2, +7,11, +1,-9, +2,9, +-7,8, +12,-14, +-1,-4, +4,4, +5,-2, +5,-5, +9,5, +-11,-15, +0,-5, +-13,-4, +-1,-1, +14,-10, +1,6, +2,-17, +-6,-1, +7,13, +3,-1, +-18,-4, +-8,-4, +21,-6, +-9,3, +8,-9, +-6,-11, +-3,27, +-14,9, +-14,-2, +15,-5, +0,-2, +2,-11, +31,-39, +14,12, +0,-13, +4,6, +18,10, +14,15, +-1,15, +18,10, +3,-35, +7,2, +-7,24, +29,-3, +-6,-4, +19,-3, +8,-24, +-17,-1, +0,3, +-2,-4, +-6,-6, +-2,-11, +38,-5, +-29,7, +-12,9, +19,15, +13,-15, +1,17, +28,5, +-19,3, +41,-22, +-20,17, +-16,-9, +-31,27, +11,-7, +10,-8, +16,-17, +31,19, +17,-15, +18,2, +-2,-1, +39,40, +9,-2, +5,-4, +-15,6, +39,16, +5,-36, +-18,13, +-42,-7, +-43,-15, +-6,-6, +12,-12, +-3,27, +6,-33, +-15,18, +27,-35, +-4,31, +-9,45, +-17,-15, +25,-9, +3,-14, +7,-38, +13,41, +16,-24, +-6,3, +18,21, +33,-23, +-8,-12, +-10,-11, +-8,-6, +-8,-36, +2,-4, +-2,3, +-4,-32, +-13,-69, +-7,33, +-4,-6, +14,45, +-16,-29, +-13,0, +-12,-77, +-13,-56, +18,5, +-19,-23, +34,51, +29,-40, +16,-89, +-36,44, +5,-9, +-4,47, +5,23, +-23,43, +-19,34, +86,20, +22,50, +-43,18, +63,26, +16,3, +4,1, +41,0, +15,-17, +-9,8, +-52,41, +44,6, +-40,9, +-14,-12, +-17,17, +26,32, +-21,-25, +28,-45, +50,16, +6,27, +-34,-28, +24,-5, +53,42, +4,-57, +-18,0, +73,-15, +2,55, +-3,11, +6,41, +-68,-12, +9,-5, +38,-4, +31,-3, +23,-7, +-9,90, +-18,74, +20,-29, +9,-48, +-93,18, +-47,-51, +39,49, +41,42, +21,-17, +-8,-22, +8,63, +-44,25, +43,75, +-37,-8, +21,6, +65,3, +-74,93, +-20,-21, +28,7, +-31,-29, +18,-53, +6,-6, +-28,-12, +-8,46, +8,19, +20,-22, +33,62, +33,-22, +0,-9, +-29,0, +-4,7, +-5,5, +20,-38, +-21,-43, +-10,0, +-20,26, +-19,-54, +-21,-10, +-42,-5, +14,43, +23,11, +-10,105, +12,123, +15,7, +23,-58, +-31,42, +29,-30, +-33,-19, +-14,-54, +1,-12, +-57,-40, +-24,-50, +-18,28, +38,-9, +45,-51, +-19,20, +-27,24, +-76,-29, +-54,24, +8,33, +4,-25, +16,57, +15,-16, +4,11, +35,37, +75,34, +-39,-11, +29,-92, +23,-15, +76,47, +31,13, +-66,-33, +80,17, +87,-4, +62,31, +-42,-2, +59,1, +85,48, +-96,45, +-48,-75, +-71,34, +53,53, +30,-52, +-27,73, +-48,12, +4,49, +-22,-8, +-85,-79, +-66,-7, +-36,-112, +-2,-8, +122,-36, +40,-132, +76,-2, +94,-40, +11,-25, +-81,-35, +-29,-36, +-60,13, +58,-25, +29,12, +-54,10, +-35,-63, +2,-97, +101,36, +109,-77, +87,-68, +-105,12, +36,-9, +-3,-10, +-15,13, +-1,-50, +41,-12, +-3,-69, +79,45, +-10,23, +-8,1, +103,11, +-10,39, +-1,90, +46,-46, +36,121, +58,109, +-80,9, +50,15, +54,74, +146,48, +87,57, +12,6, +-18,-104, +34,45, +59,-81, +-36,78, +23,47, +-25,-94, +14,-29, +24,14, +40,-6, +175,-6, +23,46, +-57,-129, +82,1, +-100,-50, +-11,122, +13,104, +0,-147, +38,47, +60,45, +100,-69, +-56,-55, +-83,-78, +-137,-41, +-1,-9, +-83,-2, +18,-118, +47,-68, +-87,-10, +-3,-69, +8,-9, +120,-43, +-43,-74, +81,16, +-64,-97, +-26,-76, +26,1, +7,62, +-49,27, +-67,73, +47,59, +-57,133, +34,-24, +25,-3, +80,-94, +-33,2, +39,20, +-37,39, +-54,-85, +19,-9, +-44,31, +-57,28, +46,-9, +59,-21, +1,7, +-69,-46, +-151,38, +6,-71, +-76,43, +-2,4, +-106,-35, +-61,118, +-46,-15, +98,12, +13,-85, +40,160, +43,56, +67,52, +-59,-45, +56,-1, +62,5, +39,-53, +34,-12, +-43,-101, +-2,27, +-48,105, +5,-56, +-64,136, +54,58, +24,-3, +95,17, +-47,-6, +1,-9, +51,49, +-92,-40, +-19,-34, +-48,97, +-45,17, +14,-17, +37,-83, +84,-105, +-97,-11, +40,132, +13,93, +50,-22, +-24,-41, +49,-31, +-43,-83, +-4,-36, +-37,-34, +-31,16, +-1,-118, +23,-63, +123,26, +9,-71, +-67,25, +29,56, +60,11, +25,39, +43,-19, +53,-1, +-79,118, +89,-54, +-20,-146, +32,42, +-46,-7, +35,14, +-131,-114, +73,68, +49,-32, +154,-66, +97,-72, +-81,-35, +8,-23, +-157,103, +-51,-98, +44,50, +39,-12, +39,57, +41,-52, +13,-120, +82,-9, +-26,56, +90,-54, +-32,32, +21,-92, +-195,87, +-68,-142, +82,-57, +59,46, +-80,205, +72,204, +-163,-113, +-33,-64, +-137,-92, +3,-99, +-40,-17, +-94,42, +38,-147, +166,-57, +-14,-23, +-162,-102, +-2,16, +152,-39, +-95,-12, +-81,102, +24,113, +-122,51, +129,-6, +105,-137, +86,72, +-73,22, +-110,6, +-82,-7, +-34,-8, +-11,-25, +63,-77, +41,166, +26,-57, +-6,-65, +-122,-76, +-13,-50, +-39,-59, +26,9, +-206,75, +-21,-11, +23,25, +-29,-103, +-97,62, +-101,98, +104,10, +-29,-42, +122,-35, +-30,90, +60,41, +49,18, +-10,81, +111,-19, +-186,-39, +17,84, +57,-85, +-12,60, +-30,-7, +-46,-58, +11,-20, +88,-166, +38,78, +90,76, +-2,47, +-40,120, +28,-39, +-16,-24, +-175,58, +-35,-67, +28,-144, +-48,29, +227,-60, +-20,-3, +-75,135, +122,-58, +-94,-90, +16,124, +25,-14, +-12,84, +-49,-124, +-38,-13, +-41,-3, +-78,-105, +-5,50, +109,-149, +-68,35, +-100,16, +10,143, +-27,35, +111,-69, +-70,108, +-67,96, +9,123, +60,-102, +37,121, +82,75, +143,29, +-91,-34, +6,-48, +-68,-51, +101,-26, +4,83, +-16,68, +21,112, +-71,105, +13,-74, +12,-235, +144,49, +-119,-65, +-173,93, +-21,102, +-39,3, +-14,-56, +130,-59, +-24,181, +66,49, +155,-205, +26,-66, +56,138, +6,36, +75,17, +121,77, +157,231, +-23,-74, +-86,169, +-322,-52, +-98,-52, +204,-53, +-6,75, +81,140, +-71,163, +133,-167, +-70,47, +-3,-64, +28,-34, +82,-84, +111,8, +-31,-64, +-132,-91, +151,5, +-87,66, +20,80, +-46,203, +69,-109, +82,-26, +112,-132, +-19,-252, +14,124, +4,-1, +156,63, +-164,-28, +70,80, +153,-143, +22,65, +-62,-38, +-72,0, +30,-67, +12,-45, +-97,-82, +-39,-17, +15,69, +-18,-17, +80,-121, +40,-102, +104,67, +109,17, +-91,18, +132,88, +106,-46, +10,33, +78,-47, +51,3, +-177,-107, +-152,67, +26,-17, +109,34, +134,-166, +74,31, +-136,79, +-24,1, +3,127, +7,26, +29,10, +-54,-29, +-10,14, +56,-7, +-50,-209, +-145,79, +-11,-10, +-157,46, +16,27, +-61,79, +30,-47, +195,52, +-53,-93, +26,-153, +58,39, +-35,-36, +34,-19, +-208,-109, +-93,-16, +-64,-105, +205,-29, +-191,-49, +-19,185, +-30,96, +-12,97, +20,-36, +-35,192, +107,58, +-70,200, +75,20, +13,-178, +-9,-7, +-11,97, +-77,3, +44,45, +84,61, +27,17, +-144,32, +102,-63, +66,-10, +92,-167, +-78,76, +-63,-34, +-266,32, +-4,31, +-74,139, +-144,-47, +33,-40, +174,100, +27,-27, +142,68, +22,-160, +57,6, +131,-179, +-8,131, +71,49, +161,-11, +117,-33, +71,45, +-3,193, +79,28, +89,305, +201,33, +26,-164, +-87,-147, +78,32, +-1,-112, +39,-3, +-261,163, +-109,-95, +352,137, +-99,-45, +91,-92, +19,-135, +-78,-267, +4,32, +152,39, +12,-102, +-1,103, +-41,-26, +-141,-70, +273,-86, +-54,44, +46,-15, +-10,-213, +-221,-198, +-104,-223, +32,44, +-97,-10, +-225,69, +-92,-229, +-140,-23, +30,67, +-187,-155, +-19,-18, +52,-71, +-107,-52, +-25,21, +36,-170, +180,-10, +-65,27, +76,3, +33,-69, +-85,132, +73,-46, +145,25, +28,-317, +123,-212, +47,-10, +183,143, +20,20, +-72,-28, +28,-29, +84,-67, +-52,254, +138,92, +119,-58, +-86,-139, +215,-157, +132,-221, +128,-75, +102,-147, +57,115, +260,213, +-25,113, +98,68, +-18,38, +-270,51, +122,87, +-92,-75, +-72,-74, +27,17, +1,349, +28,-12, +-151,-64, +-36,-129, +34,-29, +-35,22, +-102,-360, +88,-73, +0,51, +-26,15, +-77,-219, +20,-133, +177,116, +132,-136, +-186,-10, +-66,-137, +59,-70, +-139,41, +53,-53, +-76,-88, +-48,85, +-11,88, +0,145, +-24,193, +-26,-71, +73,-72, +61,-60, +-43,-49, +43,167, +190,71, +28,42, +35,43, +250,23, +-129,47, +34,-77, +99,79, +-25,-123, +-327,-21, +-269,51, +-108,-81, +-5,-44, +-118,119, +156,94, +44,-11, +0,104, +-34,57, +124,-57, +118,92, +-2,-83, +-61,17, +29,136, +67,-30, +-81,-140, +36,-13, +-141,-100, +30,-87, +-60,157, +-160,-4, +216,-68, +82,133, +13,-109, +172,-16, +-157,188, +-112,-14, +-144,-6, +113,-85, +-144,-61, +-42,135, +-268,-100, +-84,119, +29,-39, +65,-33, +-181,-168, +-39,-124, +-20,201, +135,231, +38,42, +128,-87, +-219,40, +-340,43, +-9,-46, +108,-164, +-104,-135, +106,84, +-4,40, +-108,155, +-135,-22, +-6,-150, +-215,-29, +279,-129, +2,52, +-54,-148, +5,-162, +86,138, +-95,42, +-48,-277, +166,-49, +74,46, +-82,-33, +-82,-81, +4,277, +69,-87, +-142,37, +-89,36, +-37,195, +18,-215, +51,-62, +-13,1, +-57,-239, +-28,-3, +-168,-27, +-122,-61, +-169,-208, +-76,-153, +-192,246, +-208,11, +50,-163, +-325,185, +169,26, +169,-27, +172,-155, +-4,-62, +-228,-92, +253,122, +170,-77, +219,69, +303,146, +-224,-40, +114,11, +-229,-7, +46,32, +155,55, +308,50, +-113,-40, +46,30, +205,28, +16,20, +-17,101, +235,-15, +-81,-127, +-4,-108, +75,12, +-159,-34, +144,-137, +-73,29, +154,-81, +167,-63, +-106,4, +-148,166, +-98,-109, +-62,-12, +263,-57, +-171,97, +132,-86, +-114,-28, +112,65, +118,185, +-83,311, +113,140, +19,-164, +63,-44, +-137,-108, +81,125, +-50,-168, +-141,-141, +-172,-136, +191,58, +-86,-252, +14,-168, +13,-59, +162,-154, +-97,-5, +4,149, +-165,263, +115,-153, +-39,131, +129,-306, +-143,91, +-29,-85, +-6,-180, +37,-83, +-222,175, +37,-10, +59,-10, +-17,-204, +166,141, +5,5, +-118,24, +181,76, +70,-8, +51,-116, +126,-166, +-89,69, +-194,-253, +85,132, +143,-97, +75,-147, +-225,-49, +-151,-28, +-108,-285, +49,-32, +-110,100, +205,-318, +94,-204, +356,-44, +-78,-91, +15,-18, +171,20, +-316,235, +-121,80, +18,-100, +109,190, +56,-203, +-30,-15, +79,-6, +129,209, +-104,74, +-121,-160, +83,12, +65,185, +135,-264, +-43,-69, +156,37, +-50,22, +223,266, +96,-58, +50,16, +16,-191, +73,-86, +-143,15, +196,-163, +173,33, +-143,-139, +-62,177, +-54,-133, +34,-179, +-132,11, +14,72, +-287,67, +-206,3, +261,-101, +-208,3, +-56,-5, +283,-78, +30,82, +28,180, +-51,48, +-101,49, +200,69, +33,138, +-63,-243, +-195,110, +69,65, +-254,-125, +122,117, +-187,108, +185,-148, +-79,28, +38,50, +175,61, +-44,-21, +92,-67, +22,-24, +6,0, +69,175, +-168,167, +-109,163, +-194,-52, +25,-19, +96,-26, +-50,-198, +-13,-42, +43,-158, +188,-6, +220,-110, +324,313, +78,-5, +94,-108, +243,29, +-179,15, +46,-198, +198,30, +-15,-65, +47,107, +-62,-89, +-121,74, +-41,-20, +140,-123, +86,-12, +39,21, +147,-77, +-65,-33, +-42,208, +-20,-12, +21,9, +-54,12, +20,182, +95,27, +-27,48, +0,13, +231,-211, +-101,168, +-31,-103, +34,30, +-29,213, +-179,-52, +-108,-23, +-3,175, +185,-99, +-239,12, +31,219, +134,-149, +157,-128, +-31,-71, +-94,29, +35,22, +134,30, +14,-28, +-69,211, +26,-183, +49,61, +-119,-26, +-27,41, +41,80, +70,9, +-203,-18, +168,-121, +32,-79, +132,99, +-117,17, +-56,101, +-99,-116, +-232,207, +-200,24, +114,-92, +106,291, +-88,-5, +-11,-40, +166,89, +-31,89, +-123,-16, +-86,-203, +71,161, +-33,158, +-270,-8, +-93,46, +120,73, +-28,-29, +92,44, +31,163, +-180,-133, +246,110, +-104,-9, +-195,75, +25,154, +-98,19, +22,-97, +191,-42, +108,97, +159,104, +-107,143, +-129,13, +19,69, +82,166, +-51,109, +96,25, +206,63, +168,61, +71,-41, +33,212, +168,45, +-84,38, +-25,-13, +-100,41, +-108,-129, +73,19, +-78,93, +-51,-248, +207,359, +-133,70, +61,33, +119,39, +62,-18, +-6,-184, +133,94, +175,74, +96,173, +-4,-70, +-23,169, +-87,106, +187,186, +-268,32, +110,-213, +70,121, +42,-39, +168,63, +-24,-109, +-70,-78, +102,46, +29,-75, +-75,40, +172,308, +-16,-275, +15,-4, +-38,63, +196,-131, +-47,47, +10,-80, +-106,-77, +48,-6, +82,-57, +114,162, +74,73, +-361,-138, +-165,73, +-6,-216, +71,121, +-84,-110, +-96,155, +-93,-137, +-6,-76, +118,44, +-71,129, +113,7, +-42,-29, +-121,125, +-2,120, +-85,-56, +198,-31, +-174,-168, +72,169, +-161,229, +-297,-299, +23,67, +19,-33, +-8,134, +-79,100, +28,-7, +-38,-64, +185,-113, +96,28, +-181,21, +-41,168, +-126,-43, +34,-351, +-4,-16, +27,-57, +18,-28, +55,-120, +111,101, +102,-116, +-69,103, +-5,-33, +120,-77, +52,47, +-132,6, +31,37, +29,-84, +-164,-120, +-132,-29, +-143,-211, +-3,-151, +-215,126, +83,16, +-133,71, +193,-36, +132,54, +12,84, +-16,-17, +-35,-4, +188,-122, +-1,-68, +113,-71, +60,-98, +20,-74, +-99,-208, +193,9, +162,14, +-89,-205, +139,-132, +8,-13, +-69,-134, +-4,-22, +78,-155, +69,62, +39,60, +77,239, +173,38, +-74,68, +-93,50, +-149,143, +-61,-51, +-49,74, +82,42, +21,84, +428,92, +-205,-160, +30,129, +-76,57, +73,-120, +54,57, +-81,-107, +22,43, +10,141, +-5,32, +-256,15, +26,-236, +-102,-182, +32,87, +-103,-146, +-72,317, +243,-13, +-306,-112, +162,-257, +-70,44, +-29,38, +-93,-39, +-79,150, +-21,37, +-91,-13, +277,104, +158,86, +-194,122, +-24,142, +83,16, +39,16, +-14,-92, +-41,53, +-50,121, +-77,-7, +11,99, +-102,-165, +-85,248, +-90,-69, +-38,140, +-9,-31, +60,-5, +-309,74, +-30,60, +-42,56, +-6,-121, +219,-27, +-159,-15, +154,-90, +-89,177, +-8,28, +-192,105, +67,294, +100,46, +81,-45, +-50,-115, +195,-100, +-49,98, +-94,-82, +50,-12, +-91,-4, +76,78, +29,4, +157,18, +-155,252, +159,-109, +-128,7, +74,52, +-126,-183, +-166,-221, +-47,129, +-36,107, +-56,-118, +-138,70, +-112,23, +36,9, +-50,-172, +291,-12, +59,-286, +120,20, +-72,-48, +123,71, +61,174, +-71,112, +-47,-68, +-40,109, +-243,146, +-75,91, +30,5, +7,-55, +-59,39, +96,86, +-36,56, +40,-178, +-12,-77, +237,41, +23,-26, +89,62, +109,72, +-213,-75, +-167,25, +-269,-24, +-115,62, +91,-242, +-170,1, +108,-56, +145,76, +21,22, +-85,5, +140,-66, +45,-65, +42,50, +-149,69, +-148,58, +93,10, +69,-12, +17,197, +50,57, +-18,-51, +60,56, +4,98, +-114,213, +-69,-157, +-188,-30, +-53,203, +-45,39, +123,-13, +9,115, +105,-24, +-100,-14, +108,63, +326,17, +176,-303, +-78,51, +22,7, +-90,-107, +13,52, +91,-129, +68,-172, +-216,78, +7,269, +-30,17, +27,119, +-120,-107, +-28,74, +33,17, +-78,-224, +-55,-170, +106,3, +-77,-14, +-102,146, +42,-43, +-89,-182, +69,-74, +-13,-213, +-199,-95, +-89,-194, +32,56, +23,168, +68,-69, +39,-30, +-43,-6, +80,65, +272,99, +-127,59, +251,18, +-68,200, +37,-9, +42,31, +84,90, +143,196, +136,-29, +-60,-55, +21,-27, +-193,14, +-197,-10, +-2,168, +233,147, +51,60, +166,-55, +-32,102, +102,78, +112,89, +-120,22, +-140,219, +-30,102, +198,83, +61,90, +-43,-175, +22,-72, +-110,120, +24,-6, +-105,-101, +53,70, +-37,1, +68,-149, +-99,-148, +-88,79, +-156,-92, +-112,-41, +79,154, +-7,2, +-104,-96, +-100,-175, +64,58, +-20,-126, +-36,80, +-47,-1, +-133,46, +-11,-35, +143,106, +93,42, +-201,-152, +117,57, +9,38, +31,-76, +-149,86, +-23,-19, +52,-124, +2,70, +-149,-20, +-43,44, +-13,179, +-190,-86, +-30,69, +89,201, +181,100, +51,120, +-37,-59, +46,78, +-95,-20, +-36,22, +175,-51, +105,-27, +-31,-43, +76,119, +11,-155, +67,252, +11,53, +143,51, +125,-50, +39,-134, +-225,-4, +12,144, +61,-13, +81,22, +-81,-39, +14,-126, +23,-24, +15,-59, +-132,190, +-105,207, +131,-99, +-11,-30, +-184,-21, +-183,148, +94,18, +81,-6, +288,14, +128,72, +-73,23, +87,29, +-28,116, +-129,-31, +-46,-130, +-21,52, +191,53, +-129,145, +-110,32, +-57,-67, +85,-41, +27,-44, +141,111, +126,-142, +-1,-161, +87,-31, +-54,13, +28,-181, +77,-37, +63,-19, +79,62, +36,120, +-145,40, +-66,-6, +-59,57, +-8,-57, +-164,107, +-102,95, +13,86, +90,115, +-158,4, +-16,-4, +73,-159, +34,-25, +168,19, +-31,170, +-98,-184, +-12,-100, +76,71, +55,-69, +11,37, +60,125, +35,158, +-42,229, +67,-35, +66,-109, +75,-191, +-143,17, +25,67, +115,-35, +170,-148, +40,-14, +-167,91, +6,-63, +-59,-15, +-68,26, +131,118, +24,-89, +1,-78, +-39,-73, +-118,174, +15,102, +221,31, +-51,1, +136,108, +-87,-37, +53,32, +-51,101, +-26,97, +-22,13, +50,-69, +-23,-34, +62,61, +-26,-8, +199,126, +123,169, +-3,-139, +77,-80, +-6,-28, +101,-69, +53,-77, +-93,-28, +18,51, +-19,-30, +-38,-73, +67,-81, +-13,161, +-32,-70, +17,-26, +-65,-11, +77,153, +76,-19, +-95,-104, +104,-42, +-12,-29, +-15,-2, +-80,19, +14,-34, +-202,-131, +60,40, +128,25, +-69,-67, +-39,-117, +37,-101, +-74,-14, +-183,-33, +78,70, +10,-64, +-92,28, +48,-89, +57,14, +-83,-56, +-46,1, +-18,56, +89,101, +126,44, +66,-173, +108,-34, +8,62, +91,43, +39,69, +11,-13, +-12,174, +148,75, +101,31, +9,-139, +-20,-125, +28,-55, +-86,72, +9,-4, +120,128, +97,109, +-50,-28, +99,-8, +38,133, +73,-114, +35,197, +46,15, +55,82, +25,30, +-83,-25, +20,32, +72,75, +37,-17, +-81,-87, +-161,-64, +-18,-52, +-169,4, +-58,61, +-2,-96, +-10,-20, +116,2, +-64,-33, +-141,36, +-59,-46, +-47,-40, +2,32, +82,-57, +-107,-82, +136,114, +145,-106, +19,-78, +-99,19, +-26,85, +-65,-45, +-1,17, +27,-53, +-76,-13, +-56,107, +-84,196, +75,55, +-15,-13, +1,-18, +37,102, +18,-12, +34,38, +83,-80, +6,-70, +-57,-91, +21,-19, +189,-27, +-53,22, +-27,45, +99,-38, +34,45, +46,66, +-4,-17, +16,-22, +60,-91, +19,-47, +-33,136, +-44,-6, +4,-22, +31,28, +-6,84, +48,-6, +-98,34, +-33,-81, +-65,-5, +77,-105, +-58,-214, +-1,5, +36,0, +10,26, +17,94, +7,32, +-52,81, +-68,-52, +-4,43, +78,0, +-6,2, +-7,-12, +-9,27, +40,-65, +108,-85, +16,-68, +-4,0, +47,-29, +90,11, +24,57, +27,28, +-84,-57, +-29,169, +-120,30, +4,54, +-63,-29, +64,-26, +-6,-88, +-32,-33, +44,17, +59,-74, +-100,-56, +-99,-28, +38,-69, +-29,89, +9,-75, +40,46, +86,-11, +-39,86, +29,-38, +46,31, +-72,-30, +27,-35, +-9,17, +-9,20, +-65,54, +-46,-24, +78,86, +76,3, +77,-53, +44,-69, +0,66, +48,-75, +-57,87, +-24,-31, +4,59, +-42,7, +69,-110, +26,-19, +-25,-65, +31,37, +-11,-17, +81,-48, +-36,-46, +81,-14, +-80,-32, +62,-7, +46,-34, +-9,-12, +3,-12, +-29,18, +32,48, +45,-42, +53,-43, +51,46, +18,96, +12,21, +23,-83, +24,22, +31,-45, +-11,-65, +2,80, +-45,-82, +-131,40, +92,-48, +22,65, +50,-58, +-64,-48, +-9,68, +-92,-99, +-56,-27, +99,-31, +2,11, +-4,-8, +47,7, +-83,-20, +14,33, +38,30, +-27,-113, +27,82, +-20,11, +36,113, +46,-24, +-15,-1, +20,-26, +17,-44, +54,-58, +-14,11, +50,21, +53,60, +56,2, +-26,14, +8,50, +-73,-18, +1,-32, +-18,42, +-62,-10, +-43,20, +-7,35, +-12,49, +-33,7, +-66,-38, +-7,54, +-26,13, +-40,27, +-12,21, +-30,40, +16,-51, +16,21, +13,68, +10,-2, +-16,42, +52,-58, +-1,2, +-29,-53, +-55,-6, +-42,-68, +-1,-36, +-40,9, +-9,-5, +47,-19, +-29,-1, +-10,43, +20,-2, +-30,-19, +32,21, +-20,47, +-4,5, +-36,5, +25,14, +-58,1, +-52,-15, +-33,14, +33,-69, +41,-10, +-27,21, +-11,25, +-25,28, +4,-23, +24,-7, +23,-11, +39,25, +-66,-28, +15,-46, +-3,-47, +49,-23, +4,37, +-73,-44, +28,54, +28,-37, +7,-34, +16,18, +-1,-9, +16,17, +31,2, +-35,15, +-14,-27, +-1,-31, +42,-4, +-60,-1, +36,16, +-47,-58, +-1,-57, +16,-17, +18,58, +16,7, +-28,-7, +-7,18, +-1,-46, +-33,25, +19,25, +-7,7, +-31,-26, +16,42, +-19,-10, +59,10, +-10,13, +-35,-5, +26,3, +-23,7, +-35,-2, +63,39, +-34,21, +-18,-31, +11,27, +21,-36, +35,23, +17,-11, +15,-9, +-12,21, +64,41, +-17,15, +-27,0, +9,17, +-1,24, +-13,-12, +63,19, +-3,-8, +16,14, +-18,-6, +10,-15, +-10,7, +-13,-22, +18,-24, +-12,18, +26,-1, +16,22, +9,8, +-1,24, +16,39, +2,7, +16,0, +29,7, +5,4, +9,-20, +15,-10, +20,6, +11,40, +-3,9, +-19,3, +9,8, +18,-26, +6,-14, +14,3, +-9,-10, +10,22, +-1,-20, +17,3, +-3,26, +2,-10, +12,-7, +-1,-18, +16,-24, +19,15, +-13,1, +-23,-35, +33,10, +1,19, +-16,-9, +28,-4, +1,16, +8,2, +6,-13, +1,-25, +15,-16, +-12,-4, +15,-2, +4,-8, +-5,30, +-12,-7, +-4,-3, +7,-4, +0,13, +6,-11, +6,-5, +-15,3, +11,0, +-7,-4, +13,2, +-2,7, +-1,6, +5,-7, +-3,-6, +-20,13, +3,15, +5,-12, +3,2, +1,-4, +0,10, +5,-10, +0,-13, +4,-1, +9,4, +-2,-8, +-8,3, +10,5, +-14,6, +3,-4, +12,4, +-4,4, +8,-6, +0,1, +-2,3, +6,-8, +7,3, +-11,4, +3,1, +4,4, +-10,5, +1,-3, +5,-4, +-5,0, +-1,-4, +9,4, +-11,4, +0,-2, +4,1, +-6,0, +0,4, +5,3, +-4,3, +5,6, +-1,2, +-5,1, +1,0, +2,0, +-6,0, +3,0, +3,-1, +-5,-1, +4,0, +3,0, +-6,0, +3,0, +4,0, +-5,1, +3,1, +3,0, +-6,0, +2,0, +1,0, +-5,-1, +-1,-2, +5,-6, +-4,-3, +5,-3, +0,-4, +-6,0, +4,-1, +0,2, +-11,-4, +9,-4, +-1,4, +-5,0, +5,4, +1,3, +-10,-5, +4,-4, +3,-1, +-11,-4, +7,-3, +6,8, +-2,-3, +0,-1, +8,6, +-4,-4, +12,-4, +3,4, +-14,-6, +10,-5, +-8,-3, +-2,8, +9,-4, +4,1, +0,13, +5,10, +0,-10, +1,4, +3,-2, +5,12, +3,-15, +-20,-13, +-3,6, +5,7, +-1,-6, +-2,-7, +13,-2, +-7,4, +11,0, +-15,-3, +6,5, +6,11, +0,-13, +7,4, +-4,3, +-12,7, +-5,-30, +4,8, +15,2, +-12,4, +15,16, +1,25, +6,13, +8,-2, +1,-16, +28,4, +-16,9, +1,-19, +33,-10, +-23,35, +-13,-1, +19,-15, +16,24, +-1,18, +12,7, +2,10, +-3,-26, +17,-3, +-1,20, +10,-22, +-9,10, +14,-3, +6,14, +18,26, +9,-8, +-19,-3, +-3,-9, +11,-40, +20,-6, +15,10, +9,20, +5,-4, +29,-7, +16,0, +2,-7, +16,-39, +-1,-24, +9,-8, +16,-22, +26,1, +-12,-18, +18,24, +-13,22, +-10,-7, +10,15, +-18,6, +16,-14, +-3,8, +63,-19, +-13,12, +-1,-24, +9,-17, +-27,0, +-17,-15, +64,-41, +-12,-21, +15,9, +17,11, +35,-23, +21,36, +11,-27, +-18,31, +-34,-21, +63,-39, +-35,2, +-23,-7, +26,-3, +-35,5, +-10,-13, +59,-10, +-19,10, +16,-42, +-31,26, +-7,-7, +19,-25, +-33,-25, +-1,46, +-7,-18, +-28,7, +16,-7, +18,-58, +16,17, +-1,57, +-47,58, +36,-16, +-60,1, +42,4, +-1,31, +-14,27, +-35,-15, +31,-2, +16,-17, +-1,9, +16,-18, +7,34, +28,37, +28,-54, +-73,44, +4,-37, +49,23, +-3,47, +15,46, +-66,28, +39,-25, +23,11, +24,7, +4,23, +-25,-28, +-11,-25, +-27,-21, +41,10, +33,69, +-33,-14, +-52,15, +-58,-1, +25,-14, +-36,-5, +-4,-5, +-20,-47, +32,-21, +-30,19, +20,2, +-10,-43, +-29,1, +47,19, +-9,5, +-40,-9, +-1,36, +-42,68, +-55,6, +-29,53, +-1,-2, +52,58, +-16,-42, +10,2, +13,-68, +16,-21, +16,51, +-30,-40, +-12,-21, +-40,-27, +-26,-13, +-7,-54, +-66,38, +-33,-7, +-12,-49, +-7,-35, +-43,-20, +-62,10, +-18,-42, +1,32, +-73,18, +8,-50, +-26,-14, +56,-2, +53,-60, +50,-21, +-14,-11, +54,58, +17,44, +20,26, +-15,1, +46,24, +36,-113, +-20,-11, +27,-82, +-27,113, +38,-30, +14,-33, +-83,20, +47,-7, +-4,8, +2,-11, +99,31, +-56,27, +-92,99, +-9,-68, +-64,48, +50,58, +22,-65, +92,48, +-131,-40, +-45,82, +2,-80, +-11,65, +31,45, +24,-22, +23,83, +12,-21, +18,-96, +51,-46, +53,43, +45,42, +32,-48, +-29,-18, +3,12, +-9,12, +46,34, +62,7, +-80,32, +81,14, +-36,46, +81,48, +-11,17, +31,-37, +-25,65, +26,19, +69,110, +-42,-7, +4,-59, +-24,31, +-57,-87, +48,75, +0,-66, +44,69, +77,53, +76,-3, +78,-86, +-46,24, +-65,-54, +-9,-20, +-9,-17, +27,35, +-72,30, +46,-31, +29,38, +-39,-86, +86,11, +40,-46, +9,75, +-29,-89, +38,69, +-99,28, +-100,56, +59,74, +44,-17, +-32,33, +-6,88, +64,26, +-63,29, +4,-54, +-120,-30, +-29,-169, +-84,57, +27,-28, +24,-57, +90,-11, +47,29, +-4,0, +16,68, +108,85, +40,65, +-9,-27, +-7,12, +-6,-2, +78,0, +-4,-43, +-68,52, +-52,-81, +7,-32, +17,-94, +10,-26, +36,0, +-1,-5, +-58,214, +77,105, +-65,5, +-33,81, +-98,-34, +48,6, +-6,-84, +31,-28, +4,22, +-44,6, +-33,-136, +19,47, +60,91, +16,22, +-4,17, +46,-66, +34,-45, +99,38, +-27,-45, +-53,-22, +189,27, +21,19, +-57,91, +6,70, +83,80, +34,-38, +18,12, +37,-102, +1,18, +-15,13, +75,-55, +-84,-196, +-56,-107, +-76,13, +27,53, +-1,-17, +-65,45, +-26,-85, +-99,-19, +19,78, +145,106, +136,-114, +-107,82, +82,57, +2,-32, +-47,40, +-59,46, +-141,-36, +-64,33, +116,-2, +-10,20, +-2,96, +-58,-61, +-169,-4, +-18,52, +-161,64, +-81,87, +37,17, +72,-75, +20,-32, +-83,25, +25,-30, +55,-82, +46,-15, +35,-197, +73,114, +38,-133, +99,8, +-50,28, +97,-109, +120,-128, +9,4, +-86,-72, +28,55, +-20,125, +9,139, +101,-31, +148,-75, +-12,-174, +11,13, +39,-69, +91,-43, +8,-62, +108,34, +66,173, +126,-44, +89,-101, +-18,-56, +-46,-1, +-83,56, +57,-14, +48,89, +-92,-28, +10,64, +78,-70, +-183,33, +-74,14, +37,101, +-39,117, +-69,67, +128,-25, +60,-40, +-202,131, +14,34, +-80,-19, +-15,2, +-12,29, +104,42, +-95,104, +76,19, +77,-153, +-65,11, +17,26, +-32,70, +-13,-161, +67,81, +-38,73, +-19,30, +18,-51, +-93,28, +53,77, +101,69, +-6,28, +77,80, +-3,139, +123,-169, +199,-126, +-26,8, +62,-61, +-23,34, +50,69, +-22,-13, +-26,-97, +-51,-101, +53,-32, +-87,37, +136,-108, +-51,-1, +221,-31, +15,-102, +-118,-174, +-39,73, +1,78, +24,89, +131,-118, +-68,-26, +-59,15, +6,63, +-167,-91, +40,14, +170,148, +115,35, +25,-67, +-143,-17, +75,191, +66,109, +67,35, +-42,-229, +35,-158, +60,-125, +11,-37, +55,69, +76,-71, +-12,100, +-98,184, +-31,-170, +168,-19, +34,25, +73,159, +-16,4, +-158,-4, +90,-115, +13,-86, +-102,-95, +-164,-107, +-8,57, +-59,-57, +-66,6, +-145,-40, +36,-120, +79,-62, +63,19, +77,37, +28,181, +-54,-13, +87,31, +-1,161, +126,142, +141,-111, +27,44, +85,41, +-57,67, +-110,-32, +-129,-145, +191,-53, +-21,-52, +-46,130, +-129,31, +-28,-116, +87,-29, +-73,-23, +128,-72, +288,-14, +81,6, +94,-18, +-183,-148, +-184,21, +-11,30, +131,99, +-105,-207, +-132,-190, +15,59, +23,24, +14,126, +-81,39, +81,-22, +61,13, +12,-144, +-225,4, +39,134, +125,50, +143,-51, +11,-53, +67,-252, +11,155, +76,-119, +-31,43, +105,27, +175,51, +-36,-22, +-95,20, +46,-78, +-37,59, +51,-120, +181,-100, +89,-201, +-30,-69, +-190,86, +-13,-179, +-43,-44, +-149,20, +2,-70, +52,124, +-23,19, +-149,-86, +31,76, +9,-38, +117,-57, +-201,152, +93,-42, +143,-106, +-11,35, +-133,-46, +-47,1, +-36,-80, +-20,126, +64,-58, +-100,175, +-104,96, +-7,-2, +79,-154, +-112,41, +-156,92, +-88,-79, +-99,148, +68,149, +-37,-1, +53,-70, +-105,101, +24,6, +-110,-120, +22,72, +-43,175, +61,-90, +198,-83, +-30,-102, +-140,-219, +-120,-22, +112,-89, +102,-78, +-32,-102, +166,55, +51,-60, +233,-147, +-2,-168, +-197,10, +-193,-14, +21,27, +-60,55, +136,29, +143,-196, +84,-90, +42,-31, +37,9, +-68,-200, +251,-18, +-127,-59, +272,-99, +80,-65, +-43,6, +39,30, +68,69, +23,-168, +32,-56, +-89,194, +-199,95, +-13,213, +69,74, +-89,182, +42,43, +-102,-146, +-77,14, +106,-3, +-55,170, +-78,224, +33,-17, +-28,-74, +-120,107, +27,-119, +-30,-17, +7,-269, +-216,-78, +68,172, +91,129, +13,-52, +-90,107, +22,-7, +-78,-51, +176,303, +326,-17, +108,-63, +-100,14, +105,24, +9,-115, +123,13, +-45,-39, +-53,-203, +-188,30, +-69,157, +-114,-213, +4,-98, +60,-56, +-18,51, +50,-57, +17,-197, +69,12, +93,-10, +-148,-58, +-149,-69, +42,-50, +45,65, +140,66, +-85,-5, +21,-22, +145,-76, +108,56, +-170,-1, +91,242, +-115,-62, +-269,24, +-167,-25, +-213,75, +109,-72, +89,-62, +23,26, +237,-41, +-12,77, +40,178, +-36,-56, +96,-86, +-59,-39, +7,55, +30,-5, +-75,-91, +-243,-146, +-40,-109, +-47,68, +-71,-112, +61,-174, +123,-71, +-72,48, +120,-20, +59,286, +291,12, +-50,172, +36,-9, +-112,-23, +-138,-70, +-56,118, +-36,-107, +-47,-129, +-166,221, +-126,183, +74,-52, +-128,-7, +159,109, +-155,-252, +157,-18, +29,-4, +76,-78, +-91,4, +50,12, +-94,82, +-49,-98, +195,100, +-50,115, +81,45, +100,-46, +67,-294, +-192,-105, +-8,-28, +-89,-177, +154,90, +-159,15, +219,27, +-6,121, +-42,-56, +-30,-60, +-309,-74, +60,5, +-9,31, +-38,-140, +-90,69, +-85,-248, +-102,165, +11,-99, +-77,7, +-50,-121, +-41,-53, +-14,92, +39,-16, +83,-16, +-24,-142, +-194,-122, +158,-86, +277,-104, +-91,13, +-21,-37, +-79,-150, +-93,39, +-29,-38, +-70,-44, +162,257, +-306,112, +243,13, +-72,-317, +-103,146, +32,-87, +-102,182, +26,236, +-256,-15, +-5,-32, +10,-141, +22,-43, +-81,107, +54,-57, +73,120, +-76,-57, +30,-129, +-205,160, +428,-92, +21,-84, +82,-42, +-49,-74, +-61,51, +-149,-143, +-93,-50, +-74,-68, +173,-38, +77,-239, +39,-60, +69,-62, +78,155, +-4,22, +-69,134, +8,13, +139,132, +-89,205, +162,-14, +193,-9, +-99,208, +20,74, +60,98, +113,71, +-1,68, +188,122, +-35,4, +-16,17, +12,-84, +132,-54, +193,36, +-133,-71, +83,-16, +-215,-126, +-3,151, +-143,211, +-132,29, +-164,120, +29,84, +31,-37, +-132,-6, +52,-47, +120,77, +-5,33, +-69,-103, +102,116, +111,-101, +55,120, +18,28, +27,57, +-4,16, +34,351, +-126,43, +-41,-168, +-181,-21, +96,-28, +185,113, +-38,64, +28,7, +-79,-100, +-8,-134, +19,33, +23,-67, +-297,299, +-161,-229, +72,-169, +-174,168, +198,31, +-85,56, +-2,-120, +-121,-125, +-42,29, +113,-7, +-71,-129, +118,-44, +-6,76, +-93,137, +-96,-155, +-84,110, +71,-121, +-6,216, +-165,-73, +-361,138, +74,-73, +114,-162, +82,57, +48,6, +-106,77, +10,80, +-47,-47, +196,131, +-38,-63, +15,4, +-16,275, +172,-308, +-75,-40, +29,75, +102,-46, +-70,78, +-24,109, +168,-63, +42,39, +70,-121, +110,213, +-268,-32, +187,-186, +-87,-106, +-23,-169, +-4,70, +96,-173, +175,-74, +133,-94, +-6,184, +62,18, +119,-39, +61,-33, +-133,-70, +207,-359, +-51,248, +-78,-93, +73,-19, +-108,129, +-100,-41, +-25,13, +-84,-38, +168,-45, +33,-212, +71,41, +168,-61, +206,-63, +96,-25, +-51,-109, +82,-166, +19,-69, +-129,-13, +-107,-143, +159,-104, +108,-97, +191,42, +22,97, +-98,-19, +25,-154, +-195,-75, +-104,9, +246,-110, +-180,133, +31,-163, +92,-44, +-28,29, +120,-73, +-93,-46, +-270,8, +-33,-158, +71,-161, +-86,203, +-123,16, +-31,-89, +166,-89, +-11,40, +-88,5, +106,-291, +114,92, +-200,-24, +-232,-207, +-99,116, +-56,-101, +-117,-17, +132,-99, +32,79, +168,121, +-203,18, +70,-9, +41,-80, +-27,-41, +-119,26, +49,-61, +26,183, +-69,-211, +14,28, +134,-30, +35,-22, +-94,-29, +-31,71, +157,128, +134,149, +31,-219, +-239,-12, +185,99, +-3,-175, +-108,23, +-179,52, +-29,-213, +34,-30, +-31,103, +-101,-168, +231,211, +0,-13, +-27,-48, +95,-27, +20,-182, +-54,-12, +21,-9, +-20,12, +-42,-208, +-65,33, +147,77, +39,-21, +86,12, +140,123, +-41,20, +-121,-74, +-62,89, +47,-107, +-15,65, +198,-30, +46,198, +-179,-15, +243,-29, +94,108, +78,5, +324,-313, +220,110, +188,6, +43,158, +-13,42, +-50,198, +96,26, +25,19, +-194,52, +-109,-163, +-168,-167, +69,-175, +6,0, +-12,-88, +13,-1, +114,-60, +-85,-239, +111,209, +-113,-34, +2,-145, +72,123, +-263,145, +-6,217, +0,-38, +-61,108, +-161,137, +97,117, +-233,-310, +-245,101, +108,-73, +-195,180, +-179,159, +45,181, +241,-160, +50,115, +-234,-88, +-191,-4, +109,-370, +-76,51, +-103,72, +-16,0, +236,219, +104,124, +132,122, +-143,-87, +36,140, +111,49, +21,-95, +-97,-20, +40,9, +-177,288, +-214,54, +-141,-56, +122,13, +-67,70, +35,144, +-189,-73, +-86,142, +-190,62, +-85,-3, +-177,108, +58,12, +-62,-49, +-108,-20, +24,-137, +-170,37, +-295,60, +-101,56, +96,-116, +8,-247, +44,84, +43,130, +31,139, +-57,-4, +-62,41, +102,-100, +-127,169, +50,-15, +9,121, +59,-42, +-175,14, +107,65, +-80,-129, +-97,58, +269,3, +-31,-84, +83,-64, +60,-37, +-27,-29, +341,-35, +257,-47, +165,-52, +-68,167, +36,-225, +-8,123, +3,-46, +100,27, +11,129, +-68,215, +-127,130, +-236,-113, +-249,-89, +45,6, +129,14, +152,-17, +-67,223, +-56,-29, +127,125, +-44,-94, +187,-88, +167,-39, +11,100, +21,-21, +66,23, +-88,-44, +48,83, +-94,137, +-80,174, +135,107, +-151,-65, +-45,-26, +240,-282, +-26,-89, +100,-22, +-290,-60, +-97,-224, +-14,13, +-127,-117, +-71,120, +8,-15, +83,-91, +133,332, +-145,138, +166,-85, +64,109, +-16,102, +75,-42, +-178,16, +49,-148, +375,76, +87,-183, +132,160, +-99,-41, +-72,-154, +-24,-143, +-9,-31, +-3,52, +53,65, +46,-131, +43,-152, +-34,-69, +-133,69, +226,-147, +56,-76, +-162,-29, +191,14, +-41,93, +71,145, +-15,-52, +-89,152, +-64,-248, +84,93, +60,-127, +-126,92, +-116,106, +76,-35, +-59,157, +-65,62, +-61,-60, +-115,50, +-107,189, +-199,49, +-31,8, +49,150, +194,-60, +83,33, +-93,-164, +-38,-57, +-73,-50, +-323,-115, +91,-5, +-258,103, +-207,-14, +-37,-51, +131,-28, +140,26, +-101,88, +-56,132, +80,-149, +178,-179, +180,-222, +13,38, +114,-400, +-32,-52, +-107,-2, +104,-50, +-10,69, +-145,-16, +125,146, +183,13, +0,54, +-91,-110, +-87,131, +259,205, +47,-38, +-111,19, +-110,23, +161,-185, +126,46, +138,56, +-58,-13, +217,-101, +144,128, +215,-84, +-7,-113, +-74,151, +-41,-52, +-40,-137, +52,-109, +-211,-33, +149,-74, +145,-129, +25,-138, +88,-62, +54,-36, +246,27, +142,31, +-243,230, +122,-88, +-226,-50, +61,-94, +132,-55, +48,71, +41,-42, +33,107, +-33,22, +126,-34, +-9,27, +-136,71, +-153,57, +281,-101, +-98,54, +18,202, +182,-51, +-43,56, +-12,99, +76,28, +14,53, +-17,51, +273,158, +30,-322, +55,104, +-46,-87, +-5,236, +-190,83, +4,-7, +318,182, +134,115, +-59,-74, +-28,7, +-64,49, +-74,-22, +-221,4, +212,124, +-23,135, +-93,94, +-139,-211, +87,-178, +-63,-98, +193,-122, +14,134, +41,-62, +120,-21, +59,-50, +-51,81, +-23,208, +29,63, +-30,-94, +-96,134, +298,-89, +108,1, +-184,83, +-62,33, +53,15, +24,101, +17,-51, +-28,175, +1,194, +18,123, +285,-207, +-32,-20, +14,85, +-28,-123, +-27,51, +186,290, +128,-76, +14,152, +-18,-217, +49,-29, +47,151, +-2,-49, +32,-4, +94,15, +179,21, +-100,-48, +100,-127, +-153,178, +-34,-108, +-11,-33, +-272,-232, +23,-138, +-179,-127, +63,-146, +-144,75, +-8,-85, +-200,-102, +72,129, +-388,88, +-280,6, +89,-37, +-157,120, +188,36, +243,27, +-23,-160, +-90,40, +72,193, +153,201, +109,-84, +170,-1, +-133,-11, +30,88, +-95,223, +-77,9, +65,-62, +-226,181, +-76,56, +88,79, +-52,165, +58,-55, +47,-107, +-167,-88, +17,77, +-49,46, +-13,39, +-61,57, +63,-66, +-79,60, +97,140, +-42,65, +102,-16, +55,-14, +-146,160, +57,-66, +-13,-119, +-51,-148, +-3,-151, +144,-24, +-78,110, +254,63, +-19,-17, +203,58, +-93,-49, +-42,-19, +-65,73, +-10,-34, +107,58, +28,-211, +-158,-95, +47,13, +72,-21, +18,30, +43,-88, +-17,22, +68,-64, +-69,-83, +-28,111, +91,-49, +176,-47, +-114,163, +29,0, +-140,-38, +134,-9, +150,29, +-49,-98, +108,-85, +-2,-304, +64,41, +6,-30, +106,65, +129,95, +45,51, +-138,-13, +-128,79, +-78,-103, +85,-72, +-39,-47, +-35,-98, +106,62, +114,190, +198,-64, +-15,102, +156,-176, +-135,78, +-3,33, +-75,-7, +-43,119, +-46,-124, +-106,-94, +-21,47, +8,241, +32,13, +17,50, +91,-84, +118,1, +16,9, +-131,-90, +-33,-14, +26,168, +-39,-47, +90,-19, +65,-31, +-33,-78, +117,29, +213,130, +-10,179, +27,-134, +-228,18, +-44,-27, +-111,43, +-102,25, +70,70, +-95,-22, +-178,-35, +7,-12, +-112,-81, +50,-54, +-78,-160, +241,143, +51,236, +-31,77, +199,-89, +-65,-142, +-41,88, +-17,-18, +-23,-21, +-68,1, +-175,28, +235,27, +132,-24, +-315,-42, +-66,-101, +101,-14, +158,-189, +-1,11, +-26,80, +-197,191, +-37,2, +16,30, +26,149, +52,-6, +110,-27, +-47,-69, +40,146, +-55,-41, +63,62, +32,-4, +132,66, +138,109, +79,-202, +-76,69, +-5,90, +10,164, +14,-149, +218,-34, +-54,13, +-45,-38, +-20,143, +26,-26, +80,-20, +16,41, +-34,59, +30,22, +132,84, +23,-18, +103,7, +100,132, +-24,-219, +-3,-72, +112,35, +-130,-93, +166,-173, +-96,102, +171,-14, +-144,-26, +172,46, +-47,-56, +-213,-32, +84,43, +59,-14, +-67,67, +-21,17, +108,14, +-25,147, +-44,125, +-115,-42, +86,-141, +-142,217, +-3,-89, +205,-68, +-137,-149, +-21,-103, +-45,-50, +145,78, +-160,-92, +-13,62, +-14,27, +-71,38, +63,1, +129,-35, +-6,-18, +147,6, +11,141, +-122,92, +6,50, +-22,-51, +-57,-60, +197,-31, +103,-7, +-22,51, +7,145, +1,19, +-78,63, +78,6, +97,-70, +-115,-60, +101,9, +-28,-85, +-56,171, +-54,-192, +-114,7, +-221,85, +155,57, +-13,-99, +-10,-64, +-73,101, +124,-220, +107,49, +55,134, +14,-84, +-9,-57, +96,146, +-30,-65, +-55,-98, +45,-18, +-38,-6, +-36,133, +95,-151, +-37,216, +-85,-119, +-79,92, +13,-24, +-113,31, +-55,9, +-53,51, +111,84, +-5,83, +-19,35, +107,76, +31,-29, +2,-11, +-1,74, +39,54, +-11,-50, +102,-65, +-45,68, +-83,18, +7,153, +-16,-35, +216,-63, +-68,41, +-41,-9, +-31,126, +130,136, +12,28, +-60,-20, +131,87, +-32,-105, +44,49, +-74,68, +30,30, +81,22, +61,54, +3,-104, +92,-83, +178,-76, +-118,35, +-48,83, +-77,158, +-39,-162, +-69,-143, +16,50, +-3,151, +25,-23, +22,-196, +-53,81, +31,-12, +13,-138, +-42,115, +-138,5, +103,44, +192,77, +36,59, +-12,111, +-141,-135, +-7,60, +-12,-93, +-48,-97, +2,-43, +45,-22, +33,-3, +-14,-97, +65,-113, +-93,-6, +2,-163, +51,122, +154,120, +-24,44, +-28,32, +-17,31, +-66,24, +53,37, +36,-24, +31,-30, +-51,-50, +-32,-33, +12,101, +-7,73, +-72,-3, +127,19, +85,34, +70,-57, +-87,-36, +-37,-51, +-6,-38, +86,-9, +-6,-84, +-28,31, +66,-43, +-155,138, +134,18, +55,141, +14,56, +5,-40, +-76,4, +-72,22, +13,-12, +-39,-128, +43,-51, +36,6, +35,87, +39,75, +53,15, +-112,-9, +-35,93, +-178,-46, +-9,64, +22,63, +-20,35, +-46,33, +67,-133, +23,62, +13,29, +-5,81, +-9,-13, +27,-37, +-68,-1, +-30,63, +39,-45, +-79,41, +46,73, +7,-42, +-108,-24, +-44,-18, +-59,52, +64,31, +-12,-59, +0,-58, +3,44, +-21,-37, +36,175, +23,-32, +48,98, +9,-3, +-94,30, +-98,-33, +-63,7, +-8,-19, +21,-2, +76,-38, +-64,63, +38,57, +121,-82, +-16,85, +-10,-34, +31,-26, +17,-2, +20,12, +50,-92, +-32,25, +-116,-35, +51,-4, +32,75, +36,-40, +101,-46, +10,-15, +12,-107, +27,39, +56,-12, +92,-119, +8,80, +-69,1, +36,65, +55,111, +116,30, +12,-86, +-47,40, +-54,122, +90,14, +17,64, +-8,-85, +0,-103, +69,-118, +17,-122, +-12,70, +-34,-130, +-29,6, +16,-35, +-116,11, +-89,-130, +-24,12, +-134,-94, +53,-26, +9,29, +-1,-99, +-76,81, +46,16, +14,56, +-64,32, +69,-11, +7,11, +-33,46, +16,-20, +-102,-9, +123,99, +48,41, +27,14, +-12,-5, +-4,-38, +-3,55, +-58,49, +-7,82, +156,-53, +16,13, +26,8, +15,-6, +16,43, +19,-38, +34,-84, +-20,66, +14,96, +-16,3, +27,-61, +-6,50, +80,-22, +66,-39, +-40,60, +-33,27, +46,3, +-40,67, +29,-9, +-71,59, +-98,-22, +-27,-24, +-19,-72, +83,50, +58,-3, +-21,8, +2,-103, +35,7, +-30,-9, +-6,-39, +53,67, +35,117, +34,9, +34,-78, +26,-16, +90,30, +-110,-58, +15,96, +-40,45, +77,11, +-4,14, +12,28, +52,-34, +-9,33, +19,35, +41,-12, +36,38, +-29,5, +-5,25, +56,-92, +-11,12, +-9,32, +26,12, +1,-12, +33,18, +-19,37, +5,30, +-24,-7, +-60,16, +33,-97, +17,46, +54,-17, +-11,66, +-5,90, +-25,-42, +-40,35, +-46,79, +-27,-19, +-6,5, +-32,-40, +-66,19, +20,-25, +12,-28, +-18,16, +-17,36, +10,91, +6,15, +-39,35, +48,-4, +-15,74, +-31,29, +-10,-22, +5,-46, +6,38, +41,37, +45,24, +-13,-67, +-27,12, +56,73, +-6,4, +35,-20, +-10,1, +1,4, +8,-4, +-56,-15, +-41,10, +-77,41, +15,18, +-97,63, +-25,28, +38,-31, +22,-8, +-1,18, +7,52, +-27,-14, +2,-77, +29,-13, +-6,-56, +-25,-8, +-14,-65, +-24,-6, +-17,2, +-33,-5, +34,53, +-3,37, +19,-46, +20,-18, +28,-41, +25,-29, +-13,-9, +10,-22, +29,-7, +20,7, +-6,-11, +27,-45, +14,19, +-67,28, +46,-30, +-46,-12, +28,9, +29,-20, +12,44, +4,-12, +7,1, +-35,6, +-16,25, +3,12, +-2,-43, +-49,22, +-11,23, +4,-14, +9,16, +1,3, +-33,-24, +-40,-4, +16,-2, +-5,-23, +10,77, +-37,35, +23,9, +-36,1, +6,-29, +33,19, +-8,25, +3,-9, +36,20, +24,-10, +24,29, +-17,6, +-2,-27, +29,-7, +-46,-10, +-14,-27, +-12,-17, +-7,-36, +-25,53, +-19,2, +-39,-4, +13,4, +12,-18, +21,11, +31,-9, +8,-23, +-1,19, +-8,-5, +14,-3, +0,17, +3,20, +-17,13, +-6,24, +-4,-11, +32,5, +-5,-3, +21,2, +-2,38, +-8,-5, +-5,-33, +-12,-29, +4,-18, +41,-13, +14,8, +-8,8, +19,0, +-17,3, +7,-1, +-12,-1, +17,8, +-15,49, +-7,18, +6,17, +-10,-1, +-11,-2, +0,24, +-3,-2, +-4,9, +8,-7, +-14,-10, +8,11, +8,-17, +-13,14, +24,-1, +-1,-4, +0,-4, +-4,10, +10,-15, +1,0, +21,16, +2,-8, +-18,5, +-14,12, +9,-14, +5,-25, +-5,-6, +3,-8, +-15,-4, +0,0, +9,-7, +-4,-1, +6,-14, +9,-8, +-3,-13, +9,-1, +1,-11, +7,8, +1,1, +-3,-5, +4,-17, +11,-4, +12,-5, +-13,0, +0,0, +7,5, +-3,0, +5,-1, +0,-3, +8,14, +6,6, +6,0, +-1,-5, +-1,0, +-3,-2, +-16,-2, +10,-10, +-2,-1, +-5,11, +5,1, +10,-9, +-4,1, +7,-2, +-3,-5, +-5,-3, +0,-2, +8,0, +-4,-3, +3,1, +4,-2, +0,-1, +2,-1, +2,1, +-4,0, +2,-1, +3,1, +-6,0, +3,0, +3,0, +-6,0, +3,0, +3,0, +-6,0, +3,-1, +2,1, +-4,0, +2,-1, +2,1, +0,1, +4,2, +3,-1, +-4,3, +8,0, +0,2, +-5,3, +-3,5, +7,2, +-4,-1, +10,9, +5,-1, +-5,-11, +-2,1, +10,10, +-16,2, +-3,2, +-1,0, +-1,5, +6,0, +6,-6, +8,-14, +0,3, +5,1, +-3,0, +7,-5, +0,0, +-13,0, +12,5, +11,4, +4,17, +-3,5, +1,-1, +7,-8, +1,11, +9,1, +-3,13, +9,8, +6,14, +-4,1, +9,7, +0,0, +-15,4, +3,8, +-5,6, +5,25, +9,14, +-14,-12, +-18,-5, +2,8, +21,-16, +1,0, +10,15, +-4,-10, +0,4, +-1,4, +24,1, +-13,-14, +8,17, +8,-11, +-14,10, +8,7, +-4,-9, +-3,2, +0,-24, +-11,2, +-10,1, +6,-17, +-7,-18, +-15,-49, +17,-8, +-12,1, +7,1, +-17,-3, +19,0, +-8,-8, +14,-8, +41,13, +4,18, +-12,29, +-5,33, +-8,5, +-2,-38, +21,-2, +-5,3, +32,-5, +-4,11, +-6,-24, +-17,-13, +3,-20, +0,-17, +14,3, +-8,5, +-1,-19, +8,23, +31,9, +21,-11, +12,18, +13,-4, +-39,4, +-19,-2, +-25,-53, +-7,36, +-12,17, +-14,27, +-46,10, +29,7, +-2,27, +-17,-6, +24,-29, +24,10, +36,-20, +3,9, +-8,-25, +33,-19, +6,29, +-36,-1, +23,-9, +-37,-35, +10,-77, +-5,23, +16,2, +-40,4, +-33,24, +1,-3, +9,-16, +4,14, +-11,-23, +-49,-22, +-2,43, +3,-12, +-16,-25, +-35,-6, +7,-1, +4,12, +12,-44, +29,20, +28,-9, +-46,12, +46,30, +-67,-28, +14,-19, +27,45, +-6,11, +20,-7, +29,7, +10,22, +-13,9, +25,29, +28,41, +20,18, +19,46, +-3,-37, +34,-53, +-33,5, +-17,-2, +-24,6, +-14,65, +-25,8, +-6,56, +29,13, +2,77, +-27,14, +7,-52, +-1,-18, +22,8, +38,31, +-25,-28, +-97,-63, +15,-18, +-77,-41, +-41,-10, +-56,15, +8,4, +1,-4, +-10,-1, +35,20, +-6,-4, +56,-73, +-27,-12, +-13,67, +45,-24, +41,-37, +6,-38, +5,46, +-10,22, +-31,-29, +-15,-74, +48,4, +-39,-35, +6,-15, +10,-91, +-17,-36, +-18,-16, +12,28, +20,25, +-66,-19, +-32,40, +-6,-5, +-27,19, +-46,-79, +-40,-35, +-25,42, +-5,-90, +-11,-66, +54,17, +17,-46, +33,97, +-60,-16, +-24,7, +5,-30, +-19,-37, +33,-18, +1,12, +26,-12, +-9,-32, +-11,-12, +56,92, +-5,-25, +-29,-5, +36,-38, +41,12, +19,-35, +-9,-33, +52,34, +12,-28, +-4,-14, +77,-11, +-40,-45, +15,-96, +-110,58, +90,-30, +26,16, +34,78, +34,-9, +35,-117, +53,-67, +-6,39, +-30,9, +35,-7, +2,103, +-21,-8, +58,3, +83,-50, +-19,72, +-27,24, +-98,22, +-71,-59, +29,9, +-40,-67, +46,-3, +-33,-27, +-40,-60, +66,39, +80,22, +-6,-50, +27,61, +-16,-3, +14,-96, +-20,-66, +34,84, +19,38, +16,-43, +15,6, +26,-8, +16,-13, +156,53, +-7,-82, +-58,-49, +-3,-55, +-4,38, +-12,5, +27,-14, +48,-41, +123,-99, +-102,9, +16,20, +-33,-46, +7,-11, +69,11, +-64,-32, +14,-56, +46,-16, +-76,-81, +-1,99, +9,-29, +53,26, +-134,94, +-24,-12, +-89,130, +-116,-11, +16,35, +-29,-6, +-34,130, +-12,-70, +17,122, +69,118, +0,103, +-8,85, +17,-64, +90,-14, +-54,-122, +-47,-40, +12,86, +116,-30, +55,-111, +36,-65, +-69,-1, +8,-80, +92,119, +56,12, +27,-39, +12,107, +10,15, +101,46, +36,40, +32,-75, +51,4, +-116,35, +-32,-25, +50,92, +20,-12, +17,2, +31,26, +-10,34, +-16,-85, +121,82, +38,-57, +-64,-63, +76,38, +21,2, +-8,19, +-63,-7, +-98,33, +-94,-30, +9,3, +48,-98, +23,32, +36,-175, +-21,37, +3,-44, +0,58, +-12,59, +64,-31, +-59,-52, +-44,18, +-108,24, +7,42, +46,-73, +-79,-41, +39,45, +-30,-63, +-68,1, +27,37, +-9,13, +-5,-81, +13,-29, +23,-62, +67,133, +-46,-33, +-20,-35, +22,-63, +-9,-64, +-178,46, +-35,-93, +-112,9, +53,-15, +39,-75, +35,-87, +36,-6, +43,51, +-39,128, +13,12, +-72,-22, +-76,-4, +5,40, +14,-56, +55,-141, +134,-18, +-155,-138, +66,43, +-28,-31, +-6,84, +86,9, +-6,38, +-37,51, +-87,36, +70,57, +85,-34, +127,-19, +-72,3, +-7,-73, +12,-101, +-32,33, +-51,50, +31,30, +36,24, +53,-37, +-66,-24, +-17,-31, +-28,-32, +-24,-44, +154,-120, +51,-122, +2,163, +-93,6, +65,113, +-14,97, +33,3, +45,22, +2,43, +-48,97, +-12,93, +-7,-60, +-141,135, +-12,-111, +36,-59, +192,-77, +103,-44, +-138,-5, +-42,-115, +13,138, +31,12, +-53,-81, +22,196, +25,23, +-3,-151, +16,-50, +-69,143, +-39,162, +-77,-158, +-48,-83, +-118,-35, +178,76, +92,83, +3,104, +61,-54, +81,-22, +30,-30, +-74,-68, +44,-49, +-32,105, +131,-87, +-60,20, +12,-28, +130,-136, +-31,-126, +-41,9, +-68,-41, +216,63, +-16,35, +7,-153, +-83,-18, +-45,-68, +102,65, +-11,50, +39,-54, +-1,-74, +2,11, +31,29, +107,-76, +-19,-35, +-5,-83, +111,-84, +-53,-51, +-55,-9, +-113,-31, +13,24, +-79,-92, +-85,119, +-37,-216, +95,151, +-36,-133, +-38,6, +45,18, +-55,98, +-30,65, +96,-146, +-9,57, +14,84, +55,-134, +107,-49, +124,220, +-73,-101, +-10,64, +-13,99, +155,-57, +-221,-85, +-114,-7, +-54,192, +-56,-171, +-28,85, +101,-9, +-115,60, +97,70, +78,-6, +-78,-63, +1,-19, +7,-145, +-22,-51, +103,7, +197,31, +-57,60, +-22,51, +6,-50, +-122,-92, +11,-141, +147,-6, +-6,18, +129,35, +63,-1, +-71,-38, +-14,-27, +-13,-62, +-160,92, +145,-78, +-45,50, +-21,103, +-137,149, +205,68, +-3,89, +-142,-217, +86,141, +-115,42, +-44,-125, +-25,-147, +108,-14, +-21,-17, +-67,-67, +59,14, +84,-43, +-213,32, +-47,56, +172,-46, +-144,26, +171,14, +-96,-102, +166,173, +-130,93, +112,-35, +-3,72, +-24,219, +100,-132, +103,-7, +23,18, +132,-84, +30,-22, +-34,-59, +16,-41, +80,20, +26,26, +-20,-143, +-45,38, +-54,-13, +218,34, +14,149, +10,-164, +-5,-90, +-76,-69, +79,202, +138,-109, +132,-66, +32,4, +63,-62, +-55,41, +40,-146, +-47,69, +110,27, +52,6, +26,-149, +16,-30, +-37,-2, +-197,-191, +-26,-80, +-1,-11, +158,189, +101,14, +-66,101, +-315,42, +132,24, +235,-27, +-175,-28, +-68,-1, +-23,21, +-17,18, +-41,-88, +-65,142, +199,89, +-31,-77, +51,-236, +241,-143, +-78,160, +50,54, +-112,81, +7,12, +-178,35, +-95,22, +70,-70, +-102,-25, +-111,-43, +-44,27, +-228,-18, +27,134, +-10,-179, +213,-130, +117,-29, +-33,78, +65,31, +90,19, +-39,47, +26,-168, +-33,14, +-131,90, +16,-9, +118,-1, +91,84, +17,-50, +32,-13, +8,-241, +-21,-47, +-106,94, +-46,124, +-43,-119, +-75,7, +-3,-33, +-135,-78, +156,176, +-15,-102, +198,64, +114,-190, +106,-62, +-35,98, +-39,47, +85,72, +-78,103, +-128,-79, +-138,13, +45,-51, +129,-95, +106,-65, +6,30, +64,-41, +-2,304, +108,85, +-49,98, +150,-29, +134,9, +-140,38, +29,0, +-114,-163, +176,47, +91,49, +-28,-111, +-69,83, +68,64, +-17,-22, +43,88, +18,-30, +72,21, +47,-13, +-158,95, +28,211, +107,-58, +-10,34, +-65,-73, +-42,19, +-93,49, +203,-58, +-19,17, +254,-63, +-78,-110, +144,24, +-3,151, +-51,148, +-13,119, +57,66, +-146,-160, +55,14, +102,16, +-42,-65, +97,-140, +-79,-60, +63,66, +-61,-57, +-13,-39, +-49,-46, +17,-77, +-167,88, +47,107, +58,55, +-52,-165, +88,-79, +-76,-56, +-226,-181, +65,62, +-77,-9, +-95,-223, +30,-88, +-133,11, +170,1, +109,84, +153,-201, +72,-193, +-90,-40, +-23,160, +243,-27, +188,-36, +-157,-120, +89,37, +-280,-6, +-388,-88, +72,-129, +-200,102, +-8,85, +-144,-75, +63,146, +-179,127, +23,138, +-272,232, +-11,33, +-34,108, +-153,-178, +100,127, +-100,48, +179,-21, +94,-15, +32,4, +-2,49, +47,-151, +49,29, +-18,217, +14,-152, +128,76, +186,-290, +-27,-51, +-28,123, +14,-85, +-32,20, +285,207, +18,-123, +1,-194, +-28,-175, +17,51, +24,-101, +53,-15, +-62,-33, +-184,-83, +108,-1, +298,89, +-96,-134, +-30,94, +29,-63, +-23,-208, +-51,-81, +59,50, +120,21, +41,62, +14,-134, +193,122, +-63,98, +87,178, +-139,211, +-93,-94, +-23,-135, +212,-124, +-221,-4, +-74,22, +-64,-49, +-28,-7, +-59,74, +134,-115, +318,-182, +4,7, +-190,-83, +-5,-236, +-46,87, +55,-104, +30,322, +273,-158, +-17,-51, +14,-53, +76,-28, +-12,-99, +-43,-56, +182,51, +18,-202, +-98,-54, +281,101, +-153,-57, +-136,-71, +-9,-27, +126,34, +-33,-22, +33,-107, +41,42, +48,-71, +132,55, +61,94, +-226,50, +122,88, +-243,-230, +142,-31, +246,-27, +54,36, +88,62, +25,138, +145,129, +149,74, +-211,33, +52,109, +-40,137, +-41,52, +-74,-151, +-7,113, +215,84, +144,-128, +217,101, +-58,13, +138,-56, +126,-46, +161,185, +-110,-23, +-111,-19, +47,38, +259,-205, +-87,-131, +-91,110, +0,-54, +183,-13, +125,-146, +-145,16, +-10,-69, +104,50, +-107,2, +-32,52, +114,400, +13,-38, +180,222, +178,179, +80,149, +-56,-132, +-101,-88, +140,-26, +131,28, +-37,51, +-207,14, +-258,-103, +91,5, +-323,115, +-73,50, +-38,57, +-93,164, +83,-33, +194,60, +49,-150, +-31,-8, +-199,-49, +-107,-189, +-115,-50, +-61,60, +-65,-62, +-59,-157, +76,35, +-116,-106, +-126,-92, +60,127, +84,-93, +-64,248, +-89,-152, +-15,52, +71,-145, +-41,-93, +191,-14, +-162,29, +56,76, +226,147, +-133,-69, +-34,69, +43,152, +46,131, +53,-65, +-3,-52, +-9,31, +-24,143, +-72,154, +-99,41, +132,-160, +87,183, +375,-76, +49,148, +-178,-16, +75,42, +-16,-102, +64,-109, +166,85, +-145,-138, +133,-332, +83,91, +8,15, +-71,-120, +-127,117, +-14,-13, +-97,224, +-290,60, +100,22, +-26,89, +240,282, +-45,26, +-151,65, +135,-107, +-80,-174, +-94,-137, +48,-83, +-88,44, +66,-23, +21,21, +11,-100, +167,39, +187,88, +-44,94, +127,-125, +-56,29, +-67,-223, +152,17, +129,-14, +45,-6, +-249,89, +-236,113, +-127,-130, +-68,-215, +11,-129, +100,-27, +3,46, +-8,-123, +36,225, +-68,-167, +165,52, +257,47, +341,35, +-27,29, +60,37, +83,64, +-31,84, +269,-3, +-97,-58, +-80,129, +107,-65, +-175,-14, +59,42, +9,-121, +50,15, +-127,-169, +102,100, +-62,-41, +-57,4, +31,-139, +43,-130, +44,-84, +8,247, +96,116, +-101,-56, +-295,-60, +-170,-37, +24,137, +-108,20, +-62,49, +58,-12, +-177,-108, +-85,3, +-190,-62, +-86,-142, +-189,73, +35,-144, +-67,-70, +122,-13, +-141,56, +-214,-54, +-177,-288, +40,-9, +-97,20, +21,95, +111,-49, +36,-140, +-143,87, +132,-122, +104,-124, +236,-219, +-16,0, +-103,-72, +-76,-51, +109,370, +-191,4, +-234,88, +50,-115, +241,160, +45,-181, +-179,-159, +-195,-180, +108,73, +-245,-101, +-233,310, +97,-117, +-161,-137, +-61,-108, +0,38, +-6,-217, +-263,-145, +72,-123, +2,145, +-113,34, +111,-209, +-85,239, +114,60, +13,1, +-12,88, +11,0, +12,-158, +67,76, +28,-1, +-85,89, +-139,-27, +-104,26, +-207,-56, +-98,18, +-71,-352, +-124,290, +-92,1, +2,-64, +18,-173, +31,5, +-16,-155, +-145,-1, +143,-75, +134,-165, +-82,148, +27,19, +50,33, +128,63, +-35,29, +148,-45, +-1,-62, +-88,-88, +-80,-168, +111,91, +-122,-164, +68,170, +97,-12, +-149,181, +140,99, +-113,104, +128,124, +305,138, +151,86, +98,78, +-130,-82, +-289,105, +-20,25, +-82,-173, +165,3, +-120,-106, +22,301, +160,-41, +71,201, +92,-112, +44,179, +71,115, +133,-18, +-106,-118, +-2,-157, +235,169, +-152,-21, +-1,150, +-178,-166, +-49,33, +-53,115, +118,-92, +-110,-56, +61,-41, +11,8, +-161,-104, +-73,258, +30,-74, +84,85, +-91,67, +-76,57, +-195,-135, +75,-12, +-100,54, +50,-6, +44,17, +40,-205, +68,200, +124,-131, +40,218, +-31,193, +-10,12, +151,-97, +229,-149, +29,204, +28,-83, +206,-284, +-67,-43, +-71,-111, +-76,84, +50,153, +-86,-6, +-10,234, +-99,-198, +11,-163, +-175,176, +-69,75, +-112,-174, +95,45, +130,188, +58,-6, +-131,97, +133,23, +11,42, +35,115, +-194,-130, +168,-202, +-4,15, +116,226, +-149,109, +102,215, +-337,49, +-53,139, +104,24, +-217,110, +14,31, +-28,-9, +262,-37, +110,-97, +-204,-163, +73,-31, +307,13, +-88,122, +-201,-31, +467,67, +112,47, +229,25, +292,-165, +127,196, +-146,0, +-126,186, +98,131, +92,-258, +144,-126, +-61,65, +-76,-220, +-40,63, +-64,-25, +-87,186, +-59,243, +-150,136, +-152,74, +153,12, +-15,465, +-18,154, +180,128, +104,126, +10,-70, +-80,-25, +-8,-5, +18,262, +-32,91, +301,131, +82,9, +-62,-22, +63,62, +99,20, +-137,-65, +-161,-160, +-35,197, +-270,-10, +190,-3, +165,-20, +-75,-93, +-18,-56, +-161,111, +-90,68, +77,139, +254,-8, +201,24, +-40,161, +138,-88, +-201,-71, +37,-1, +-76,51, +-148,36, +-260,7, +165,-77, +-53,-72, +-63,89, +-11,109, +63,142, +-135,-54, +-11,-144, +-129,157, +88,104, +62,113, +-48,-118, +-30,29, +32,37, +1,-85, +65,-28, +-120,151, +20,9, +-235,-104, +-114,133, +9,124, +-45,25, +-118,132, +-95,93, +47,-177, +127,-61, +-82,-55, +-31,-3, +181,-108, +-105,-51, +294,157, +141,-15, +-2,105, +292,-256, +-113,67, +-116,464, +237,104, +-41,120, +34,-2, +-69,-22, +-28,-66, +176,117, +-106,116, +59,-228, +-28,35, +-63,-16, +121,46, +-59,-24, +-21,-138, +58,-167, +-131,166, +39,28, +-327,-164, +275,-220, +-10,-145, +-20,296, +-93,-29, +177,-168, +-61,-23, +12,-269, +187,-116, +-43,49, +95,328, +52,118, +-15,157, +-101,-78, +-325,-23, +107,-98, +82,-78, +-30,-202, +52,-121, +-63,-158, +-90,249, +-113,24, +-21,-83, +-367,74, +-4,-147, +-63,-107, +-105,9, +-58,59, +354,-53, +-58,-276, +-115,-120, +-7,-121, +-115,126, +12,-30, +61,-215, +90,169, +-31,-16, +-218,37, +191,21, +184,-23, +-7,272, +84,-43, +76,28, +-130,-51, +108,124, +277,44, +-74,69, +-156,-21, +70,38, +-13,20, +14,9, +17,96, +78,-49, +38,80, +31,100, +84,-165, +-200,6, +-94,201, +-106,-78, +140,207, +-74,50, +84,22, +35,-54, +71,223, +-61,-232, +-31,19, +-25,-95, +253,147, +14,186, +197,-112, +55,-184, +81,35, +35,-88, +26,-73, +189,-147, +20,6, +192,56, +-55,92, +44,108, +33,-6, +-150,122, +-7,-216, +48,107, +21,-89, +-67,-82, +93,-5, +-81,-32, +-96,-4, +-18,-106, +-181,-50, +-106,90, +16,68, +49,-74, +-196,-53, +-14,73, +132,231, +-230,26, +126,3, +-60,-156, +134,105, +-27,80, +123,178, +133,-66, +-130,-23, +-47,-4, +-58,-41, +49,-148, +61,115, +-51,174, +-86,29, +132,39, +-156,-30, +85,-132, +60,-1, +67,-90, +-166,-83, +8,54, +12,24, +18,103, +126,-90, +77,-179, +69,-45, +-37,64, +-211,-84, +30,82, +32,-64, +7,232, +-2,88, +59,-83, +-47,-74, +41,-69, +84,143, +-27,-129, +-210,15, +-57,-33, +60,-8, +27,80, +-108,-68, +-113,-17, +-85,94, +64,-126, +-8,-55, +-166,11, +10,93, +-69,-117, +-132,1, +-92,87, +-133,-90, +-72,127, +52,29, +-2,-111, +14,-70, +-63,-99, +284,37, +-19,-29, +-52,-72, +65,319, +-37,175, +-25,55, +-7,46, +62,-69, +126,60, +-39,-24, +162,-172, +-104,-43, +79,-52, +70,-82, +-67,-4, +16,-56, +66,147, +-71,68, +12,44, +-117,-4, +222,3, +169,29, +109,5, +72,237, +25,121, +52,20, +-102,189, +14,63, +8,185, +-65,-43, +37,-87, +-84,-112, +158,9, +128,78, +59,40, +-145,83, +-69,-106, +57,-96, +43,19, +-38,-61, +-33,207, +103,238, +-2,-32, +-159,-101, +39,17, +66,138, +69,-11, +29,169, +71,86, +159,61, +-55,40, +-49,105, +28,-54, +129,-29, +50,-24, +-38,148, +-140,106, +-11,-117, +-8,-65, +135,90, +161,47, +117,5, +26,32, +-60,12, +-126,18, +73,4, +-139,34, +-40,-55, +-101,112, +125,-42, +128,24, +-140,-192, +118,-43, +46,-147, +-31,27, +53,-9, +81,-6, +-267,-45, +58,-23, +-120,95, +-37,-221, +29,68, +-38,-98, +-70,69, +23,-115, +135,-86, +77,60, +-36,46, +131,-28, +18,-6, +-7,-96, +-64,-116, +-38,-34, +-62,-141, +73,-46, +-124,103, +41,-132, +-17,118, +48,232, +110,110, +-14,68, +-80,-63, +72,-78, +5,98, +-42,-25, +-123,77, +41,0, +9,-143, +67,-68, +-22,-91, +142,15, +-16,56, +-99,-59, +-29,23, +106,-46, +76,-138, +-150,10, +-97,181, +70,-34, +-21,13, +81,56, +-104,-115, +-31,-48, +-128,8, +47,0, +-64,41, +92,-124, +134,-40, +-22,0, +-34,-94, +20,118, +-107,101, +118,-39, +69,80, +7,-90, +75,-42, +-109,58, +-62,72, +13,66, +-115,49, +80,-105, +38,16, +-149,-147, +-15,10, +23,-44, +-34,102, +55,-21, +93,-69, +47,-104, +-129,6, +-56,152, +10,-37, +-5,-128, +-18,54, +57,43, +-59,79, +-160,-35, +-14,90, +-60,-23, +16,-63, +137,-96, +-91,78, +28,-8, +-22,-31, +-70,-2, +219,53, +200,73, +-18,24, +70,-86, +-52,56, +-11,-82, +-51,28, +-131,-56, +-52,-52, +-58,-36, +-72,86, +23,24, +46,48, +9,16, +-44,133, +-64,35, +-66,-100, +116,18, +-177,-2, +31,-75, +-82,40, +63,-169, +-42,-5, +-55,-74, +65,78, +-52,7, +-44,28, +-135,19, +-26,40, +-135,-44, +111,149, +-15,13, +14,-227, +-5,86, +35,-71, +-27,-57, +46,-44, +19,15, +-24,79, +77,160, +56,77, +-76,25, +-46,-51, +55,-52, +98,-91, +44,78, +-98,94, +15,14, +50,-52, +56,14, +5,36, +134,130, +50,0, +65,9, +46,134, +65,-49, +-125,-79, +7,-1, +186,52, +99,2, +43,-44, +-63,38, +-46,44, +-42,-60, +-12,-87, +97,2, +25,160, +1,27, +-53,40, +-107,-68, +34,18, +36,-11, +169,-25, +20,1, +78,-46, +99,81, +93,26, +98,59, +-46,179, +20,60, +19,41, +-10,-120, +95,49, +44,10, +34,-19, +-78,17, +-8,12, +-30,11, +-90,60, +-40,-68, +-54,134, +3,-6, +53,53, +-70,40, +69,-78, +186,24, +71,23, +90,-50, +-77,48, +-23,79, +49,97, +-150,-123, +-44,81, +81,21, +-31,-90, +43,-29, +11,-86, +-15,-105, +-24,9, +2,-51, +63,-67, +-96,-19, +-12,36, +1,-37, +9,-98, +-10,-35, +-16,-13, +47,55, +-12,-38, +-73,-129, +51,-31, +-44,88, +52,-22, +-91,6, +-48,27, +88,-7, +63,-4, +79,64, +-87,-60, +64,-48, +-15,-62, +-40,27, +-64,95, +-65,26, +11,25, +107,32, +-49,-44, +-31,-40, +3,-22, +-85,112, +-20,-54, +-14,30, +-23,-34, +59,20, +94,-49, +28,20, +-30,43, +-63,-17, +18,-80, +-31,6, +1,7, +32,85, +129,41, +-31,-55, +-6,141, +-65,-108, +71,13, +78,-3, +72,4, +-46,-72, +-34,-26, +39,62, +42,-102, +-23,-61, +-50,-27, +-26,-54, +26,-16, +-45,6, +-34,10, +12,-28, +-75,57, +56,-35, +-84,-44, +77,-6, +43,14, +24,29, +46,-3, +1,125, +-63,-1, +-83,63, +40,18, +-64,0, +-62,90, +-16,18, +27,97, +87,29, +35,71, +-156,-70, +71,-7, +-25,27, +35,36, +-18,-15, +78,54, +-8,-36, +89,38, +7,-105, +10,-52, +-17,1, +-22,54, +58,-14, +21,38, +-33,44, +63,-56, +0,50, +-20,8, +43,-85, +-10,0, +41,103, +37,38, +15,-27, +-59,10, +82,35, +9,18, +76,69, +-24,54, +-18,-25, +85,-92, +-40,80, +-6,49, +-36,-71, +12,32, +27,-36, +-126,-84, +-66,61, +-41,56, +27,39, +10,-79, +-64,11, +-17,-65, +-26,-57, +6,-99, +20,16, +28,-60, +43,-19, +-139,8, +-38,11, +-26,24, +-50,5, +-32,-40, +39,-138, +-27,50, +112,43, +94,-53, +34,83, +-79,18, +-30,-13, +-89,39, +-23,1, +24,11, +12,-48, +52,68, +-135,-23, +-79,40, +77,-134, +-4,46, +-34,-3, +-39,-35, +-21,27, +-2,1, +50,3, +-60,-11, +-19,-10, +7,30, +49,-28, +-18,61, +-24,-32, +35,-59, +-19,106, +107,-21, +98,-18, +34,33, +-39,-18, +-51,81, +87,52, +-13,5, +4,88, +-18,-30, +-37,11, +20,6, +-49,-5, +-36,38, +19,-22, +43,-60, +10,4, +38,3, +34,-55, +-20,-36, +-8,-42, +48,19, +-1,-32, +-38,32, +21,7, +1,-28, +-21,6, +2,20, +79,-8, +-8,16, +-5,-54, +-18,-8, +13,5, +67,7, +2,-42, +-21,27, +-6,-4, +-9,-26, +5,-77, +27,14, +-5,-33, +-37,2, +15,-25, +4,42, +23,20, +12,76, +1,30, +53,-48, +10,-8, +-16,-37, +-13,0, +-9,49, +-15,10, +30,-10, +5,-62, +4,-11, +-48,-32, +21,4, +15,34, +-15,-22, +15,21, +18,59, +38,23, +35,-36, +37,25, +-48,-14, +16,-32, +22,65, +6,20, +77,-17, +55,33, +44,-1, +-14,-19, +49,-27, +45,-23, +27,-18, +34,-5, +-46,-15, +13,-24, +-19,9, +-32,6, +-19,32, +-3,17, +35,-24, +41,-39, +-23,39, +21,58, +-22,13, +13,82, +13,23, +6,4, +-2,-22, +29,39, +-20,29, +-29,-32, +-13,0, +-7,56, +-8,20, +14,-55, +12,23, +14,-13, +6,-26, +38,-3, +4,-48, +41,27, +32,-13, +-3,23, +-31,-1, +-10,7, +0,-34, +18,33, +12,2, +-10,-10, +24,-1, +20,32, +-3,1, +-12,-5, +8,-21, +15,-11, +-14,-19, +-18,10, +-2,-21, +44,-1, +-7,3, +7,-4, +17,-24, +-42,13, +-20,7, +0,12, +-3,9, +11,17, +-29,28, +4,0, +34,-12, +5,13, +16,13, +-16,4, +16,9, +-26,7, +8,-7, +14,9, +-14,-14, +-7,-2, +5,-21, +10,-2, +-6,4, +19,8, +-5,-13, +13,-11, +-10,1, +-2,-1, +-8,3, +-1,-5, +2,9, +3,-15, +-1,-5, +-12,-15, +25,8, +-6,0, +-3,11, +-12,-5, +-2,-3, +12,19, +5,0, +8,-2, +-9,19, +24,3, +-4,-3, +11,7, +-12,-8, +-5,10, +0,-10, +3,-13, +2,-10, +-4,4, +11,14, +6,10, +4,9, +8,2, +6,-10, +2,11, +11,-5, +-6,-1, +6,8, +-6,-8, +-1,1, +-6,0, +-3,-4, +-1,3, +1,8, +2,-5, +0,6, +4,2, +0,-6, +0,4, +-4,6, +-2,-6, +0,-2, +-4,6, +-1,-4, +-3,-1, +3,4, +0,-6, +1,-1, +-5,3, +2,-6, +0,-2, +-1,4, +1,-5, +1,0, +-1,5, +0,-5, +0,0, +0,5, +-1,-5, +1,0, +1,5, +-1,-4, +0,2, +2,6, +-5,-3, +1,1, +0,6, +3,-4, +-3,1, +-1,4, +-4,-6, +0,2, +-2,6, +-4,-6, +0,-4, +0,6, +4,-2, +0,-6, +2,5, +1,-8, +-1,-3, +-3,4, +-6,0, +-1,-1, +-6,8, +6,-8, +-6,1, +11,5, +2,-11, +6,10, +8,-2, +4,-9, +6,-10, +11,-14, +-4,-4, +2,10, +3,13, +0,10, +-5,-10, +-12,8, +11,-7, +-4,3, +24,-3, +-9,-19, +8,2, +5,0, +12,-19, +-2,3, +-12,5, +-3,-11, +-6,0, +25,-8, +-12,15, +-1,5, +3,15, +2,-9, +-1,5, +-8,-3, +-2,1, +-10,-1, +13,11, +-5,13, +19,-8, +-6,-4, +10,2, +5,21, +-7,2, +-14,14, +14,-9, +8,7, +-26,-7, +16,-9, +-16,-4, +16,-13, +5,-13, +34,12, +4,0, +-29,-28, +11,-17, +-3,-9, +0,-12, +-20,-7, +-42,-13, +17,24, +7,4, +-7,-3, +44,1, +-2,21, +-18,-10, +-14,19, +15,11, +8,21, +-12,5, +-3,-1, +20,-32, +24,1, +-10,10, +12,-2, +18,-33, +0,34, +-10,-7, +-31,1, +-3,-23, +32,13, +41,-27, +4,48, +38,3, +6,26, +14,13, +12,-23, +14,55, +-8,-20, +-7,-56, +-13,0, +-29,32, +-20,-29, +29,-39, +-2,22, +6,-4, +13,-23, +13,-82, +-22,-13, +21,-58, +-23,-39, +41,39, +35,24, +-3,-17, +-19,-32, +-32,-6, +-19,-9, +13,24, +-46,15, +34,5, +27,18, +45,23, +49,27, +-14,19, +44,1, +55,-33, +77,17, +6,-20, +22,-65, +16,32, +-48,14, +37,-25, +35,36, +38,-23, +18,-59, +15,-21, +-15,22, +15,-34, +21,-4, +-48,32, +4,11, +5,62, +30,10, +-15,-10, +-9,-49, +-13,0, +-16,37, +10,8, +53,48, +1,-30, +12,-76, +23,-20, +4,-42, +15,25, +-37,-2, +-5,33, +27,-14, +5,77, +-9,26, +-6,4, +-21,-27, +2,42, +67,-7, +13,-5, +-18,8, +-5,54, +-8,-16, +79,8, +2,-20, +-21,-6, +1,28, +21,-7, +-38,-32, +-1,32, +48,-19, +-8,42, +-20,36, +34,55, +38,-3, +10,-4, +43,60, +19,22, +-36,-38, +-49,5, +20,-6, +-37,-11, +-18,30, +4,-88, +-13,-5, +87,-52, +-51,-81, +-39,18, +34,-33, +98,18, +107,21, +-19,-106, +35,59, +-24,32, +-18,-61, +49,28, +7,-30, +-19,10, +-60,11, +50,-3, +-2,-1, +-21,-27, +-39,35, +-34,3, +-4,-46, +77,134, +-79,-40, +-135,23, +52,-68, +12,48, +24,-11, +-23,-1, +-89,-39, +-30,13, +-79,-18, +34,-83, +94,53, +112,-43, +-27,-50, +39,138, +-32,40, +-50,-5, +-26,-24, +-38,-11, +-139,-8, +43,19, +28,60, +20,-16, +6,99, +-26,57, +-17,65, +-64,-11, +10,79, +27,-39, +-41,-56, +-66,-61, +-126,84, +27,36, +12,-32, +-36,71, +-6,-49, +-40,-80, +85,92, +-18,25, +-24,-54, +76,-69, +9,-18, +82,-35, +-59,-10, +15,27, +37,-38, +41,-103, +-10,0, +43,85, +-20,-8, +0,-50, +63,56, +-33,-44, +21,-38, +58,14, +-22,-54, +-17,-1, +10,52, +7,105, +89,-38, +-8,36, +78,-54, +-18,15, +35,-36, +-25,-27, +71,7, +-156,70, +35,-71, +87,-29, +27,-97, +-16,-18, +-62,-90, +-64,0, +40,-18, +-83,-63, +-63,1, +1,-125, +46,3, +24,-29, +43,-14, +77,6, +-84,44, +56,35, +-75,-57, +12,28, +-34,-10, +-45,-6, +26,16, +-26,54, +-50,27, +-23,61, +42,102, +39,-62, +-34,26, +-46,72, +72,-4, +78,3, +71,-13, +-65,108, +-6,-141, +-31,55, +129,-41, +32,-85, +1,-7, +-31,-6, +18,80, +-63,17, +-30,-43, +28,-20, +94,49, +59,-20, +-23,34, +-14,-30, +-20,54, +-85,-112, +3,22, +-31,40, +-49,44, +107,-32, +11,-25, +-65,-26, +-64,-95, +-40,-27, +-15,62, +64,48, +-87,60, +79,-64, +63,4, +88,7, +-48,-27, +-91,-6, +52,22, +-44,-88, +51,31, +-73,129, +-12,38, +47,-55, +-16,13, +-10,35, +9,98, +1,37, +-12,-36, +-96,19, +63,67, +2,51, +-24,-9, +-15,105, +11,86, +43,29, +-31,90, +81,-21, +-44,-81, +-150,123, +49,-97, +-23,-79, +-77,-48, +90,50, +71,-23, +186,-24, +69,78, +-70,-40, +53,-53, +3,6, +-54,-134, +-40,68, +-90,-60, +-30,-11, +-8,-12, +-78,-17, +34,19, +44,-10, +95,-49, +-10,120, +19,-41, +20,-60, +-46,-179, +98,-59, +93,-26, +99,-81, +78,46, +20,-1, +169,25, +36,11, +34,-18, +-107,68, +-53,-40, +1,-27, +25,-160, +97,-2, +-12,87, +-42,60, +-46,-44, +-63,-38, +43,44, +99,-2, +186,-52, +7,1, +-125,79, +65,49, +46,-134, +65,-9, +50,0, +134,-130, +5,-36, +56,-14, +50,52, +15,-14, +-98,-94, +44,-78, +98,91, +55,52, +-46,51, +-76,-25, +56,-77, +77,-160, +-24,-79, +19,-15, +46,44, +-27,57, +35,71, +-5,-86, +14,227, +-15,-13, +111,-149, +-135,44, +-26,-40, +-135,-19, +-44,-28, +-52,-7, +65,-78, +-55,74, +-42,5, +63,169, +-82,-40, +31,75, +-177,2, +116,-18, +-66,100, +-64,-35, +-44,-133, +9,-16, +46,-48, +23,-24, +-72,-86, +-58,36, +-52,52, +-131,56, +-51,-28, +-11,82, +-52,-56, +70,86, +-18,-24, +200,-73, +219,-53, +-70,2, +-22,31, +28,8, +-91,-78, +137,96, +16,63, +-60,23, +-14,-90, +-160,35, +-59,-79, +57,-43, +-18,-54, +-5,128, +10,37, +-56,-152, +-129,-6, +47,104, +93,69, +55,21, +-34,-102, +23,44, +-15,-10, +-149,147, +38,-16, +80,105, +-115,-49, +13,-66, +-62,-72, +-109,-58, +75,42, +7,90, +69,-80, +118,39, +-107,-101, +20,-118, +-34,94, +-22,0, +134,40, +92,124, +-64,-41, +47,0, +-128,-8, +-31,48, +-104,115, +81,-56, +-21,-13, +70,34, +-97,-181, +-150,-10, +76,138, +106,46, +-29,-23, +-99,59, +-16,-56, +142,-15, +-22,91, +67,68, +9,143, +41,0, +-123,-77, +-42,25, +5,-98, +72,78, +-80,63, +-14,-68, +110,-110, +48,-232, +-17,-118, +41,132, +-124,-103, +73,46, +-62,141, +-38,34, +-64,116, +-7,96, +18,6, +131,28, +-36,-46, +77,-60, +135,86, +23,115, +-70,-69, +-38,98, +29,-68, +-37,221, +-120,-95, +58,23, +-267,45, +81,6, +53,9, +-31,-27, +46,147, +118,43, +-140,192, +128,-24, +125,42, +-101,-112, +-40,55, +-139,-34, +73,-4, +-126,-18, +-60,-12, +26,-32, +117,-5, +161,-47, +135,-90, +-8,65, +-11,117, +-140,-106, +-38,-148, +50,24, +129,29, +28,54, +-49,-105, +-55,-40, +159,-61, +71,-86, +29,-169, +69,11, +66,-138, +39,-17, +-159,101, +-2,32, +103,-238, +-33,-207, +-38,61, +43,-19, +57,96, +-69,106, +-145,-83, +59,-40, +128,-78, +158,-9, +-84,112, +37,87, +-65,43, +8,-185, +14,-63, +-102,-189, +52,-20, +25,-121, +72,-237, +109,-5, +169,-29, +222,-3, +-117,4, +12,-44, +-71,-68, +66,-147, +16,56, +-67,4, +70,82, +79,52, +-104,43, +162,172, +-39,24, +126,-60, +62,69, +-7,-46, +-25,-55, +-37,-175, +65,-319, +-52,72, +-19,29, +284,-37, +-63,99, +14,70, +-2,111, +52,-29, +-72,-127, +-133,90, +-92,-87, +-132,-1, +-69,117, +10,-93, +-166,-11, +-8,55, +64,126, +-85,-94, +-113,17, +-108,68, +27,-80, +60,8, +-57,33, +-210,-15, +-27,129, +84,-143, +41,69, +-47,74, +59,83, +-2,-88, +7,-232, +32,64, +30,-82, +-211,84, +-37,-64, +69,45, +77,179, +126,90, +18,-103, +12,-24, +8,-54, +-166,83, +67,90, +60,1, +85,132, +-156,30, +132,-39, +-86,-29, +-51,-174, +61,-115, +49,148, +-58,41, +-47,4, +-130,23, +133,66, +123,-178, +-27,-80, +134,-105, +-60,156, +126,-3, +-230,-26, +132,-231, +-14,-73, +-196,53, +49,74, +16,-68, +-106,-90, +-181,50, +-18,106, +-96,4, +-81,32, +93,5, +-67,82, +21,89, +48,-107, +-7,216, +-150,-122, +33,6, +44,-108, +-55,-92, +192,-56, +20,-6, +189,147, +26,73, +35,88, +81,-35, +55,184, +197,112, +14,-186, +253,-147, +-25,95, +-31,-19, +-61,232, +71,-223, +35,54, +84,-22, +-74,-50, +140,-207, +-106,78, +-94,-201, +-200,-6, +84,165, +31,-100, +38,-80, +78,49, +17,-96, +14,-9, +-13,-20, +70,-38, +-156,21, +-74,-69, +277,-44, +108,-124, +-130,51, +76,-28, +84,43, +-7,-272, +184,23, +191,-21, +-218,-37, +-31,16, +90,-169, +61,215, +12,30, +-115,-126, +-7,121, +-115,120, +-58,276, +354,53, +-58,-59, +-105,-9, +-63,107, +-4,147, +-367,-74, +-21,83, +-113,-24, +-90,-249, +-63,158, +52,121, +-30,202, +82,78, +107,98, +-325,23, +-101,78, +-15,-157, +52,-118, +95,-328, +-43,-49, +187,116, +12,269, +-61,23, +177,168, +-93,29, +-20,-296, +-10,145, +275,220, +-327,164, +39,-28, +-131,-166, +58,167, +-21,138, +-59,24, +121,-46, +-63,16, +-28,-35, +59,228, +-106,-116, +176,-117, +-28,66, +-69,22, +34,2, +-41,-120, +237,-104, +-116,-464, +-113,-67, +292,256, +-2,-105, +141,15, +294,-157, +-105,51, +181,108, +-31,3, +-82,55, +127,61, +47,177, +-95,-93, +-118,-132, +-45,-25, +9,-124, +-114,-133, +-235,104, +20,-9, +-120,-151, +65,28, +1,85, +32,-37, +-30,-29, +-48,118, +62,-113, +88,-104, +-129,-157, +-11,144, +-135,54, +63,-142, +-11,-109, +-63,-89, +-53,72, +165,77, +-260,-7, +-148,-36, +-76,-51, +37,1, +-201,71, +138,88, +-40,-161, +201,-24, +254,8, +77,-139, +-90,-68, +-161,-111, +-18,56, +-75,93, +165,20, +190,3, +-270,10, +-35,-197, +-161,160, +-137,65, +99,-20, +63,-62, +-62,22, +82,-9, +301,-131, +-32,-91, +18,-262, +-8,5, +-80,25, +10,70, +104,-126, +180,-128, +-18,-154, +-15,-465, +153,-12, +-152,-74, +-150,-136, +-59,-243, +-87,-186, +-64,25, +-40,-63, +-76,220, +-61,-65, +144,126, +92,258, +98,-131, +-126,-186, +-146,0, +127,-196, +292,165, +229,-25, +112,-47, +467,-67, +-201,31, +-88,-122, +307,-13, +73,31, +-204,163, +110,97, +262,37, +-28,9, +14,-31, +-217,-110, +104,-24, +-53,-139, +-337,-49, +102,-215, +-149,-109, +116,-226, +-4,-15, +168,202, +-194,130, +35,-115, +11,-42, +133,-23, +-131,-97, +58,6, +130,-188, +95,-45, +-112,174, +-69,-75, +-175,-176, +11,163, +-99,198, +-10,-234, +-86,6, +50,-153, +-76,-84, +-71,111, +-67,43, +206,284, +28,83, +29,-204, +229,149, +151,97, +-10,-12, +-31,-193, +40,-218, +124,131, +68,-200, +40,205, +44,-17, +50,6, +-100,-54, +75,12, +-195,135, +-76,-57, +-91,-67, +84,-85, +30,74, +-73,-258, +-161,104, +11,-8, +61,41, +-110,56, +118,92, +-53,-115, +-49,-33, +-178,166, +-1,-150, +-152,21, +235,-169, +-2,157, +-106,118, +133,18, +71,-115, +44,-179, +92,112, +71,-201, +160,41, +22,-301, +-120,106, +165,-3, +-82,173, +-20,-25, +-289,-105, +-130,82, +98,-78, +151,-86, +305,-138, +128,-124, +-113,-104, +140,-99, +-149,-181, +97,12, +68,-170, +-122,164, +111,-91, +-80,168, +-88,88, +-1,62, +148,45, +-35,-29, +128,-63, +50,-33, +27,-19, +-82,-148, +134,165, +143,75, +-145,1, +-16,155, +31,-5, +18,173, +2,64, +-92,-1, +-124,-290, +-71,352, +-98,-18, +-207,56, +-104,-26, +-139,27, +-85,-89, +28,1, +67,-76, +12,158, +0,0, +169,153, +22,-148, +-124,153, +-165,127, +-30,80, +-2,109, +119,80, +70,-32, +61,95, +86,95, +184,82, +25,-192, +22,-89, +32,132, +-208,-11, +-134,-175, +-161,97, +-103,-64, +55,-46, +-28,-264, +101,-112, +-147,-88, +-33,247, +43,171, +-132,-115, +225,39, +-42,202, +327,84, +45,-19, +210,-84, +43,188, +223,73, +121,-55, +-147,85, +6,62, +75,-259, +94,-133, +63,-173, +-119,135, +5,141, +76,-112, +-181,230, +31,-57, +-51,19, +-347,113, +7,-166, +22,200, +109,96, +188,-5, +-142,38, +-11,81, +-24,23, +98,-219, +-32,-35, +184,-159, +71,43, +24,67, +-93,-7, +3,45, +-187,211, +18,-105, +41,95, +32,-21, +-94,-9, +41,-34, +-252,158, +-3,-124, +-186,-5, +39,-19, +-259,46, +2,-55, +-224,-12, +28,-191, +-228,-126, +-73,69, +192,77, +77,-103, +-12,-6, +290,-40, +202,132, +31,21, +230,54, +-189,-20, +-11,16, +-12,154, +54,112, +70,-97, +-159,111, +41,-159, +-173,122, +56,-52, +-54,-58, +337,86, +157,-34, +63,-5, +-180,-15, +-19,-75, +-36,47, +-133,135, +-134,63, +11,126, +262,76, +71,170, +66,106, +176,59, +-70,-85, +18,-75, +100,138, +110,39, +-193,99, +-109,275, +51,-53, +299,45, +50,58, +-2,20, +75,-48, +64,282, +-82,46, +260,42, +24,38, +-2,244, +-23,27, +-313,187, +-65,83, +178,24, +-63,88, +93,131, +98,50, +59,-19, +-62,63, +-283,-41, +-37,-141, +-95,-107, +128,53, +-225,-18, +-122,35, +69,-70, +-65,223, +-21,184, +8,-77, +39,-89, +-121,-8, +-36,57, +202,-181, +-37,154, +82,27, +-1,-75, +-187,72, +77,35, +-83,32, +-375,59, +32,44, +156,-70, +-154,128, +10,-40, +105,155, +152,126, +25,23, +243,-90, +122,87, +71,57, +-194,-18, +-276,51, +-8,12, +-112,176, +-137,52, +-204,46, +-69,-96, +-117,19, +97,186, +-111,-89, +104,30, +-87,-172, +212,81, +218,-157, +-144,12, +-3,-20, +50,120, +-52,151, +-85,244, +-72,6, +-4,-177, +53,-194, +217,119, +-217,-44, +-64,107, +47,-81, +-3,-131, +-74,76, +-51,-126, +327,110, +71,10, +-83,-106, +-247,-97, +-207,135, +45,-241, +-3,-36, +57,24, +-85,-192, +80,269, +-39,-24, +232,-142, +-308,-44, +177,-7, +-89,-209, +35,116, +-68,234, +128,115, +-161,-139, +-64,-20, +12,46, +174,-58, +96,-146, +53,198, +2,41, +97,-81, +-147,-8, +59,11, +241,98, +-74,-134, +100,63, +-143,134, +144,-96, +-219,-136, +-40,33, +-67,39, +38,229, +91,-43, +59,153, +217,62, +-14,-33, +-1,-177, +60,121, +3,185, +173,-92, +-202,56, +-90,-60, +-44,-17, +54,52, +199,257, +-72,108, +254,-105, +-48,-84, +-13,-111, +137,-13, +134,125, +85,-65, +237,-62, +64,-72, +183,-265, +-225,75, +-40,204, +-189,70, +-88,-39, +50,-100, +-97,-375, +39,-55, +-2,-136, +-102,-190, +72,14, +-252,15, +57,115, +128,107, +-38,74, +26,-74, +192,84, +18,29, +-193,-72, +-1,143, +-262,135, +-36,-93, +212,-9, +83,83, +-9,89, +-344,115, +74,126, +75,-16, +-32,70, +54,24, +-5,-19, +-161,10, +77,-39, +210,-32, +-147,-4, +-80,169, +68,-33, +-105,62, +-103,99, +45,103, +-152,115, +103,-70, +-84,-37, +-42,-8, +78,60, +-121,56, +80,-1, +30,-123, +75,162, +-6,244, +-78,-131, +214,33, +226,55, +-2,-121, +7,-57, +228,-155, +82,54, +96,-91, +-27,147, +72,100, +-123,67, +-23,112, +108,-30, +195,80, +-123,133, +91,-189, +59,179, +-28,138, +21,96, +-125,-146, +97,42, +-114,-255, +66,198, +84,6, +118,-19, +24,53, +-183,-96, +-59,46, +73,-83, +116,19, +-93,17, +165,100, +129,25, +113,-68, +21,56, +-12,-63, +42,-19, +-75,-120, +-41,115, +-123,45, +77,-68, +-4,-212, +197,168, +-99,6, +-123,40, +-44,172, +112,-102, +-17,-7, +-114,71, +-13,-162, +-50,-121, +117,127, +-22,-48, +41,-242, +79,8, +17,-21, +-122,26, +137,-154, +53,-79, +-126,-2, +-116,48, +48,-28, +44,-1, +-123,-132, +-76,-96, +159,7, +45,-188, +62,10, +-99,39, +-43,26, +91,50, +-3,-165, +26,-135, +39,58, +80,-108, +112,-98, +8,-47, +-78,154, +28,-48, +66,-3, +-87,139, +-28,83, +-65,44, +-58,-44, +-38,-15, +123,84, +-162,-109, +-70,204, +-136,-62, +82,-90, +-68,123, +-142,-67, +48,-1, +-100,11, +-36,111, +-168,56, +-99,246, +-29,37, +108,-23, +103,-174, +-15,189, +-44,-63, +39,-82, +122,56, +79,-3, +53,-23, +204,153, +-89,-148, +-65,81, +-6,151, +27,60, +-65,74, +-23,-59, +-100,-28, +-130,-119, +57,-108, +78,-32, +89,-17, +-137,-74, +-41,2, +32,-71, +50,-180, +-44,192, +-99,-62, +-92,-52, +54,134, +-111,-77, +145,43, +-90,-97, +-178,141, +-154,92, +27,124, +-70,54, +49,-195, +44,18, +-186,144, +-101,42, +65,-71, +-65,-19, +71,-52, +-113,91, +6,170, +87,62, +-119,23, +12,-73, +-48,7, +106,178, +132,-13, +13,-29, +-31,-273, +-36,-24, +141,38, +55,-136, +-29,-66, +-81,52, +49,-155, +25,143, +18,-90, +22,15, +-62,2, +-26,41, +-97,-195, +47,-142, +101,-30, +-182,120, +-23,-47, +73,-35, +115,140, +91,57, +-88,137, +148,-77, +56,72, +101,29, +-134,-17, +81,139, +23,35, +152,151, +124,245, +-120,27, +-1,239, +-103,6, +252,-133, +-52,-39, +92,-53, +52,133, +-146,-124, +-102,77, +25,76, +-153,-11, +1,30, +64,41, +-58,-61, +185,-183, +-17,-100, +-10,124, +-10,35, +-33,205, +85,204, +54,-156, +-50,-134, +19,-125, +-69,39, +18,-117, +58,-106, +123,154, +47,-46, +95,-150, +48,60, +-19,22, +77,84, +57,62, +-138,34, +-146,-180, +-1,-109, +110,52, +4,51, +128,19, +-38,29, +-105,69, +-6,106, +50,57, +1,101, +-152,-12, +-26,-22, +30,-61, +-307,45, +-14,-1, +149,49, +148,72, +138,-104, +9,-20, +-24,138, +-188,-65, +-85,147, +84,-1, +-12,-93, +3,22, +96,-92, +-6,-91, +18,-58, +-55,-9, +137,30, +-172,139, +-89,-39, +101,171, +28,-197, +228,1, +90,82, +142,102, +133,109, +-19,-60, +85,34, +21,-60, +-29,179, +82,15, +-36,33, +172,-20, +52,158, +-14,83, +-10,-123, +37,-12, +57,-27, +-198,65, +-115,-14, +2,-132, +46,33, +-83,-5, +91,-13, +-94,64, +70,11, +-78,-48, +-41,-53, +-50,95, +-35,55, +-26,25, +-117,-62, +-203,33, +166,95, +39,77, +14,20, +4,-111, +-62,57, +96,-45, +141,11, +33,28, +3,-131, +-42,109, +-48,-10, +27,-121, +135,-65, +-32,-11, +-90,12, +-17,21, +128,-55, +92,-71, +23,-174, +73,-5, +-151,-7, +114,70, +-4,-101, +-40,13, +61,-87, +-24,-62, +22,62, +-135,36, +-12,-85, +19,-23, +-84,-16, +-4,125, +-47,-1, +-126,-79, +-34,-67, +45,-38, +-73,-21, +134,-6, +120,27, +-61,-97, +69,11, +-37,56, +44,118, +23,13, +-15,83, +-43,62, +20,-65, +-4,1, +44,87, +-164,51, +129,0, +111,-86, +75,-82, +39,-96, +65,37, +-85,-79, +55,-26, +-5,-44, +-26,-25, +9,40, +1,-186, +106,2, +-95,12, +55,16, +3,-72, +-58,-4, +131,-63, +75,-19, +-45,24, +39,17, +38,-39, +17,-2, +-112,66, +-4,65, +-33,22, +-47,-5, +-83,44, +-43,9, +92,-4, +11,-40, +-68,-29, +11,119, +-108,22, +-25,-8, +-32,-72, +-90,-5, +47,63, +21,-82, +-29,-101, +-36,83, +-49,24, +-86,-25, +103,-19, +-72,65, +-130,3, +-1,29, +47,3, +-75,46, +-64,-69, +15,-39, +-19,-4, +5,37, +18,12, +67,-116, +39,2, +-13,31, +15,100, +-145,-58, +73,10, +58,-73, +-51,-14, +-74,0, +67,20, +-66,-7, +8,52, +32,125, +4,6, +53,37, +-9,-1, +-24,72, +-38,-45, +59,-85, +-83,-13, +25,87, +92,52, +-84,-20, +75,41, +-127,-73, +-14,48, +27,-64, +128,7, +-25,63, +50,-23, +-36,23, +53,22, +54,111, +-28,-43, +71,-42, +86,2, +-6,48, +42,-33, +-52,119, +-1,69, +-110,10, +4,16, +15,101, +-41,89, +36,7, +39,-51, +90,52, +0,56, +-81,-55, +68,54, +46,-45, +-41,-8, +-15,28, +22,-72, +-26,48, +97,-50, +66,-46, +-44,-8, +62,-6, +35,-42, +9,-20, +-23,40, +11,62, +-36,-56, +9,-41, +37,45, +-25,-1, +41,12, +47,12, +30,-60, +57,-148, +54,161, +-48,57, +-5,-84, +62,9, +24,-105, +6,-48, +11,30, +-1,52, +16,7, +5,20, +49,32, +40,-14, +46,0, +-56,-99, +-39,46, +-35,-10, +-110,-43, +-49,41, +-108,-32, +-14,-36, +62,-28, +68,-97, +-7,8, +-32,-32, +-90,123, +-18,26, +20,57, +-9,72, +23,25, +-28,-7, +-72,40, +-12,-10, +41,95, +77,-17, +50,58, +-39,3, +17,-95, +-29,2, +17,-14, +37,65, +44,-12, +-33,-6, +-58,39, +68,16, +12,78, +39,7, +14,2, +84,17, +-32,-73, +-47,-6, +-4,-38, +17,58, +19,-80, +-2,69, +-34,36, +62,9, +-27,3, +-41,-30, +53,43, +21,7, +-9,27, +-47,56, +27,31, +-6,-70, +-49,1, +26,-5, +112,19, +-13,-42, +-26,55, +-16,-62, +-24,40, +-44,-56, +34,82, +-6,-27, +44,-2, +-54,-2, +-31,30, +12,-26, +-57,-32, +26,-81, +-32,-51, +-17,71, +21,43, +28,31, +-68,-51, +21,7, +-14,28, +-40,-55, +76,-11, +-24,8, +-41,58, +-44,-23, +4,-17, +44,-20, +78,-17, +7,16, +8,-14, +-14,-12, +-2,28, +-48,68, +36,11, +-62,-50, +19,64, +32,-46, +11,-2, +-26,-14, +2,-58, +41,-58, +2,20, +46,-53, +-11,-48, +-8,-33, +35,-21, +4,66, +-18,43, +8,15, +40,19, +7,64, +38,-43, +-16,-9, +10,43, +5,-24, +10,-57, +5,-25, +24,-6, +-5,-8, +-7,-19, +19,7, +0,29, +4,3, +-27,19, +24,-30, +-30,-8, +-18,28, +48,-31, +33,5, +6,8, +-18,-35, +21,-22, +-8,-12, +-12,26, +-30,-51, +-11,-22, +12,-35, +3,17, +-2,36, +36,-15, +15,25, +-4,12, +33,-17, +15,-31, +27,-36, +23,10, +33,28, +-22,0, +40,32, +25,-12, +8,11, +-6,12, +22,9, +-12,31, +18,42, +21,-47, +30,-22, +12,20, +6,19, +5,-14, +-21,17, +4,4, +30,17, +13,26, +24,16, +9,22, +19,-26, +15,-27, +6,5, +-4,-12, +-10,-19, +-1,-4, +8,47, +-7,16, +4,27, +0,-23, +-13,2, +22,-19, +-26,4, +12,-14, +9,19, +13,7, +11,-31, +-4,17, +-1,-7, +18,22, +-1,28, +11,20, +-12,12, +-6,7, +6,15, +10,-2, +-17,-19, +-17,-21, +-7,11, +1,-36, +-4,1, +10,-17, +-15,1, +3,-25, +3,1, +7,-19, +-10,4, +9,-1, +-7,5, +9,-4, +3,-5, +13,-15, +-1,4, +3,-5, +2,10, +-3,10, +-19,7, +-2,-5, +-8,11, +10,-12, +3,-1, +-2,5, +12,14, +3,4, +5,-12, +-8,-6, +7,-15, +6,0, +-7,3, +16,-12, +-3,7, +3,0, +6,-11, +-25,15, +-5,8, +4,-13, +-1,4, +1,4, +6,2, +3,14, +3,0, +-5,8, +5,6, +9,12, +0,-9, +-3,10, +6,-3, +8,-7, +0,5, +-8,-3, +-2,0, +-7,3, +3,-2, +0,-7, +-2,-1, +-1,-2, +3,-6, +-1,5, +-4,1, +1,-3, +3,7, +-1,0, +1,-3, +1,6, +0,0, +1,-5, +1,4, +0,-1, +0,-5, +0,5, +0,0, +0,-5, +0,5, +0,1, +1,-4, +1,5, +0,0, +1,-6, +1,3, +-1,0, +3,-7, +1,3, +-4,-1, +-1,-5, +3,6, +-1,2, +-2,1, +0,7, +3,2, +-7,-3, +-2,0, +-8,3, +0,-5, +8,7, +6,3, +-3,-10, +0,9, +9,-12, +5,-6, +-5,-8, +3,0, +3,-14, +6,-2, +1,-4, +-1,-4, +4,13, +-5,-8, +-25,-15, +6,11, +3,0, +-3,-7, +16,12, +-7,-3, +6,0, +7,15, +-8,6, +5,12, +3,-4, +12,-14, +-2,-5, +3,1, +10,12, +-8,-11, +-2,5, +-19,-7, +-3,-10, +2,-10, +3,5, +-1,-4, +13,15, +3,5, +9,4, +-7,-5, +9,1, +-10,-4, +7,19, +3,-1, +3,25, +-15,-1, +10,17, +-4,-1, +1,36, +-7,-11, +-17,21, +-17,19, +10,2, +6,-15, +-6,-7, +-12,-12, +11,-20, +-1,-28, +18,-22, +-1,7, +-4,-17, +11,31, +13,-7, +9,-19, +12,14, +-26,-4, +22,19, +-13,-2, +0,23, +4,-27, +-7,-16, +8,-47, +-1,4, +-10,19, +-4,12, +6,-5, +15,27, +19,26, +9,-22, +24,-16, +13,-26, +30,-17, +4,-4, +-21,-17, +5,14, +6,-19, +12,-20, +30,22, +21,47, +18,-42, +-12,-31, +22,-9, +-6,-12, +8,-11, +25,12, +40,-32, +-22,0, +33,-28, +23,-10, +27,36, +15,31, +33,17, +-4,-12, +15,-25, +36,15, +-2,-36, +3,-17, +12,35, +-11,22, +-30,51, +-12,-26, +-8,12, +21,22, +-18,35, +6,-8, +33,-5, +48,31, +-18,-28, +-30,8, +24,30, +-27,-19, +4,-3, +0,-29, +19,-7, +-7,19, +-5,8, +24,6, +5,25, +10,57, +5,24, +10,-43, +-16,9, +38,43, +7,-64, +40,-19, +8,-15, +-18,-43, +4,-66, +35,21, +-8,33, +-11,48, +46,53, +2,-20, +41,58, +2,58, +-26,14, +11,2, +32,46, +19,-64, +-62,50, +36,-11, +-48,-68, +-2,-28, +-14,12, +8,14, +7,-16, +78,17, +44,20, +4,17, +-44,23, +-41,-58, +-24,-8, +76,11, +-40,55, +-14,-28, +21,-7, +-68,51, +28,-31, +21,-43, +-17,-71, +-32,51, +26,81, +-57,32, +12,26, +-31,-30, +-54,2, +44,2, +-6,27, +34,-82, +-44,56, +-24,-40, +-16,62, +-26,-55, +-13,42, +112,-19, +26,5, +-49,-1, +-6,70, +27,-31, +-47,-56, +-9,-27, +21,-7, +53,-43, +-41,30, +-27,-3, +62,-9, +-34,-36, +-2,-69, +19,80, +17,-58, +-4,38, +-47,6, +-32,73, +84,-17, +14,-2, +39,-7, +12,-78, +68,-16, +-58,-39, +-33,6, +44,12, +37,-65, +17,14, +-29,-2, +17,95, +-39,-3, +50,-58, +77,17, +41,-95, +-12,10, +-72,-40, +-28,7, +23,-25, +-9,-72, +20,-57, +-18,-26, +-90,-123, +-32,32, +-7,-8, +68,97, +62,28, +-14,36, +-108,32, +-49,-41, +-110,43, +-35,10, +-39,-46, +-56,99, +46,0, +40,14, +49,-32, +5,-20, +16,-7, +-1,-52, +11,-30, +6,48, +24,105, +62,-9, +-5,84, +-48,-57, +54,-161, +57,148, +30,60, +47,-12, +41,-12, +-25,1, +37,-45, +9,41, +-36,56, +11,-62, +-23,-40, +9,20, +35,42, +62,6, +-44,8, +66,46, +97,50, +-26,-48, +22,72, +-15,-28, +-41,8, +46,45, +68,-54, +-81,55, +0,-56, +90,-52, +39,51, +36,-7, +-41,-89, +15,-101, +4,-16, +-110,-10, +-1,-69, +-52,-119, +42,33, +-6,-48, +86,-2, +71,42, +-28,43, +54,-111, +53,-22, +-36,-23, +50,23, +-25,-63, +128,-7, +27,64, +-14,-48, +-127,73, +75,-41, +-84,20, +92,-52, +25,-87, +-83,13, +59,85, +-38,45, +-24,-72, +-9,1, +53,-37, +4,-6, +32,-125, +8,-52, +-66,7, +67,-20, +-74,0, +-51,14, +58,73, +73,-10, +-145,58, +15,-100, +-13,-31, +39,-2, +67,116, +18,-12, +5,-37, +-19,4, +15,39, +-64,69, +-75,-46, +47,-3, +-1,-29, +-130,-3, +-72,-65, +103,19, +-86,25, +-49,-24, +-36,-83, +-29,101, +21,82, +47,-63, +-90,5, +-32,72, +-25,8, +-108,-22, +11,-119, +-68,29, +11,40, +92,4, +-43,-9, +-83,-44, +-47,5, +-33,-22, +-4,-65, +-112,-66, +17,2, +38,39, +39,-17, +-45,-24, +75,19, +131,63, +-58,4, +3,72, +55,-16, +-95,-12, +106,-2, +1,186, +9,-40, +-26,25, +-5,44, +55,26, +-85,79, +65,-37, +39,96, +75,82, +111,86, +129,0, +-164,-51, +44,-87, +-4,-1, +20,65, +-43,-62, +-15,-83, +23,-13, +44,-118, +-37,-56, +69,-11, +-61,97, +120,-27, +134,6, +-73,21, +45,38, +-34,67, +-126,79, +-47,1, +-4,-125, +-84,16, +19,23, +-12,85, +-135,-36, +22,-62, +-24,62, +61,87, +-40,-13, +-4,101, +114,-70, +-151,7, +73,5, +23,174, +92,71, +128,55, +-17,-21, +-90,-12, +-32,11, +135,65, +27,121, +-48,10, +-42,-109, +3,131, +33,-28, +141,-11, +96,45, +-62,-57, +4,111, +14,-20, +39,-77, +166,-95, +-203,-33, +-117,62, +-26,-25, +-35,-55, +-50,-95, +-41,53, +-78,48, +70,-11, +-94,-64, +91,13, +-83,5, +46,-33, +2,132, +-115,14, +-198,-65, +57,27, +37,12, +-10,123, +-14,-83, +52,-158, +172,20, +-36,-33, +82,-15, +-29,-179, +21,60, +85,-34, +-19,60, +133,-109, +142,-102, +90,-82, +228,-1, +28,197, +101,-171, +-89,39, +-172,-139, +137,-30, +-55,9, +18,58, +-6,91, +96,92, +3,-22, +-12,93, +84,1, +-85,-147, +-188,65, +-24,-138, +9,20, +138,104, +148,-72, +149,-49, +-14,1, +-307,-45, +30,61, +-26,22, +-152,12, +1,-101, +50,-57, +-6,-106, +-105,-69, +-38,-29, +128,-19, +4,-51, +110,-52, +-1,109, +-146,180, +-138,-34, +57,-62, +77,-84, +-19,-22, +48,-60, +95,150, +47,46, +123,-154, +58,106, +18,117, +-69,-39, +19,125, +-50,134, +54,156, +85,-204, +-33,-205, +-10,-35, +-10,-124, +-17,100, +185,183, +-58,61, +64,-41, +1,-30, +-153,11, +25,-76, +-102,-77, +-146,124, +52,-133, +92,53, +-52,39, +252,133, +-103,-6, +-1,-239, +-120,-27, +124,-245, +152,-151, +23,-35, +81,-139, +-134,17, +101,-29, +56,-72, +148,77, +-88,-137, +91,-57, +115,-140, +73,35, +-23,47, +-182,-120, +101,30, +47,142, +-97,195, +-26,-41, +-62,-2, +22,-15, +18,90, +25,-143, +49,155, +-81,-52, +-29,66, +55,136, +141,-38, +-36,24, +-31,273, +13,29, +132,13, +106,-178, +-48,-7, +12,73, +-119,-23, +87,-62, +6,-170, +-113,-91, +71,52, +-65,19, +65,71, +-101,-42, +-186,-144, +44,-18, +49,195, +-70,-54, +27,-124, +-154,-92, +-178,-141, +-90,97, +145,-43, +-111,77, +54,-134, +-92,52, +-99,62, +-44,-192, +50,180, +32,71, +-41,-2, +-137,74, +89,17, +78,32, +57,108, +-130,119, +-100,28, +-23,59, +-65,-74, +27,-60, +-6,-151, +-65,-81, +-89,148, +204,-153, +53,23, +79,3, +122,-56, +39,82, +-44,63, +-15,-189, +103,174, +108,23, +-29,-37, +-99,-246, +-168,-56, +-36,-111, +-100,-11, +48,1, +-142,67, +-68,-123, +82,90, +-136,62, +-70,-204, +-162,109, +123,-84, +-38,15, +-58,44, +-65,-44, +-28,-83, +-87,-139, +66,3, +28,48, +-78,-154, +8,47, +112,98, +80,108, +39,-58, +26,135, +-3,165, +91,-50, +-43,-26, +-99,-39, +62,-10, +45,188, +159,-7, +-76,96, +-123,132, +44,1, +48,28, +-116,-48, +-126,2, +53,79, +137,154, +-122,-26, +17,21, +79,-8, +41,242, +-22,48, +117,-127, +-50,121, +-13,162, +-114,-71, +-17,7, +112,102, +-44,-172, +-123,-40, +-99,-6, +197,-168, +-4,212, +77,68, +-123,-45, +-41,-115, +-75,120, +42,19, +-12,63, +21,-56, +113,68, +129,-25, +165,-100, +-93,-17, +116,-19, +73,83, +-59,-46, +-183,96, +24,-53, +118,19, +84,-6, +66,-198, +-114,255, +97,-42, +-125,146, +21,-96, +-28,-138, +59,-179, +91,189, +-123,-133, +195,-80, +108,30, +-23,-112, +-123,-67, +72,-100, +-27,-147, +96,91, +82,-54, +228,155, +7,57, +-2,121, +226,-55, +214,-33, +-78,131, +-6,-244, +75,-162, +30,123, +80,1, +-121,-56, +78,-60, +-42,8, +-84,37, +103,70, +-152,-115, +45,-103, +-103,-99, +-105,-62, +68,33, +-80,-169, +-147,4, +210,32, +77,39, +-161,-10, +-5,19, +54,-24, +-32,-70, +75,16, +74,-126, +-344,-115, +-9,-89, +83,-83, +212,9, +-36,93, +-262,-135, +-1,-143, +-193,72, +18,-29, +192,-84, +26,74, +-38,-74, +128,-107, +57,-115, +-252,-15, +72,-14, +-102,190, +-2,136, +39,55, +-97,375, +50,100, +-88,39, +-189,-70, +-40,-204, +-225,-75, +183,265, +64,72, +237,62, +85,65, +134,-125, +137,13, +-13,111, +-48,84, +254,105, +-72,-108, +199,-257, +54,-52, +-44,17, +-90,60, +-202,-56, +173,92, +3,-185, +60,-121, +-1,177, +-14,33, +217,-62, +59,-153, +91,43, +38,-229, +-67,-39, +-40,-33, +-219,136, +144,96, +-143,-134, +100,-63, +-74,134, +241,-98, +59,-11, +-147,8, +97,81, +2,-41, +53,-198, +96,146, +174,58, +12,-46, +-64,20, +-161,139, +128,-115, +-68,-234, +35,-116, +-89,209, +177,7, +-308,44, +232,142, +-39,24, +80,-269, +-85,192, +57,-24, +-3,36, +45,241, +-207,-135, +-247,97, +-83,106, +71,-10, +327,-110, +-51,126, +-74,-76, +-3,131, +47,81, +-64,-107, +-217,44, +217,-119, +53,194, +-4,177, +-72,-6, +-85,-244, +-52,-151, +50,-120, +-3,20, +-144,-12, +218,157, +212,-81, +-87,172, +104,-30, +-111,89, +97,-186, +-117,-19, +-69,96, +-204,-46, +-137,-52, +-112,-176, +-8,-12, +-276,-51, +-194,18, +71,-57, +122,-87, +243,90, +25,-23, +152,-126, +105,-155, +10,40, +-154,-128, +156,70, +32,-44, +-375,-59, +-83,-32, +77,-35, +-187,-72, +-1,75, +82,-27, +-37,-154, +202,181, +-36,-57, +-121,8, +39,89, +8,77, +-21,-184, +-65,-223, +69,70, +-122,-35, +-225,18, +128,-53, +-95,107, +-37,141, +-283,41, +-62,-63, +59,19, +98,-50, +93,-131, +-63,-88, +178,-24, +-65,-83, +-313,-187, +-23,-27, +-2,-244, +24,-38, +260,-42, +-82,-46, +64,-282, +75,48, +-2,-20, +50,-58, +299,-45, +51,53, +-109,-275, +-193,-99, +110,-39, +100,-138, +18,75, +-70,85, +176,-59, +66,-106, +71,-170, +262,-76, +11,-126, +-134,-63, +-133,-135, +-36,-47, +-19,75, +-180,15, +63,5, +157,34, +337,-86, +-54,58, +56,52, +-173,-122, +41,159, +-159,-111, +70,97, +54,-112, +-12,-154, +-11,-16, +-189,20, +230,-54, +31,-21, +202,-132, +290,40, +-12,6, +77,103, +192,-77, +-73,-69, +-228,126, +28,191, +-224,12, +2,55, +-259,-46, +39,19, +-186,5, +-3,124, +-252,-158, +41,34, +-94,9, +32,21, +41,-95, +18,105, +-187,-211, +3,-45, +-93,7, +24,-67, +71,-43, +184,159, +-32,35, +98,219, +-24,-23, +-11,-81, +-142,-38, +188,5, +109,-96, +22,-200, +7,166, +-347,-113, +-51,-19, +31,57, +-181,-230, +76,112, +5,-141, +-119,-135, +63,173, +94,133, +75,259, +6,-62, +-147,-85, +121,55, +223,-73, +43,-188, +210,84, +45,19, +327,-84, +-42,-202, +225,-39, +-132,115, +43,-171, +-33,-247, +-147,88, +101,112, +-28,264, +55,46, +-103,64, +-161,-97, +-134,175, +-208,11, +32,-132, +22,89, +25,192, +184,-82, +86,-95, +61,-95, +70,32, +119,-80, +-2,-109, +-30,-80, +-165,-127, +-124,-153, +22,148, +169,-153, +11,0, +-148,259, +160,-168, +150,192, +201,172, +313,-68, +40,-186, +-69,108, +165,160, +-11,-160, +-78,101, +-49,22, +14,65, +46,-149, +-66,-7, +22,8, +71,-91, +-110,49, +-6,-147, +94,200, +-3,105, +91,33, +134,-39, +-70,-152, +85,-17, +-32,-139, +33,-42, +-58,119, +85,106, +-25,11, +70,-155, +129,-166, +-125,140, +88,-13, +67,123, +210,33, +-261,-11, +155,72, +50,-19, +148,-109, +32,-155, +-89,-164, +104,-15, +-185,-191, +-161,19, +3,18, +-15,-272, +-34,95, +117,-56, +-116,-113, +-35,109, +-56,1, +89,165, +-245,248, +-73,17, +-261,233, +-175,-91, +80,-185, +292,-46, +-9,145, +177,22, +140,-16, +25,109, +66,-116, +-11,15, +-98,-252, +-56,79, +-42,-38, +-59,-31, +257,-123, +43,-1, +115,59, +-162,42, +19,-45, +-227,178, +21,69, +57,-16, +-112,67, +-53,100, +282,-7, +-245,-179, +-17,7, +-9,-23, +-58,180, +-97,-37, +286,18, +-41,93, +109,219, +-14,-30, +50,238, +106,75, +11,170, +-67,35, +212,-53, +-161,-161, +-47,-97, +109,61, +-19,109, +-51,177, +-54,-117, +-100,202, +-6,-94, +-12,415, +148,51, +-155,-122, +368,159, +-180,189, +-143,69, +115,278, +94,-154, +-50,94, +-183,73, +-337,140, +148,53, +-71,-43, +-211,123, +-14,55, +82,58, +140,2, +-66,-9, +32,-53, +-101,23, +-147,178, +-42,-73, +-7,70, +-89,142, +-282,159, +123,106, +98,-20, +220,-101, +-72,-65, +-84,-39, +41,-172, +43,78, +74,3, +-325,107, +-58,-56, +-144,-23, +-40,-86, +233,293, +169,-40, +-109,-93, +-10,112, +112,109, +-42,-7, +150,-97, +-45,33, +87,109, +172,-47, +-178,-61, +211,-94, +69,-110, +233,-200, +-181,-23, +17,40, +-83,-23, +54,-56, +-158,39, +-48,-44, +-138,27, +132,67, +-22,-65, +-22,-4, +-203,27, +-179,124, +16,-126, +-265,169, +-56,315, +-54,-57, +91,74, +-143,-47, +21,47, +103,-111, +70,-140, +131,-130, +-29,-113, +40,-28, +-47,-98, +-38,173, +132,13, +68,19, +-84,177, +24,100, +120,-318, +-245,131, +-3,49, +73,203, +59,127, +247,62, +-94,-202, +-77,-24, +-59,57, +9,-41, +48,-26, +-106,-28, +59,4, +107,29, +-138,-252, +217,-7, +14,134, +171,-206, +22,17, +-31,97, +-60,160, +153,84, +-33,102, +-53,-56, +-113,57, +-76,-43, +-1,-139, +-73,-210, +135,-52, +-149,-26, +-36,78, +-211,192, +76,14, +-85,-252, +-12,172, +253,54, +28,-118, +-18,-51, +-36,8, +107,104, +-49,85, +9,-154, +-83,-290, +134,-182, +-163,3, +46,44, +-4,241, +93,63, +93,50, +-88,-45, +17,40, +-89,76, +92,81, +145,292, +22,62, +-16,-128, +134,12, +-183,87, +109,-3, +22,130, +103,329, +37,117, +-176,-120, +13,-56, +135,30, +20,-14, +69,113, +-37,-133, +56,14, +57,-146, +216,-24, +100,33, +-54,-92, +-58,86, +-24,108, +-41,-58, +0,-84, +115,-17, +27,-59, +65,-75, +-71,21, +-163,16, +-136,-14, +36,-265, +-1,122, +-258,-147, +123,110, +-194,98, +104,26, +52,158, +-126,52, +71,136, +-121,164, +116,76, +-124,-98, +-135,-112, +-135,-13, +60,-22, +125,102, +111,-116, +-122,146, +186,349, +54,84, +-259,53, +4,78, +60,28, +59,100, +137,139, +-206,11, +-189,3, +113,-173, +-7,96, +-139,89, +-207,-44, +168,-184, +-219,-40, +72,21, +-39,-136, +-39,-14, +-94,-11, +-67,-193, +44,112, +7,-158, +34,269, +-50,15, +-105,-149, +60,-156, +233,-70, +25,6, +-51,-62, +50,148, +59,-34, +155,129, +42,91, +64,38, +-51,182, +-32,-106, +-151,101, +49,375, +161,-69, +194,75, +-160,-14, +15,24, +28,-67, +-202,-35, +34,83, +-54,-37, +-134,-126, +69,153, +-205,74, +132,-94, +273,26, +98,-24, +-225,-69, +-30,146, +82,-323, +200,-9, +-18,115, +78,61, +1,130, +-31,48, +-98,-89, +-84,-29, +76,-7, +238,15, +32,-4, +-100,41, +-152,-86, +104,-62, +-14,97, +23,-28, +92,-6, +-165,-97, +69,42, +76,136, +-44,94, +-28,138, +19,21, +-1,212, +-2,-50, +33,-132, +-28,-41, +-146,-47, +-163,144, +43,-21, +155,-72, +108,-33, +25,-131, +114,-83, +131,36, +171,56, +5,9, +74,97, +-122,-81, +66,-20, +201,-45, +164,139, +116,206, +86,1, +-154,-59, +111,38, +-142,-114, +31,-14, +37,-91, +169,31, +-171,181, +-127,34, +-102,45, +101,65, +-96,63, +35,37, +87,-76, +133,52, +-9,-128, +-42,27, +-217,80, +37,-151, +56,-24, +102,-80, +-225,62, +-28,-163, +-171,-29, +-74,-29, +-82,158, +-106,151, +70,108, +-59,102, +-53,5, +57,-57, +34,21, +-10,-57, +-19,-69, +-71,-56, +371,-166, +66,98, +25,47, +-18,24, +-24,32, +41,27, +-40,-21, +57,-149, +22,-119, +-81,-116, +21,-18, +-113,-77, +55,16, +190,185, +84,-43, +119,-112, +10,50, +8,183, +160,-108, +115,37, +-103,81, +129,-24, +-12,-78, +-67,155, +32,63, +114,-91, +32,-32, +146,-58, +137,69, +12,39, +276,29, +-17,-80, +158,70, +-154,3, +-29,-60, +9,-5, +-36,16, +90,45, +46,-67, +110,-8, +-32,-29, +103,13, +37,-6, +-23,63, +5,-205, +-126,142, +37,25, +-23,-146, +-160,21, +8,-183, +-69,14, +61,49, +-59,88, +-36,-159, +-52,-34, +-126,-15, +-85,-44, +-54,111, +-16,-33, +38,153, +67,-227, +104,-164, +151,83, +-43,54, +-49,-103, +100,74, +-187,58, +-96,73, +-193,94, +101,81, +-98,-88, +-91,-4, +-37,45, +-61,66, +-15,-141, +-52,-77, +105,0, +35,-15, +-35,-9, +20,-38, +105,2, +165,163, +-161,89, +-48,-162, +-54,-61, +-153,137, +84,-84, +93,245, +-46,121, +-157,-109, +-89,2, +59,79, +-121,-62, +-106,-100, +62,9, +-11,150, +-6,-6, +117,-3, +88,27, +-192,-65, +-17,-118, +118,-8, +-95,17, +-39,-234, +161,-47, +69,182, +146,-51, +-46,-50, +0,-61, +-105,-130, +1,-17, +196,23, +31,191, +-96,-17, +21,-45, +14,76, +-57,35, +-48,24, +-82,-86, +-50,-1, +161,-58, +-77,-109, +-70,-7, +93,-50, +88,13, +13,-295, +146,12, +-23,-28, +-49,-9, +58,-2, +45,67, +-157,150, +-107,43, +-48,14, +196,16, +-89,-57, +47,-100, +15,-66, +-131,-81, +-30,-35, +-3,6, +103,-54, +-76,75, +-12,-122, +-162,-51, +9,-36, +16,-28, +-25,3, +62,-108, +-164,40, +107,53, +11,-4, +-70,91, +-2,-10, +15,107, +-74,27, +97,17, +-16,-30, +-99,-38, +65,-13, +19,-96, +-48,271, +-6,-24, +100,142, +-42,112, +39,41, +-65,94, +-85,81, +85,-4, +98,-48, +-48,59, +-42,-30, +118,51, +-54,25, +1,107, +81,61, +74,-12, +-117,40, +12,165, +86,69, +52,39, +-54,3, +-66,-111, +-20,36, +-140,-8, +-95,-2, +-20,52, +35,-48, +-2,29, +28,-11, +78,-48, +-30,182, +2,97, +-130,125, +-39,-131, +14,15, +-59,81, +-2,-34, +17,-12, +32,12, +109,-60, +120,26, +61,-91, +54,-112, +-101,3, +-30,-164, +-56,-31, +61,-32, +-138,129, +-11,-62, +14,-66, +-4,-103, +-12,45, +-67,60, +44,89, +-40,-20, +65,5, +66,-26, +-22,35, +85,-182, +76,-38, +31,47, +-25,101, +-85,-86, +17,51, +-52,-91, +-6,44, +18,-30, +89,92, +126,138, +-11,103, +-94,26, +62,-4, +-33,-60, +44,105, +56,44, +-14,111, +-47,67, +-39,22, +-86,54, +-15,117, +28,11, +-12,-93, +82,-98, +-86,-12, +-98,19, +46,-5, +35,4, +99,16, +20,-36, +107,-8, +54,54, +21,-15, +-9,0, +-87,-46, +65,64, +13,23, +-40,-35, +-21,21, +-1,-133, +6,39, +4,152, +21,38, +-65,-67, +-10,-26, +32,-41, +17,9, +104,29, +55,42, +-99,19, +-5,155, +-106,-91, +74,-114, +-16,77, +-61,157, +23,-3, +27,32, +29,-117, +14,10, +-73,-4, +36,-91, +36,5, +-88,-34, +8,-32, +77,12, +-106,4, +121,152, +91,-2, +73,-64, +17,-48, +-24,22, +120,-21, +26,70, +-1,45, +103,61, +-36,3, +33,-17, +-14,27, +-34,86, +-91,66, +-67,-69, +45,-37, +18,37, +111,4, +-143,-15, +36,22, +-31,-82, +-64,-43, +7,72, +-25,-100, +-36,33, +-51,-35, +-50,-11, +57,-140, +24,56, +-26,20, +-85,-99, +82,-47, +42,-4, +13,71, +70,42, +12,-63, +-11,-48, +115,-7, +105,51, +62,31, +19,-44, +-52,117, +61,17, +-24,-78, +-71,-60, +-22,-9, +34,-50, +61,79, +59,-91, +63,15, +2,29, +72,-37, +35,50, +-17,-93, +60,4, +-91,-62, +6,21, +-78,-29, +31,-107, +15,-4, +-46,14, +-18,23, +-2,30, +-49,24, +-13,-37, +48,-4, +13,-15, +-1,-38, +-20,54, +-3,80, +-22,36, +-73,-7, +43,34, +-36,-30, +36,52, +11,43, +-42,-22, +-34,-21, +52,-26, +109,41, +67,62, +-3,-54, +24,38, +13,-32, +-48,30, +22,16, +98,33, +65,38, +-15,1, +39,-58, +1,34, +-40,-3, +95,27, +37,46, +32,-54, +8,18, +-69,-25, +-121,35, +-26,-49, +15,19, +22,15, +40,6, +-49,-35, +-45,55, +63,38, +-4,26, +-32,-16, +-24,-35, +71,19, +30,-103, +-8,20, +-24,-3, +-59,13, +-62,-35, +11,0, +-17,-37, +18,-50, +9,42, +34,1, +48,5, +54,-14, +-48,15, +3,15, +-6,82, +-4,-28, +-28,39, +-56,-7, +39,12, +2,4, +-48,-28, +19,29, +21,-15, +-41,-58, +-22,32, +-3,8, +47,62, +35,19, +75,-44, +-51,-5, +-8,-21, +-17,27, +53,-10, +21,-3, +6,42, +12,7, +29,-33, +-54,6, +-14,30, +-28,-18, +-54,55, +-17,30, +-3,-29, +21,8, +-36,-13, +47,14, +43,-48, +42,-19, +8,-53, +-23,-7, +50,-52, +-20,-44, +-15,50, +21,-14, +4,-5, +-8,-32, +2,-9, +-1,-33, +-18,34, +17,-44, +-8,-3, +-43,11, +-36,80, +-6,-34, +-30,40, +1,-9, +19,17, +9,36, +-19,-26, +-11,32, +39,15, +11,-15, +-21,-9, +16,35, +18,41, +33,-1, +-45,-20, +10,-47, +11,-17, +18,-36, +-16,45, +3,-4, +-35,-28, +-8,12, +-8,11, +-17,54, +21,-10, +43,-24, +20,-43, +1,15, +19,-11, +-4,-37, +27,-4, +-8,-9, +-20,1, +18,10, +4,36, +9,-25, +18,-27, +10,3, +-14,-17, +35,-5, +31,-68, +-32,-8, +36,44, +-4,-9, +34,-28, +37,20, +6,-17, +-8,48, +21,-20, +23,13, +49,-3, +-36,-10, +34,-17, +0,-6, +21,9, +16,-1, +-20,-5, +-26,3, +-2,-15, +6,30, +7,-9, +41,-3, +-2,28, +23,2, +14,-22, +19,47, +-5,-2, +10,-1, +2,-2, +19,1, +-16,-28, +-12,15, +-7,-7, +16,12, +5,-9, +-3,-4, +14,0, +10,-5, +6,-29, +-4,12, +11,-10, +-2,22, +-11,9, +-9,11, +8,-13, +-12,-8, +1,-2, +-26,-5, +11,1, +-1,13, +-1,9, +7,6, +9,20, +-3,7, +-17,15, +-1,-13, +2,-22, +24,-17, +4,2, +14,-16, +15,10, +-11,-8, +2,-6, +3,2, +-14,8, +3,-8, +-10,-1, +-3,-5, +1,-14, +-15,-4, +-2,12, +-10,-11, +-10,6, +3,22, +2,-16, +0,5, +3,2, +2,8, +7,-3, +-2,6, +0,-5, +-10,5, +-2,7, +9,-7, +1,4, +-2,1, +-1,-2, +-7,-1, +-1,7, +-3,-4, +0,4, +6,7, +1,-5, +1,1, +-4,4, +2,-6, +-1,3, +-1,4, +0,-7, +-3,3, +4,3, +-1,-8, +-1,2, +1,5, +2,-5, +-2,1, +-1,6, +2,-3, +0,1, +0,5, +0,-5, +0,0, +0,5, +0,-5, +0,-1, +2,3, +-1,-6, +-2,-1, +2,5, +1,-5, +-1,-2, +-1,8, +4,-3, +-3,-3, +0,7, +-1,-4, +-1,-3, +2,6, +-4,-4, +1,-1, +1,5, +6,-7, +0,-4, +-3,4, +-1,-7, +-7,1, +-1,2, +-2,-1, +1,-4, +9,7, +-2,-7, +-10,-5, +0,5, +-2,-6, +7,3, +2,-8, +3,-2, +0,-5, +2,16, +3,-22, +-10,-6, +-10,11, +-2,-12, +-15,4, +1,14, +-3,5, +-10,1, +3,8, +-14,-8, +3,-2, +2,6, +-11,8, +15,-10, +14,16, +4,-2, +24,17, +2,22, +-1,13, +-17,-15, +-3,-7, +9,-20, +7,-6, +-1,-9, +-1,-13, +11,-1, +-26,5, +1,2, +-12,8, +8,13, +-9,-11, +-11,-9, +-2,-22, +11,10, +-4,-12, +6,29, +10,5, +14,0, +-3,4, +5,9, +16,-12, +-7,7, +-12,-15, +-16,28, +19,-1, +2,2, +10,1, +-5,2, +19,-47, +14,22, +23,-2, +-2,-28, +41,3, +7,9, +6,-30, +-2,15, +-26,-3, +-20,5, +16,1, +21,-9, +0,6, +34,17, +-36,10, +49,3, +23,-13, +21,20, +-8,-48, +6,17, +37,-20, +34,28, +-4,9, +36,-44, +-32,8, +31,68, +35,5, +-14,17, +10,-3, +18,27, +9,25, +4,-36, +18,-10, +-20,-1, +-8,9, +27,4, +-4,37, +19,11, +1,-15, +20,43, +43,24, +21,10, +-17,-54, +-8,-11, +-8,-12, +-35,28, +3,4, +-16,-45, +18,36, +11,17, +10,47, +-45,20, +33,1, +18,-41, +16,-35, +-21,9, +11,15, +39,-15, +-11,-32, +-19,26, +9,-36, +19,-17, +1,9, +-30,-40, +-6,34, +-36,-80, +-43,-11, +-8,3, +17,44, +-18,-34, +-1,33, +2,9, +-8,32, +4,5, +21,14, +-15,-50, +-20,44, +50,52, +-23,7, +8,53, +42,19, +43,48, +47,-14, +-36,13, +21,-8, +-3,29, +-17,-30, +-54,-55, +-28,18, +-14,-30, +-54,-6, +29,33, +12,-7, +6,-42, +21,3, +53,10, +-17,-27, +-8,21, +-51,5, +75,44, +35,-19, +47,-62, +-3,-8, +-22,-32, +-41,58, +21,15, +19,-29, +-48,28, +2,-4, +39,-12, +-56,7, +-28,-39, +-4,28, +-6,-82, +3,-15, +-48,-15, +54,14, +48,-5, +34,-1, +9,-42, +18,50, +-17,37, +11,0, +-62,35, +-59,-13, +-24,3, +-8,-20, +30,103, +71,-19, +-24,35, +-32,16, +-4,-26, +63,-38, +-45,-55, +-49,35, +40,-6, +22,-15, +15,-19, +-26,49, +-121,-35, +-69,25, +8,-18, +32,54, +37,-46, +95,-27, +-40,3, +1,-34, +39,58, +-15,-1, +65,-38, +98,-33, +22,-16, +-48,-30, +13,32, +24,-38, +-3,54, +67,-62, +109,-41, +52,26, +-34,21, +-42,22, +11,-43, +36,-52, +-36,30, +43,-34, +-73,7, +-22,-36, +-3,-80, +-20,-54, +-1,38, +13,15, +48,4, +-13,37, +-49,-24, +-2,-30, +-18,-23, +-46,-14, +15,4, +31,107, +-78,29, +6,-21, +-91,62, +60,-4, +-17,93, +35,-50, +72,37, +2,-29, +63,-15, +59,91, +61,-79, +34,50, +-22,9, +-71,60, +-24,78, +61,-17, +-52,-117, +19,44, +62,-31, +105,-51, +115,7, +-11,48, +12,63, +70,-42, +13,-71, +42,4, +82,47, +-85,99, +-26,-20, +24,-56, +57,140, +-50,11, +-51,35, +-36,-33, +-25,100, +7,-72, +-64,43, +-31,82, +36,-22, +-143,15, +111,-4, +18,-37, +45,37, +-67,69, +-91,-66, +-34,-86, +-14,-27, +33,17, +-36,-3, +103,-61, +-1,-45, +26,-70, +120,21, +-24,-22, +17,48, +73,64, +91,2, +121,-152, +-106,-4, +77,-12, +8,32, +-88,34, +36,-5, +36,91, +-73,4, +14,-10, +29,117, +27,-32, +23,3, +-61,-157, +-16,-77, +74,114, +-106,91, +-5,-155, +-99,-19, +55,-42, +104,-29, +17,-9, +32,41, +-10,26, +-65,67, +21,-38, +4,-152, +6,-39, +-1,133, +-21,-21, +-40,35, +13,-23, +65,-64, +-87,46, +-9,0, +21,15, +54,-54, +107,8, +20,36, +99,-16, +35,-4, +46,5, +-98,-19, +-86,12, +82,98, +-12,93, +28,-11, +-15,-117, +-86,-54, +-39,-22, +-47,-67, +-14,-111, +56,-44, +44,-105, +-33,60, +62,4, +-94,-26, +-11,-103, +126,-138, +89,-92, +18,30, +-6,-44, +-52,91, +17,-51, +-85,86, +-25,-101, +31,-47, +76,38, +85,182, +-22,-35, +66,26, +65,-5, +-40,20, +44,-89, +-67,-60, +-12,-45, +-4,103, +14,66, +-11,62, +-138,-129, +61,32, +-56,31, +-30,164, +-101,-3, +54,112, +61,91, +120,-26, +109,60, +32,-12, +17,12, +-2,34, +-59,-81, +14,-15, +-39,131, +-130,-125, +2,-97, +-30,-182, +78,48, +28,11, +-2,-29, +35,48, +-20,-52, +-95,2, +-140,8, +-20,-36, +-66,111, +-54,-3, +52,-39, +86,-69, +12,-165, +-117,-40, +74,12, +81,-61, +1,-107, +-54,-25, +118,-51, +-42,30, +-48,-59, +98,48, +85,4, +-85,-81, +-65,-94, +39,-41, +-42,-112, +100,-142, +-6,24, +-48,-271, +19,96, +65,13, +-99,38, +-16,30, +97,-17, +-74,-27, +15,-107, +-2,10, +-70,-91, +11,4, +107,-53, +-164,-40, +62,108, +-25,-3, +16,28, +9,36, +-162,51, +-12,122, +-76,-75, +103,54, +-3,-6, +-30,35, +-131,81, +15,66, +47,100, +-89,57, +196,-16, +-48,-14, +-107,-43, +-157,-150, +45,-67, +58,2, +-49,9, +-23,28, +146,-12, +13,295, +88,-13, +93,50, +-70,7, +-77,109, +161,58, +-50,1, +-82,86, +-48,-24, +-57,-35, +14,-76, +21,45, +-96,17, +31,-191, +196,-23, +1,17, +-105,130, +0,61, +-46,50, +146,51, +69,-182, +161,47, +-39,234, +-95,-17, +118,8, +-17,118, +-192,65, +88,-27, +117,3, +-6,6, +-11,-150, +62,-9, +-106,100, +-121,62, +59,-79, +-89,-2, +-157,109, +-46,-121, +93,-245, +84,84, +-153,-137, +-54,61, +-48,162, +-161,-89, +165,-163, +105,-2, +20,38, +-35,9, +35,15, +105,0, +-52,77, +-15,141, +-61,-66, +-37,-45, +-91,4, +-98,88, +101,-81, +-193,-94, +-96,-73, +-187,-58, +100,-74, +-49,103, +-43,-54, +151,-83, +104,164, +67,227, +38,-153, +-16,33, +-54,-111, +-85,44, +-126,15, +-52,34, +-36,159, +-59,-88, +61,-49, +-69,-14, +8,183, +-160,-21, +-23,146, +37,-25, +-126,-142, +5,205, +-23,-63, +37,6, +103,-13, +-32,29, +110,8, +46,67, +90,-45, +-36,-16, +9,5, +-29,60, +-154,-3, +158,-70, +-17,80, +276,-29, +12,-39, +137,-69, +146,58, +32,32, +114,91, +32,-63, +-67,-155, +-12,78, +129,24, +-103,-81, +115,-37, +160,108, +8,-183, +10,-50, +119,112, +84,43, +190,-185, +55,-16, +-113,77, +21,18, +-81,116, +22,119, +57,149, +-40,21, +41,-27, +-24,-32, +-18,-24, +25,-47, +66,-98, +371,166, +-71,56, +-19,69, +-10,57, +34,-21, +57,57, +-53,-5, +-59,-102, +70,-108, +-106,-151, +-82,-158, +-74,29, +-171,29, +-28,163, +-225,-62, +102,80, +56,24, +37,151, +-217,-80, +-42,-27, +-9,128, +133,-52, +87,76, +35,-37, +-96,-63, +101,-65, +-102,-45, +-127,-34, +-171,-181, +169,-31, +37,91, +31,14, +-142,114, +111,-38, +-154,59, +86,-1, +116,-206, +164,-139, +201,45, +66,20, +-122,81, +74,-97, +5,-9, +171,-56, +131,-36, +114,83, +25,131, +108,33, +155,72, +43,21, +-163,-144, +-146,47, +-28,41, +33,132, +-2,50, +-1,-212, +19,-21, +-28,-138, +-44,-94, +76,-136, +69,-42, +-165,97, +92,6, +23,28, +-14,-97, +104,62, +-152,86, +-100,-41, +32,4, +238,-15, +76,7, +-84,29, +-98,89, +-31,-48, +1,-130, +78,-61, +-18,-115, +200,9, +82,323, +-30,-146, +-225,69, +98,24, +273,-26, +132,94, +-205,-74, +69,-153, +-134,126, +-54,37, +34,-83, +-202,35, +28,67, +15,-24, +-160,14, +194,-75, +161,69, +49,-375, +-151,-101, +-32,106, +-51,-182, +64,-38, +42,-91, +155,-129, +59,34, +50,-148, +-51,62, +25,-6, +233,70, +60,156, +-105,149, +-50,-15, +34,-269, +7,158, +44,-112, +-67,193, +-94,11, +-39,14, +-39,136, +72,-21, +-219,40, +168,184, +-207,44, +-139,-89, +-7,-96, +113,173, +-189,-3, +-206,-11, +137,-139, +59,-100, +60,-28, +4,-78, +-259,-53, +54,-84, +186,-349, +-122,-146, +111,116, +125,-102, +60,22, +-135,13, +-135,112, +-124,98, +116,-76, +-121,-164, +71,-136, +-126,-52, +52,-158, +104,-26, +-194,-98, +123,-110, +-258,147, +-1,-122, +36,265, +-136,14, +-163,-16, +-71,-21, +65,75, +27,59, +115,17, +0,84, +-41,58, +-24,-108, +-58,-86, +-54,92, +100,-33, +216,24, +57,146, +56,-14, +-37,133, +69,-113, +20,14, +135,-30, +13,56, +-176,120, +37,-117, +103,-329, +22,-130, +109,3, +-183,-87, +134,-12, +-16,128, +22,-62, +145,-292, +92,-81, +-89,-76, +17,-40, +-88,45, +93,-50, +93,-63, +-4,-241, +46,-44, +-163,-3, +134,182, +-83,290, +9,154, +-49,-85, +107,-104, +-36,-8, +-18,51, +28,118, +253,-54, +-12,-172, +-85,252, +76,-14, +-211,-192, +-36,-78, +-149,26, +135,52, +-73,210, +-1,139, +-76,43, +-113,-57, +-53,56, +-33,-102, +153,-84, +-60,-160, +-31,-97, +22,-17, +171,206, +14,-134, +217,7, +-138,252, +107,-29, +59,-4, +-106,28, +48,26, +9,41, +-59,-57, +-77,24, +-94,202, +247,-62, +59,-127, +73,-203, +-3,-49, +-245,-131, +120,318, +24,-100, +-84,-177, +68,-19, +132,-13, +-38,-173, +-47,98, +40,28, +-29,113, +131,130, +70,140, +103,111, +21,-47, +-143,47, +91,-74, +-54,57, +-56,-315, +-265,-169, +16,126, +-179,-124, +-203,-27, +-22,4, +-22,65, +132,-67, +-138,-27, +-48,44, +-158,-39, +54,56, +-83,23, +17,-40, +-181,23, +233,200, +69,110, +211,94, +-178,61, +172,47, +87,-109, +-45,-33, +150,97, +-42,7, +112,-109, +-10,-112, +-109,93, +169,40, +233,-293, +-40,86, +-144,23, +-58,56, +-325,-107, +74,-3, +43,-78, +41,172, +-84,39, +-72,65, +220,101, +98,20, +123,-106, +-282,-159, +-89,-142, +-7,-70, +-42,73, +-147,-178, +-101,-23, +32,53, +-66,9, +140,-2, +82,-58, +-14,-55, +-211,-123, +-71,43, +148,-53, +-337,-140, +-183,-73, +-50,-94, +94,154, +115,-278, +-143,-69, +-180,-189, +368,-159, +-155,122, +148,-51, +-12,-415, +-6,94, +-100,-202, +-54,117, +-51,-177, +-19,-109, +109,-61, +-47,97, +-161,161, +212,53, +-67,-35, +11,-170, +106,-75, +50,-238, +-14,30, +109,-219, +-41,-93, +286,-18, +-97,37, +-58,-180, +-9,23, +-17,-7, +-245,179, +282,7, +-53,-100, +-112,-67, +57,16, +21,-69, +-227,-178, +19,45, +-162,-42, +115,-59, +43,1, +257,123, +-59,31, +-42,38, +-56,-79, +-98,252, +-11,-15, +66,116, +25,-109, +140,16, +177,-22, +-9,-145, +292,46, +80,185, +-175,91, +-261,-233, +-73,-17, +-245,-248, +89,-165, +-56,-1, +-35,-109, +-116,113, +117,56, +-34,-95, +-15,272, +3,-18, +-161,-19, +-185,191, +104,15, +-89,164, +32,155, +148,109, +50,19, +155,-72, +-261,11, +210,-33, +67,-123, +88,13, +-125,-140, +129,166, +70,155, +-25,-11, +85,-106, +-58,-119, +33,42, +-32,139, +85,17, +-70,152, +134,39, +91,-33, +-3,-105, +94,-200, +-6,147, +-110,-49, +71,91, +22,-8, +-66,7, +46,149, +14,-65, +-49,-22, +-78,-101, +-11,160, +165,-160, +-69,-108, +40,186, +313,68, +201,-172, +150,-192, +160,168, +-148,-259, +0,0, +23,184, +136,-86, +89,77, +1,-3, +-122,-134, +-29,55, +109,57, +88,218, +-28,-100, +67,-133, +70,114, +157,-89, +-54,-16, +136,53, +-42,44, +25,22, +-149,-53, +148,28, +205,110, +8,-77, +9,-76, +61,160, +254,-152, +159,5, +174,22, +-129,67, +153,72, +93,136, +33,-261, +-109,-27, +-57,-32, +-78,-164, +-281,-63, +317,-159, +231,-6, +75,5, +72,-178, +-119,-83, +113,-349, +-76,-272, +-28,-82, +-256,-96, +-96,46, +68,-58, +76,-10, +87,241, +-162,-86, +11,155, +-28,-99, +7,46, +-105,103, +32,182, +-26,-134, +38,207, +-118,99, +-22,50, +51,22, +-13,-44, +24,289, +128,130, +144,5, +21,128, +-14,-60, +124,15, +-17,143, +103,-74, +-88,-20, +-145,135, +130,52, +147,-66, +233,100, +-120,7, +35,-131, +226,-87, +-110,36, +38,99, +85,57, +23,20, +-52,36, +179,-103, +183,132, +99,190, +-39,34, +-3,109, +-129,-198, +-73,172, +-45,81, +-175,136, +157,92, +57,40, +94,-13, +-149,255, +-85,-65, +-256,189, +-141,160, +-80,139, +-227,-3, +12,152, +-4,70, +37,-232, +155,-110, +-29,12, +48,274, +-148,104, +13,-157, +27,-200, +70,-39, +-216,-302, +-191,-22, +-223,-155, +-24,47, +-204,-123, +11,66, +-239,-87, +-9,128, +103,-55, +-76,151, +-78,275, +-11,38, +156,-65, +121,-36, +-42,-47, +-96,69, +-18,-320, +177,145, +-46,-128, +103,2, +153,-45, +18,111, +-110,83, +82,22, +-93,456, +3,126, +44,129, +121,-121, +-45,-28, +83,105, +-179,-92, +9,-146, +158,11, +-13,-14, +-170,-140, +-97,-16, +-35,15, +-4,-37, +148,56, +-185,29, +20,-78, +79,-53, +-15,-87, +-159,-4, +-27,-130, +-38,-235, +10,118, +257,373, +-121,-105, +-23,-103, +-108,146, +42,-74, +102,-322, +98,9, +65,77, +-27,-48, +-109,-141, +-124,95, +-57,-51, +62,-114, +153,22, +-359,47, +170,154, +-70,-2, +199,221, +-81,-104, +64,252, +-185,17, +120,243, +-112,48, +-5,-209, +-13,-187, +5,-86, +-46,133, +-125,-150, +159,218, +104,91, +24,80, +-66,-253, +-49,-118, +-81,86, +-146,75, +-197,-11, +16,-90, +212,218, +68,74, +136,55, +168,190, +-57,157, +-65,57, +38,69, +-27,-66, +73,-26, +14,-28, +196,142, +-3,-73, +-77,125, +55,26, +128,-79, +11,157, +121,206, +47,-115, +-149,-121, +91,-83, +38,34, +42,-74, +-58,21, +149,338, +-235,169, +-67,-70, +14,-148, +20,108, +330,-251, +-148,-137, +10,43, +231,160, +242,-17, +-6,299, +-75,-181, +-81,8, +191,-160, +-25,-20, +71,-103, +-145,249, +39,-50, +-47,165, +-72,-202, +-50,-58, +38,-11, +-112,0, +20,57, +-102,169, +-45,18, +17,100, +-106,-104, +24,-105, +-56,-98, +21,158, +112,-10, +-13,-29, +45,-163, +-15,88, +-20,-127, +89,-76, +56,-110, +91,-54, +25,-48, +-33,-343, +89,70, +47,222, +-138,68, +-151,-108, +254,132, +-54,109, +-78,-30, +-53,23, +-56,-88, +57,25, +-7,-57, +175,7, +-131,-100, +-54,22, +-71,115, +-53,220, +-90,25, +208,1, +201,126, +-240,-191, +165,-157, +-164,77, +-98,34, +144,102, +99,-73, +-229,17, +-86,-77, +94,-83, +47,148, +32,173, +-88,10, +-61,-215, +-292,-98, +54,108, +66,-78, +-88,145, +195,17, +-146,-99, +71,-6, +-214,91, +-105,-70, +-41,-104, +78,-176, +42,51, +-71,-31, +-58,2, +-8,-83, +-24,206, +-42,-133, +-21,-17, +-33,173, +-24,-101, +-31,-142, +-80,103, +231,-8, +74,87, +-28,119, +112,-122, +-155,25, +33,34, +101,-268, +-134,-72, +-8,59, +51,0, +-21,42, +-55,138, +-51,-75, +71,176, +46,-194, +152,27, +-36,101, +-32,44, +93,37, +-63,-31, +-166,-185, +-74,44, +-141,-77, +141,54, +-91,57, +-101,-51, +-14,1, +6,98, +101,15, +93,-26, +23,-42, +141,-234, +-44,110, +6,20, +-183,-54, +0,89, +-140,-162, +54,24, +-13,288, +73,-25, +51,203, +-91,-191, +147,58, +-45,-197, +80,72, +103,127, +-16,5, +-60,114, +-7,-47, +57,14, +50,71, +-50,0, +-213,129, +-26,16, +9,38, +-65,136, +-55,-278, +-138,246, +97,192, +-43,19, +91,-65, +-96,-103, +67,-99, +56,124, +-50,-50, +104,50, +97,127, +130,-66, +42,124, +-98,9, +-90,112, +43,194, +-20,8, +-24,103, +36,42, +-27,11, +-118,59, +-40,-178, +-90,38, +0,70, +181,-59, +51,-51, +53,1, +-129,144, +128,88, +-50,-55, +9,-125, +-13,53, +-31,116, +-21,52, +-84,122, +-131,-237, +-150,-87, +-97,77, +142,-144, +225,-100, +32,-138, +185,-26, +73,50, +-23,32, +85,-79, +-40,-76, +-7,135, +-65,40, +-101,-16, +64,-134, +-206,-54, +-81,195, +-4,-68, +22,-88, +-32,-185, +-101,46, +131,37, +73,34, +9,-26, +-69,27, +93,83, +24,-63, +107,144, +55,-9, +57,-126, +-141,81, +117,57, +160,-17, +-34,53, +88,103, +-186,-28, +-183,89, +-11,97, +-28,-200, +-283,240, +16,63, +106,-21, +-40,74, +-69,-62, +23,3, +14,-154, +-185,-27, +-51,49, +-10,38, +-123,102, +169,-93, +182,184, +-79,-45, +13,66, +30,43, +-77,107, +21,289, +13,91, +-81,78, +-10,-22, +18,144, +21,20, +-234,-170, +52,-40, +-118,13, +-31,-252, +60,-20, +-121,48, +59,-37, +85,-34, +-11,-4, +-25,86, +45,-45, +169,12, +-43,-100, +-84,0, +54,-145, +-131,-59, +26,-40, +66,133, +101,55, +103,27, +78,102, +-27,111, +-5,115, +-88,69, +25,52, +-4,6, +160,62, +83,-22, +10,43, +129,54, +229,-51, +-63,-93, +-57,-10, +-51,-88, +-149,103, +-28,-53, +135,-111, +95,177, +-65,45, +-169,-40, +21,144, +0,-116, +191,7, +74,7, +-82,23, +-77,119, +-184,35, +174,118, +123,48, +0,-79, +-41,188, +160,84, +93,-46, +-34,-231, +175,26, +-24,75, +-145,76, +159,163, +-104,-120, +43,-86, +148,-82, +-19,82, +21,146, +-27,-46, +-53,-120, +92,-62, +-112,-75, +-83,6, +-3,125, +26,195, +11,-16, +45,64, +-4,154, +42,48, +31,-92, +81,58, +78,-106, +130,5, +81,100, +18,58, +73,86, +84,125, +20,-82, +-140,-5, +-18,-41, +-116,-27, +5,-37, +-53,97, +12,129, +10,-112, +82,33, +-105,114, +-12,-64, +99,35, +-132,-38, +-102,-39, +-55,16, +-32,-136, +-112,-20, +-6,-119, +103,96, +53,-40, +-43,-72, +202,38, +129,-21, +163,-34, +38,25, +-41,-28, +138,-7, +-53,114, +100,122, +-28,-29, +81,-94, +31,0, +-40,-114, +-69,-88, +-112,123, +106,-104, +-74,-67, +10,178, +173,-83, +-40,-170, +74,-35, +-54,-6, +66,-182, +65,-57, +1,-55, +60,82, +13,79, +34,57, +20,-14, +-27,-71, +-37,140, +48,18, +90,59, +-75,34, +81,-5, +19,-56, +-66,123, +106,35, +-4,-21, +-110,-66, +-139,39, +84,9, +-8,-122, +57,-42, +-92,-88, +-105,38, +140,-89, +35,-53, +-55,83, +-33,-53, +20,37, +8,89, +2,29, +-62,138, +-178,94, +27,99, +-22,-19, +-92,-155, +-43,-82, +-66,-28, +140,-61, +63,4, +-10,8, +-30,-53, +-64,55, +54,-19, +107,30, +24,-84, +-90,138, +13,64, +40,2, +-36,-17, +-6,-82, +-78,-49, +75,-13, +40,2, +-14,-8, +116,10, +45,-12, +85,-32, +80,-60, +-54,4, +96,92, +1,100, +19,-9, +67,43, +-49,10, +25,-2, +-73,41, +-96,-65, +57,86, +164,-34, +-4,-5, +57,-102, +-123,-3, +119,14, +52,-69, +-49,-63, +124,-78, +-1,35, +-41,60, +74,-24, +-27,-49, +54,27, +80,39, +-5,17, +-25,67, +-115,-42, +95,59, +-120,-25, +195,29, +57,61, +1,-63, +15,17, +-78,-93, +38,-20, +43,-80, +-50,56, +-1,7, +-115,70, +4,28, +46,41, +8,51, +17,-55, +-5,-54, +-4,15, +32,-45, +20,53, +-93,-124, +17,-86, +-79,15, +-3,-1, +98,-7, +7,19, +-35,20, +55,78, +-116,7, +126,-5, +16,-57, +-17,13, +62,31, +26,-53, +-112,5, +-37,2, +-37,-4, +-23,16, +31,-64, +-13,60, +38,56, +80,25, +-40,68, +-42,-79, +-2,-15, +11,24, +17,-45, +0,-19, +-32,10, +95,-25, +-82,-29, +11,-17, +14,1, +-47,44, +-123,-2, +33,-98, +21,-23, +-28,-86, +-14,80, +17,-56, +-2,63, +69,5, +-36,-30, +-17,-32, +-73,-139, +-46,34, +118,-12, +58,12, +-43,68, +-28,-59, +-5,-100, +3,50, +-22,70, +97,-80, +-21,8, +-74,-51, +-24,28, +-24,-11, +49,123, +21,1, +43,-102, +111,39, +-24,-63, +-38,-35, +-2,37, +9,73, +-57,-71, +38,46, +-40,-25, +-7,-102, +74,80, +24,20, +-29,-21, +22,-64, +112,18, +-22,25, +-64,9, +-95,-4, +17,26, +-32,56, +-86,1, +21,8, +-32,5, +-8,-14, +-64,33, +47,14, +14,18, +0,-4, +-71,-36, +-9,18, +-5,-40, +62,-10, +16,0, +42,-61, +12,21, +-24,-18, +-36,-18, +0,-20, +-67,-3, +121,-33, +-14,16, +18,-47, +-37,57, +-9,11, +-93,23, +67,-66, +-20,11, +78,98, +24,70, +24,-21, +-70,30, +-35,-4, +-33,109, +9,-26, +-57,-78, +68,23, +108,-45, +24,33, +-42,-3, +8,29, +6,-11, +-93,6, +4,-20, +60,31, +28,48, +3,-1, +5,28, +5,-4, +37,-18, +-15,42, +34,67, +-32,-51, +-6,36, +8,14, +29,-54, +47,12, +51,50, +23,19, +34,48, +32,51, +21,2, +-46,-51, +43,-47, +31,-24, +-58,-18, +-43,-8, +-14,-9, +76,47, +-1,28, +30,-12, +-29,-43, +22,25, +-73,-2, +-60,-40, +31,37, +33,-42, +60,10, +-10,-28, +65,26, +-29,-19, +64,85, +9,-71, +20,6, +6,-25, +-27,44, +-16,-17, +17,-40, +-10,-19, +-51,-13, +54,17, +-13,33, +-86,14, +-6,12, +35,-3, +-44,-60, +5,39, +65,6, +36,25, +-48,1, +-42,-29, +-3,-24, +-3,-4, +-35,22, +-4,-20, +10,5, +-1,-17, +4,28, +3,-8, +-14,-37, +-19,-29, +-7,5, +-3,21, +-27,-1, +-16,-8, +8,-29, +5,31, +-18,4, +-9,15, +85,-8, +31,5, +51,-16, +-1,4, +14,-5, +18,27, +-37,18, +21,11, +-28,1, +2,26, +-46,-30, +31,-14, +-17,34, +-29,24, +35,-2, +33,-19, +20,1, +21,3, +-19,-2, +23,-14, +-16,-47, +0,15, +-18,-37, +12,-25, +-50,-38, +-8,-23, +-33,-11, +-25,29, +-22,-16, +15,-12, +34,-8, +23,21, +-40,-5, +-20,23, +7,8, +17,-29, +9,-1, +10,-28, +39,-29, +3,-14, +24,-35, +1,-6, +24,1, +-4,28, +10,-8, +21,6, +22,-22, +-7,-12, +15,-2, +-24,-16, +26,2, +23,11, +3,25, +5,14, +-9,3, +7,-4, +8,14, +7,-3, +8,3, +-11,6, +-17,17, +6,-7, +4,0, +-2,48, +4,-8, +14,-13, +-3,6, +-2,-8, +6,10, +6,8, +-1,0, +-1,-2, +14,19, +9,11, +14,-3, +19,7, +-17,0, +7,-6, +24,1, +-9,-8, +12,5, +3,0, +10,-5, +1,-7, +4,9, +-11,-10, +19,-4, +-1,1, +6,10, +1,0, +-7,-5, +3,-11, +-10,-14, +-17,11, +-15,-7, +-14,2, +0,-1, +-7,5, +-1,15, +0,8, +-15,-1, +0,-17, +-1,5, +-11,-3, +1,-8, +-3,15, +6,0, +4,-3, +1,5, +-5,11, +3,0, +-3,9, +1,-2, +-1,-3, +0,10, +3,3, +-1,-6, +-2,1, +3,4, +1,-6, +-2,7, +1,1, +-1,-2, +-1,5, +-1,0, +1,-4, +3,6, +-1,0, +0,-6, +0,5, +0,1, +0,-5, +0,5, +0,0, +0,-5, +0,5, +0,-1, +0,-5, +0,6, +-1,0, +3,-6, +1,4, +-1,0, +-1,-5, +-1,2, +1,-1, +-2,-7, +1,6, +3,-4, +-2,-1, +-1,6, +3,-3, +0,-10, +-1,3, +1,2, +-3,-9, +3,0, +-5,-11, +1,-5, +4,3, +6,0, +-3,-15, +1,8, +-11,3, +-1,-5, +0,17, +-15,1, +0,-8, +-1,-15, +-7,-5, +0,1, +-14,-2, +-15,7, +-17,-11, +-10,14, +3,11, +-7,5, +1,0, +6,-10, +-1,-1, +19,4, +-11,10, +4,-9, +1,7, +10,5, +3,0, +12,-5, +-9,8, +24,-1, +7,6, +-17,0, +19,-7, +14,3, +9,-11, +14,-19, +-1,2, +-1,0, +6,-8, +6,-10, +-2,8, +-3,-6, +14,13, +4,8, +-2,-48, +4,0, +6,7, +-17,-17, +-11,-6, +8,-3, +7,3, +8,-14, +7,4, +-9,-3, +5,-14, +3,-25, +23,-11, +26,-2, +-24,16, +15,2, +-7,12, +22,22, +21,-6, +10,8, +-4,-28, +24,-1, +1,6, +24,35, +3,14, +39,29, +10,28, +9,1, +17,29, +7,-8, +-20,-23, +-40,5, +23,-21, +34,8, +15,12, +-22,16, +-25,-29, +-33,11, +-8,23, +-50,38, +12,25, +-18,37, +0,-15, +-16,47, +23,14, +-19,2, +21,-3, +20,-1, +33,19, +35,2, +-29,-24, +-17,-34, +31,14, +-46,30, +2,-26, +-28,-1, +21,-11, +-37,-18, +18,-27, +14,5, +-1,-4, +51,16, +31,-5, +85,8, +-9,-15, +-18,-4, +5,-31, +8,29, +-16,8, +-27,1, +-3,-21, +-7,-5, +-19,29, +-14,37, +3,8, +4,-28, +-1,17, +10,-5, +-4,20, +-35,-22, +-3,4, +-3,24, +-42,29, +-48,-1, +36,-25, +65,-6, +5,-39, +-44,60, +35,3, +-6,-12, +-86,-14, +-13,-33, +54,-17, +-51,13, +-10,19, +17,40, +-16,17, +-27,-44, +6,25, +20,-6, +9,71, +64,-85, +-29,19, +65,-26, +-10,28, +60,-10, +33,42, +31,-37, +-60,40, +-73,2, +22,-25, +-29,43, +30,12, +-1,-28, +76,-47, +-14,9, +-43,8, +-58,18, +31,24, +43,47, +-46,51, +21,-2, +32,-51, +34,-48, +23,-19, +51,-50, +47,-12, +29,54, +8,-14, +-6,-36, +-32,51, +34,-67, +-15,-42, +37,18, +5,4, +5,-28, +3,1, +28,-48, +60,-31, +4,20, +-93,-6, +6,11, +8,-29, +-42,3, +24,-33, +108,45, +68,-23, +-57,78, +9,26, +-33,-109, +-35,4, +-70,-30, +24,21, +24,-70, +78,-98, +-20,-11, +67,66, +-93,-23, +-9,-11, +-37,-57, +18,47, +-14,-16, +121,33, +-67,3, +0,20, +-36,18, +-24,18, +12,-21, +42,61, +16,0, +62,10, +-5,40, +-9,-18, +-71,36, +0,4, +14,-18, +47,-14, +-64,-33, +-8,14, +-32,-5, +21,-8, +-86,-1, +-32,-56, +17,-26, +-95,4, +-64,-9, +-22,-25, +112,-18, +22,64, +-29,21, +24,-20, +74,-80, +-7,102, +-40,25, +38,-46, +-57,71, +9,-73, +-2,-37, +-38,35, +-24,63, +111,-39, +43,102, +21,-1, +49,-123, +-24,11, +-24,-28, +-74,51, +-21,-8, +97,80, +-22,-70, +3,-50, +-5,100, +-28,59, +-43,-68, +58,-12, +118,12, +-46,-34, +-73,139, +-17,32, +-36,30, +69,-5, +-2,-63, +17,56, +-14,-80, +-28,86, +21,23, +33,98, +-123,2, +-47,-44, +14,-1, +11,17, +-82,29, +95,25, +-32,-10, +0,19, +17,45, +11,-24, +-2,15, +-42,79, +-40,-68, +80,-25, +38,-56, +-13,-60, +31,64, +-23,-16, +-37,4, +-37,-2, +-112,-5, +26,53, +62,-31, +-17,-13, +16,57, +126,5, +-116,-7, +55,-78, +-35,-20, +7,-19, +98,7, +-3,1, +-79,-15, +17,86, +-93,124, +20,-53, +32,45, +-4,-15, +-5,54, +17,55, +8,-51, +46,-41, +4,-28, +-115,-70, +-1,-7, +-50,-56, +43,80, +38,20, +-78,93, +15,-17, +1,63, +57,-61, +195,-29, +-120,25, +95,-59, +-115,42, +-25,-67, +-5,-17, +80,-39, +54,-27, +-27,49, +74,24, +-41,-60, +-1,-35, +124,78, +-49,63, +52,69, +119,-14, +-123,3, +57,102, +-4,5, +164,34, +57,-86, +-96,65, +-73,-41, +25,2, +-49,-10, +67,-43, +19,9, +1,-100, +96,-92, +-54,-4, +80,60, +85,32, +45,12, +116,-10, +-14,8, +40,-2, +75,13, +-78,49, +-6,82, +-36,17, +40,-2, +13,-64, +-90,-138, +24,84, +107,-30, +54,19, +-64,-55, +-30,53, +-10,-8, +63,-4, +140,61, +-66,28, +-43,82, +-92,155, +-22,19, +27,-99, +-178,-94, +-62,-138, +2,-29, +8,-89, +20,-37, +-33,53, +-55,-83, +35,53, +140,89, +-105,-38, +-92,88, +57,42, +-8,122, +84,-9, +-139,-39, +-110,66, +-4,21, +106,-35, +-66,-123, +19,56, +81,5, +-75,-34, +90,-59, +48,-18, +-37,-140, +-27,71, +20,14, +34,-57, +13,-79, +60,-82, +1,55, +65,57, +66,182, +-54,6, +74,35, +-40,170, +173,83, +10,-178, +-74,67, +106,104, +-112,-123, +-69,88, +-40,114, +31,0, +81,94, +-28,29, +100,-122, +-53,-114, +138,7, +-41,28, +38,-25, +163,34, +129,21, +202,-38, +-43,72, +53,40, +103,-96, +-6,119, +-112,20, +-32,136, +-55,-16, +-102,39, +-132,38, +99,-35, +-12,64, +-105,-114, +82,-33, +10,112, +12,-129, +-53,-97, +5,37, +-116,27, +-18,41, +-140,5, +20,82, +84,-125, +73,-86, +18,-58, +81,-100, +130,-5, +78,106, +81,-58, +31,92, +42,-48, +-4,-154, +45,-64, +11,16, +26,-195, +-3,-125, +-83,-6, +-112,75, +92,62, +-53,120, +-27,46, +21,-146, +-19,-82, +148,82, +43,86, +-104,120, +159,-163, +-145,-76, +-24,-75, +175,-26, +-34,231, +93,46, +160,-84, +-41,-188, +0,79, +123,-48, +174,-118, +-184,-35, +-77,-119, +-82,-23, +74,-7, +191,-7, +0,116, +21,-144, +-169,40, +-65,-45, +95,-177, +135,111, +-28,53, +-149,-103, +-51,88, +-57,10, +-63,93, +229,51, +129,-54, +10,-43, +83,22, +160,-62, +-4,-6, +25,-52, +-88,-69, +-5,-115, +-27,-111, +78,-102, +103,-27, +101,-55, +66,-133, +26,40, +-131,59, +54,145, +-84,0, +-43,100, +169,-12, +45,45, +-25,-86, +-11,4, +85,34, +59,37, +-121,-48, +60,20, +-31,252, +-118,-13, +52,40, +-234,170, +21,-20, +18,-144, +-10,22, +-81,-78, +13,-91, +21,-289, +-77,-107, +30,-43, +13,-66, +-79,45, +182,-184, +169,93, +-123,-102, +-10,-38, +-51,-49, +-185,27, +14,154, +23,-3, +-69,62, +-40,-74, +106,21, +16,-63, +-283,-240, +-28,200, +-11,-97, +-183,-89, +-186,28, +88,-103, +-34,-53, +160,17, +117,-57, +-141,-81, +57,126, +55,9, +107,-144, +24,63, +93,-83, +-69,-27, +9,26, +73,-34, +131,-37, +-101,-46, +-32,185, +22,88, +-4,68, +-81,-195, +-206,54, +64,134, +-101,16, +-65,-40, +-7,-135, +-40,76, +85,79, +-23,-32, +73,-50, +185,26, +32,138, +225,100, +142,144, +-97,-77, +-150,87, +-131,237, +-84,-122, +-21,-52, +-31,-116, +-13,-53, +9,125, +-50,55, +128,-88, +-129,-144, +53,-1, +51,51, +181,59, +0,-70, +-90,-38, +-40,178, +-118,-59, +-27,-11, +36,-42, +-24,-103, +-20,-8, +43,-194, +-90,-112, +-98,-9, +42,-124, +130,66, +97,-127, +104,-50, +-50,50, +56,-124, +67,99, +-96,103, +91,65, +-43,-19, +97,-192, +-138,-246, +-55,278, +-65,-136, +9,-38, +-26,-16, +-213,-129, +-50,0, +50,-71, +57,-14, +-7,47, +-60,-114, +-16,-5, +103,-127, +80,-72, +-45,197, +147,-58, +-91,191, +51,-203, +73,25, +-13,-288, +54,-24, +-140,162, +0,-89, +-183,54, +6,-20, +-44,-110, +141,234, +23,42, +93,26, +101,-15, +6,-98, +-14,-1, +-101,51, +-91,-57, +141,-54, +-141,77, +-74,-44, +-166,185, +-63,31, +93,-37, +-32,-44, +-36,-101, +152,-27, +46,194, +71,-176, +-51,75, +-55,-138, +-21,-42, +51,0, +-8,-59, +-134,72, +101,268, +33,-34, +-155,-25, +112,122, +-28,-119, +74,-87, +231,8, +-80,-103, +-31,142, +-24,101, +-33,-173, +-21,17, +-42,133, +-24,-206, +-8,83, +-58,-2, +-71,31, +42,-51, +78,176, +-41,104, +-105,70, +-214,-91, +71,6, +-146,99, +195,-17, +-88,-145, +66,78, +54,-108, +-292,98, +-61,215, +-88,-10, +32,-173, +47,-148, +94,83, +-86,77, +-229,-17, +99,73, +144,-102, +-98,-34, +-164,-77, +165,157, +-240,191, +201,-126, +208,-1, +-90,-25, +-53,-220, +-71,-115, +-54,-22, +-131,100, +175,-7, +-7,57, +57,-25, +-56,88, +-53,-23, +-78,30, +-54,-109, +254,-132, +-151,108, +-138,-68, +47,-222, +89,-70, +-33,343, +25,48, +91,54, +56,110, +89,76, +-20,127, +-15,-88, +45,163, +-13,29, +112,10, +21,-158, +-56,98, +24,105, +-106,104, +17,-100, +-45,-18, +-102,-169, +20,-57, +-112,0, +38,11, +-50,58, +-72,202, +-47,-165, +39,50, +-145,-249, +71,103, +-25,20, +191,160, +-81,-8, +-75,181, +-6,-299, +242,17, +231,-160, +10,-43, +-148,137, +330,251, +20,-108, +14,148, +-67,70, +-235,-169, +149,-338, +-58,-21, +42,74, +38,-34, +91,83, +-149,121, +47,115, +121,-206, +11,-157, +128,79, +55,-26, +-77,-125, +-3,73, +196,-142, +14,28, +73,26, +-27,66, +38,-69, +-65,-57, +-57,-157, +168,-190, +136,-55, +68,-74, +212,-218, +16,90, +-197,11, +-146,-75, +-81,-86, +-49,118, +-66,253, +24,-80, +104,-91, +159,-218, +-125,150, +-46,-133, +5,86, +-13,187, +-5,209, +-112,-48, +120,-243, +-185,-17, +64,-252, +-81,104, +199,-221, +-70,2, +170,-154, +-359,-47, +153,-22, +62,114, +-57,51, +-124,-95, +-109,141, +-27,48, +65,-77, +98,-9, +102,322, +42,74, +-108,-146, +-23,103, +-121,105, +257,-373, +10,-118, +-38,235, +-27,130, +-159,4, +-15,87, +79,53, +20,78, +-185,-29, +148,-56, +-4,37, +-35,-15, +-97,16, +-170,140, +-13,14, +158,-11, +9,146, +-179,92, +83,-105, +-45,28, +121,121, +44,-129, +3,-126, +-93,-456, +82,-22, +-110,-83, +18,-111, +153,45, +103,-2, +-46,128, +177,-145, +-18,320, +-96,-69, +-42,47, +121,36, +156,65, +-11,-38, +-78,-275, +-76,-151, +103,55, +-9,-128, +-239,87, +11,-66, +-204,123, +-24,-47, +-223,155, +-191,22, +-216,302, +70,39, +27,200, +13,157, +-148,-104, +48,-274, +-29,-12, +155,110, +37,232, +-4,-70, +12,-152, +-227,3, +-80,-139, +-141,-160, +-256,-189, +-85,65, +-149,-255, +94,13, +57,-40, +157,-92, +-175,-136, +-45,-81, +-73,-172, +-129,198, +-3,-109, +-39,-34, +99,-190, +183,-132, +179,103, +-52,-36, +23,-20, +85,-57, +38,-99, +-110,-36, +226,87, +35,131, +-120,-7, +233,-100, +147,66, +130,-52, +-145,-135, +-88,20, +103,74, +-17,-143, +124,-15, +-14,60, +21,-128, +144,-5, +128,-130, +24,-289, +-13,44, +51,-22, +-22,-50, +-118,-99, +38,-207, +-26,134, +32,-182, +-105,-103, +7,-46, +-28,99, +11,-155, +-162,86, +87,-241, +76,10, +68,58, +-96,-46, +-256,96, +-28,82, +-76,272, +113,349, +-119,83, +72,178, +75,-5, +231,6, +317,159, +-281,63, +-78,164, +-57,32, +-109,27, +33,261, +93,-136, +153,-72, +-129,-67, +174,-22, +159,-5, +254,152, +61,-160, +9,76, +8,77, +205,-110, +148,-28, +-149,53, +25,-22, +-42,-44, +136,-53, +-54,16, +157,89, +70,-114, +67,133, +-28,100, +88,-218, +109,-57, +-29,-55, +-122,134, +1,3, +89,-77, +136,86, +23,-184, +6,0, +133,-78, +-155,-86, +-43,67, +367,-187, +7,52, +-179,-111, +23,231, +157,-59, +18,-13, +-138,3, +-49,118, +15,0, +-40,-130, +162,-119, +180,66, +29,67, +61,67, +92,134, +-85,34, +54,-241, +258,291, +154,-103, +-37,48, +118,20, +-54,59, +-80,-180, +-58,-190, +85,189, +215,42, +60,44, +85,-66, +60,109, +96,-18, +233,44, +-36,-90, +83,-74, +54,-72, +66,175, +-40,-48, +121,-45, +-50,-93, +-76,-117, +44,-6, +68,216, +31,55, +-78,-37, +-1,-83, +-30,51, +221,333, +28,-93, +137,-137, +84,0, +41,4, +-230,37, +42,68, +250,9, +46,40, +-32,-9, +-32,13, +-87,71, +81,-87, +15,107, +154,263, +-62,-14, +-32,-26, +135,130, +-96,58, +138,15, +-226,-155, +28,203, +234,-74, +26,275, +153,-12, +-243,35, +62,245, +-85,141, +-4,-148, +5,-55, +-130,48, +56,22, +138,3, +-91,34, +-165,180, +-104,-103, +114,-18, +-50,102, +-155,185, +73,-278, +-246,-37, +-162,-46, +86,42, +59,59, +-4,96, +145,49, +-95,-52, +246,-207, +182,-54, +-228,24, +-272,-75, +10,-79, +18,36, +112,134, +132,-135, +42,41, +44,52, +45,118, +0,-124, +204,-288, +-19,92, +-204,88, +34,-73, +30,-96, +-57,-30, +-123,116, +-34,12, +-110,-325, +-205,-60, +48,20, +-33,-99, +-5,-138, +-49,-43, +-20,84, +-149,189, +-12,-145, +137,125, +92,63, +56,-26, +-106,119, +145,171, +-144,16, +68,63, +-55,-31, +21,44, +61,42, +203,243, +166,-103, +-38,13, +-58,-144, +-179,-199, +-31,-5, +-187,190, +106,-6, +-75,120, +-81,-55, +-81,221, +-231,103, +59,52, +61,51, +47,-132, +119,-84, +-69,99, +56,-54, +-116,-53, +73,67, +-194,-290, +285,-178, +-158,43, +225,52, +-196,-45, +-47,0, +54,11, +268,51, +-176,73, +44,-93, +116,-30, +220,77, +51,-245, +111,-155, +-31,108, +-28,-227, +-134,-6, +-81,130, +-102,-111, +-151,54, +51,150, +151,55, +-331,-253, +-107,-63, +12,161, +3,43, +59,20, +74,-350, +-70,-51, +249,208, +-127,68, +-40,46, +70,106, +-94,35, +129,273, +-137,152, +103,9, +-143,192, +-190,-122, +85,-195, +96,-10, +49,152, +-68,-58, +159,146, +211,71, +-53,124, +-92,68, +24,11, +-322,-346, +90,107, +25,-206, +-15,206, +-30,-42, +61,47, +-89,177, +-57,-33, +170,34, +21,-22, +-127,241, +-84,76, +92,104, +32,17, +39,177, +60,-151, +-36,-123, +160,186, +-56,33, +58,16, +-32,13, +140,-42, +197,157, +-78,272, +30,-210, +14,-74, +49,45, +57,-89, +1,-20, +-110,119, +-127,11, +-56,-107, +58,318, +-66,-27, +-44,64, +-43,51, +-107,143, +62,152, +25,62, +133,160, +71,11, +88,117, +-86,19, +73,88, +-60,198, +-147,-262, +-72,-60, +49,57, +-54,112, +170,-5, +-17,0, +42,-56, +-86,-118, +127,-107, +60,-79, +0,10, +-58,6, +196,-6, +96,-230, +93,-136, +100,-111, +167,-37, +-177,-37, +184,-111, +234,99, +23,136, +-90,-171, +126,-106, +-90,-300, +-87,-101, +-75,140, +191,172, +96,-2, +29,-45, +301,-40, +-58,-226, +-25,171, +77,-117, +-90,55, +-240,-8, +-184,-85, +-109,-95, +84,-247, +-178,-92, +299,114, +217,10, +33,120, +-160,-101, +-59,-72, +8,-189, +126,36, +-25,22, +-158,66, +5,260, +120,-84, +-10,7, +82,53, +49,91, +125,11, +48,-167, +130,85, +188,-66, +-38,-234, +24,80, +-181,119, +-200,229, +99,-129, +-29,-62, +-231,-165, +29,86, +-147,43, +-103,102, +56,1, +-149,-156, +98,158, +-124,-220, +172,-87, +193,26, +-144,-74, +-5,146, +84,158, +-11,-7, +20,11, +30,-28, +-28,61, +102,-54, +72,-113, +7,-31, +24,-83, +-192,54, +-195,51, +100,126, +-196,163, +-146,72, +173,-54, +125,16, +54,7, +90,106, +-59,180, +105,115, +-3,9, +118,46, +105,-76, +262,15, +92,222, +-64,-14, +36,38, +-189,140, +10,-3, +36,76, +-90,55, +78,-387, +-264,-46, +39,-207, +-12,68, +-113,-268, +115,73, +-31,25, +152,-30, +-52,89, +-6,-147, +-20,63, +17,130, +-27,4, +44,-82, +-92,-120, +-92,-116, +0,52, +20,-148, +-60,-106, +-10,30, +30,-36, +4,-34, +-142,-167, +-117,-128, +14,46, +-28,50, +13,95, +130,111, +26,-19, +54,52, +133,206, +211,70, +-154,-132, +-39,64, +-219,-155, +39,101, +-34,26, +-14,76, +94,-110, +-68,-70, +-6,-13, +20,-102, +1,141, +56,-57, +47,-97, +44,50, +68,-117, +-49,-79, +48,-47, +-70,-72, +18,54, +23,71, +48,23, +146,-148, +-40,-22, +-38,61, +-38,-106, +-79,-99, +80,-34, +35,62, +30,-1, +-10,198, +30,-54, +133,59, +132,8, +202,-14, +-2,97, +76,-92, +79,-74, +178,-73, +-77,262, +-29,-33, +-26,190, +-72,-209, +-38,48, +26,-59, +139,-37, +271,154, +-56,-28, +-35,279, +-95,60, +14,-167, +-153,234, +-133,-68, +-26,-183, +-106,-55, +-66,-91, +-106,-270, +-55,18, +-27,-15, +81,-82, +-56,-127, +-4,5, +-74,-100, +-116,23, +94,23, +144,121, +-96,-81, +65,51, +87,-147, +-150,254, +13,71, +-123,52, +-5,-119, +3,-34, +-80,-144, +0,21, +-152,115, +230,47, +66,14, +-34,-14, +-79,79, +14,-223, +-6,-61, +30,-114, +-17,26, +1,11, +24,10, +37,-4, +172,-74, +98,166, +75,-96, +116,-83, +-101,-103, +-74,5, +83,18, +2,84, +32,27, +-7,104, +-117,35, +-19,-53, +-57,93, +-47,29, +-77,41, +63,-98, +-85,-180, +-61,-25, +34,32, +-87,-66, +60,70, +121,19, +-5,-46, +-13,39, +8,57, +49,9, +-110,-1, +-81,-11, +67,162, +-42,-122, +40,-106, +148,51, +197,-145, +-69,-40, +-115,-49, +34,-76, +75,-8, +-12,-75, +-34,-35, +-107,-90, +-78,-87, +18,37, +-110,59, +-16,16, +-25,-93, +-145,-56, +6,137, +-75,227, +-66,-41, +-44,15, +0,33, +157,-61, +-106,-111, +13,27, +126,67, +-45,-99, +-16,67, +69,105, +-34,-13, +26,31, +0,-55, +-55,-47, +-112,-9, +-118,-44, +2,12, +120,-91, +-25,-18, +30,-72, +17,-35, +48,-56, +102,11, +7,86, +53,-21, +-10,-32, +-68,-32, +-145,-8, +44,150, +-17,94, +84,62, +-93,139, +20,-30, +63,-28, +-63,59, +-1,-34, +-162,11, +-66,24, +-73,-64, +114,-86, +-63,169, +47,47, +146,33, +-46,-155, +-71,53, +-69,-48, +-40,-57, +-70,48, +231,-183, +9,24, +72,35, +-117,-20, +60,39, +-10,42, +120,71, +-64,-35, +-30,-104, +-23,-29, +-74,43, +-130,-36, +90,43, +-95,-62, +-148,-81, +-80,-81, +-68,-23, +-157,-86, +46,-78, +7,-88, +45,-73, +-25,34, +129,-137, +196,58, +-118,123, +103,170, +1,-1, +-172,-51, +129,-15, +-130,-40, +180,-55, +64,28, +45,24, +-154,159, +34,-14, +-14,50, +30,99, +30,159, +-41,42, +82,54, +19,0, +107,-20, +-29,86, +16,-1, +-89,-12, +-70,-48, +36,-40, +-7,20, +-106,33, +-9,100, +107,-6, +-34,-25, +5,39, +-41,-69, +-110,46, +10,9, +-47,34, +-43,49, +13,17, +-10,20, +45,6, +-84,-23, +-34,8, +-33,-15, +-30,53, +125,-18, +-58,-73, +35,24, +-89,-213, +5,36, +13,72, +120,111, +69,18, +-24,57, +49,37, +100,35, +22,-2, +-4,-36, +-28,-39, +-134,-91, +-64,-36, +72,67, +-67,-31, +-56,-44, +-13,30, +-96,-3, +23,-82, +-86,-18, +-115,-13, +73,12, +76,-9, +-44,11, +44,-44, +-62,33, +27,-2, +54,104, +-58,-60, +-19,29, +-137,-25, +83,-70, +-245,25, +-55,-161, +-56,87, +31,4, +75,-91, +18,32, +19,-89, +67,-4, +35,85, +62,99, +-26,107, +-38,27, +65,62, +50,-38, +83,75, +82,-19, +14,29, +-34,134, +17,33, +19,-75, +82,-39, +89,-56, +34,-25, +-11,-115, +18,-47, +-74,75, +-35,17, +-20,12, +-7,59, +42,-28, +-51,-7, +34,54, +87,5, +31,-30, +35,14, +-40,12, +-63,102, +-10,44, +-81,-144, +70,114, +-72,-71, +26,-80, +118,37, +-59,-106, +-11,-60, +-80,4, +-11,-10, +27,-56, +178,-86, +-64,-46, +-68,60, +-12,31, +-29,89, +-2,43, +-51,13, +60,87, +54,-17, +-60,32, +46,50, +38,-10, +94,-60, +2,-13, +-30,39, +-7,39, +-122,-58, +19,-61, +9,2, +49,143, +6,52, +-10,46, +-106,-93, +-102,38, +32,-106, +-28,-147, +-42,9, +99,16, +-97,-47, +21,55, +-55,41, +-45,85, +30,19, +79,56, +38,35, +-42,-121, +-78,29, +-147,17, +22,-29, +18,7, +17,125, +11,21, +-57,7, +-20,-10, +-7,99, +-103,13, +-67,55, +-21,58, +24,18, +-25,-50, +-8,64, +-48,28, +-67,-9, +-1,-33, +-4,74, +-16,-22, +52,47, +55,-6, +-104,-38, +-4,-47, +0,-9, +61,-18, +32,26, +-2,-13, +52,54, +22,34, +62,38, +22,-20, +72,3, +46,-39, +-54,-27, +98,8, +21,-13, +18,-1, +-14,-50, +45,-47, +-16,5, +-17,21, +14,12, +-58,21, +-15,-21, +38,18, +84,25, +-3,71, +-24,13, +14,-47, +42,67, +13,-16, +-5,26, +-45,14, +5,6, +84,18, +-33,26, +67,-16, +59,-66, +19,33, +-36,42, +54,-20, +2,-19, +30,12, +37,-7, +-48,-16, +83,48, +-106,-46, +-15,-11, +-38,-68, +30,1, +30,-2, +56,33, +-10,67, +36,-4, +19,-28, +-1,76, +-61,-2, +-11,-57, +5,-19, +55,-17, +31,29, +45,-48, +74,54, +-14,-26, +10,-27, +61,37, +24,-29, +-23,60, +-41,-6, +-72,-5, +66,34, +35,0, +-39,-74, +-45,-20, +-1,-21, +56,36, +-13,-23, +8,-60, +10,-8, +-15,-17, +-7,-48, +-34,31, +-9,9, +-45,19, +-29,47, +31,62, +-23,-44, +-15,17, +46,18, +-2,46, +-23,-41, +14,2, +8,-31, +-2,77, +-38,-49, +-47,47, +-31,-41, +28,5, +-16,-15, +-11,21, +21,-11, +-41,33, +-18,24, +53,-26, +12,-5, +8,-49, +66,-21, +-48,16, +34,-25, +48,6, +-22,-45, +-39,-11, +-5,-32, +-42,4, +21,30, +22,40, +28,20, +-12,-8, +21,10, +-14,-20, +17,18, +39,-24, +9,24, +3,-15, +23,23, +-7,34, +13,-10, +0,-24, +37,-8, +-11,2, +-36,-21, +-7,18, +3,-11, +-28,-26, +-29,-24, +-25,-4, +31,-22, +6,-17, +-40,22, +3,-16, +23,-20, +-14,0, +-15,12, +-36,27, +7,-6, +40,1, +-27,23, +-1,12, +14,8, +8,24, +-19,-15, +-1,-43, +-1,-21, +-15,19, +-14,22, +-22,22, +10,-18, +22,20, +0,13, +2,-5, +15,-16, +-37,-17, +-7,-23, +3,8, +26,-15, +-12,1, +0,11, +6,-39, +19,-7, +-8,24, +2,-2, +13,-9, +-14,-2, +-14,-2, +18,-1, +25,-14, +3,8, +10,-25, +5,37, +28,13, +-16,-9, +14,5, +-16,-20, +10,17, +17,-2, +-8,1, +3,-1, +24,2, +11,19, +-6,-9, +1,3, +8,-4, +-6,-9, +2,12, +9,18, +-4,0, +6,-10, +7,-6, +-10,15, +-8,3, +4,12, +4,5, +22,9, +-11,-8, +-13,-1, +19,1, +5,6, +-2,1, +0,-5, +-9,0, +-9,1, +10,5, +-2,-2, +1,7, +-4,0, +-4,4, +-3,4, +9,12, +-3,1, +1,1, +1,9, +5,3, +1,6, +1,-1, +-12,-8, +-1,3, +10,1, +-9,1, +5,4, +3,9, +-1,1, +-7,-2, +10,2, +1,2, +-3,0, +7,4, +-4,3, +-7,0, +6,-1, +-1,0, +-3,-3, +4,0, +-1,3, +-3,-1, +7,-2, +-4,1, +-3,1, +5,0, +-3,0, +-3,0, +6,0, +-3,0, +-3,0, +5,0, +-3,-1, +-4,-1, +7,2, +-3,1, +-1,-3, +4,0, +-3,3, +-1,0, +6,1, +-7,0, +-4,-3, +7,-4, +-3,0, +1,-2, +10,-2, +-7,2, +-1,-1, +3,-9, +5,-4, +-9,-1, +10,-1, +-1,-3, +-12,8, +1,1, +1,-6, +5,-3, +1,-9, +1,-1, +-3,-1, +9,-12, +-3,-4, +-4,-4, +-4,0, +1,-7, +-2,2, +10,-5, +-9,-1, +-9,0, +0,5, +-2,-1, +5,-6, +19,-1, +-13,1, +-11,8, +22,-9, +4,-5, +4,-12, +-8,-3, +-10,-15, +7,6, +6,10, +-4,0, +9,-18, +2,-12, +-6,9, +8,4, +1,-3, +-6,9, +11,-19, +24,-2, +3,1, +-8,-1, +17,2, +10,-17, +-16,20, +14,-5, +-16,9, +28,-13, +5,-37, +10,25, +3,-8, +25,14, +18,1, +-14,2, +-14,2, +13,9, +2,2, +-8,-24, +19,7, +6,39, +0,-11, +-12,-1, +26,15, +3,-8, +-7,23, +-37,17, +15,16, +2,5, +0,-13, +22,-20, +10,18, +-22,-22, +-14,-22, +-15,-19, +-1,21, +-1,43, +-19,15, +8,-24, +14,-8, +-1,-12, +-27,-23, +40,-1, +7,6, +-36,-27, +-15,-12, +-14,0, +23,20, +3,16, +-40,-22, +6,17, +31,22, +-25,4, +-29,24, +-28,26, +3,11, +-7,-18, +-36,21, +-11,-2, +37,8, +0,24, +13,10, +-7,-34, +23,-23, +3,15, +9,-24, +39,24, +17,-18, +-14,20, +21,-10, +-12,8, +28,-20, +22,-40, +21,-30, +-42,-4, +-5,32, +-39,11, +-22,45, +48,-6, +34,25, +-48,-16, +66,21, +8,49, +12,5, +53,26, +-18,-24, +-41,-33, +21,11, +-11,-21, +-16,15, +28,-5, +-31,41, +-47,-47, +-38,49, +-2,-77, +8,31, +14,-2, +-23,41, +-2,-46, +46,-18, +-15,-17, +-23,44, +31,-62, +-29,-47, +-45,-19, +-9,-9, +-34,-31, +-7,48, +-15,17, +10,8, +8,60, +-13,23, +56,-36, +-1,21, +-45,20, +-39,74, +35,0, +66,-34, +-72,5, +-41,6, +-23,-60, +24,29, +61,-37, +10,27, +-14,26, +74,-54, +45,48, +31,-29, +55,17, +5,19, +-11,57, +-61,2, +-1,-76, +19,28, +36,4, +-10,-67, +56,-33, +30,2, +30,-1, +-38,68, +-15,11, +-106,46, +83,-48, +-48,16, +37,7, +30,-12, +2,19, +54,20, +-36,-42, +19,-33, +59,66, +67,16, +-33,-26, +84,-18, +5,-6, +-45,-14, +-5,-26, +13,16, +42,-67, +14,47, +-24,-13, +-3,-71, +84,-25, +38,-18, +-15,21, +-58,-21, +14,-12, +-17,-21, +-16,-5, +45,47, +-14,50, +18,1, +21,13, +98,-8, +-54,27, +46,39, +72,-3, +22,20, +62,-38, +22,-34, +52,-54, +-2,13, +32,-26, +61,18, +0,9, +-4,47, +-104,38, +55,6, +52,-47, +-16,22, +-4,-74, +-1,33, +-67,9, +-48,-28, +-8,-64, +-25,50, +24,-18, +-21,-58, +-67,-55, +-103,-13, +-7,-99, +-20,10, +-57,-7, +11,-21, +17,-125, +18,-7, +22,29, +-147,-17, +-78,-29, +-42,121, +38,-35, +79,-56, +30,-19, +-45,-85, +-55,-41, +21,-55, +-97,47, +99,-16, +-42,-9, +-28,147, +32,106, +-102,-38, +-106,93, +-10,-46, +6,-52, +49,-143, +9,-2, +19,61, +-122,58, +-7,-39, +-30,-39, +2,13, +94,60, +38,10, +46,-50, +-60,-32, +54,17, +60,-87, +-51,-13, +-2,-43, +-29,-89, +-12,-31, +-68,-60, +-64,46, +178,86, +27,56, +-11,10, +-80,-4, +-11,60, +-59,106, +118,-37, +26,80, +-72,71, +70,-114, +-81,144, +-10,-44, +-63,-102, +-40,-12, +35,-14, +31,30, +87,-5, +34,-54, +-51,7, +42,28, +-7,-59, +-20,-12, +-35,-17, +-74,-75, +18,47, +-11,115, +34,25, +89,56, +82,39, +19,75, +17,-33, +-34,-134, +14,-29, +82,19, +83,-75, +50,38, +65,-62, +-38,-27, +-26,-107, +62,-99, +35,-85, +67,4, +19,89, +18,-32, +75,91, +31,-4, +-56,-87, +-55,161, +-245,-25, +83,70, +-137,25, +-19,-29, +-58,60, +54,-104, +27,2, +-62,-33, +44,44, +-44,-11, +76,9, +73,-12, +-115,13, +-86,18, +23,82, +-96,3, +-13,-30, +-56,44, +-67,31, +72,-67, +-64,36, +-134,91, +-28,39, +-4,36, +22,2, +100,-35, +49,-37, +-24,-57, +69,-18, +120,-111, +13,-72, +5,-36, +-89,213, +35,-24, +-58,73, +125,18, +-30,-53, +-33,15, +-34,-8, +-84,23, +45,-6, +-10,-20, +13,-17, +-43,-49, +-47,-34, +10,-9, +-110,-46, +-41,69, +5,-39, +-34,25, +107,6, +-9,-100, +-106,-33, +-7,-20, +36,40, +-70,48, +-89,12, +16,1, +-29,-86, +107,20, +19,0, +82,-54, +-41,-42, +30,-159, +30,-99, +-14,-50, +34,14, +-154,-159, +45,-24, +64,-28, +180,55, +-130,40, +129,15, +-172,51, +1,1, +103,-170, +-118,-123, +196,-58, +129,137, +-25,-34, +45,73, +7,88, +46,78, +-157,86, +-68,23, +-80,81, +-148,81, +-95,62, +90,-43, +-130,36, +-74,-43, +-23,29, +-30,104, +-64,35, +120,-71, +-10,-42, +60,-39, +-117,20, +72,-35, +9,-24, +231,183, +-70,-48, +-40,57, +-69,48, +-71,-53, +-46,155, +146,-33, +47,-47, +-63,-169, +114,86, +-73,64, +-66,-24, +-162,-11, +-1,34, +-63,-59, +63,28, +20,30, +-93,-139, +84,-62, +-17,-94, +44,-150, +-145,8, +-68,32, +-10,32, +53,21, +7,-86, +102,-11, +48,56, +17,35, +30,72, +-25,18, +120,91, +2,-12, +-118,44, +-112,9, +-55,47, +0,55, +26,-31, +-34,13, +69,-105, +-16,-67, +-45,99, +126,-67, +13,-27, +-106,111, +157,61, +0,-33, +-44,-15, +-66,41, +-75,-227, +6,-137, +-145,56, +-25,93, +-16,-16, +-110,-59, +18,-37, +-78,87, +-107,90, +-34,35, +-12,75, +75,8, +34,76, +-115,49, +-69,40, +197,145, +148,-51, +40,106, +-42,122, +67,-162, +-81,11, +-110,1, +49,-9, +8,-57, +-13,-39, +-5,46, +121,-19, +60,-70, +-87,66, +34,-32, +-61,25, +-85,180, +63,98, +-77,-41, +-47,-29, +-57,-93, +-19,53, +-117,-35, +-7,-104, +32,-27, +2,-84, +83,-18, +-74,-5, +-101,103, +116,83, +75,96, +98,-166, +172,74, +37,4, +24,-10, +1,-11, +-17,-26, +30,114, +-6,61, +14,223, +-79,-79, +-34,14, +66,-14, +230,-47, +-152,-115, +0,-21, +-80,144, +3,34, +-5,119, +-123,-52, +13,-71, +-150,-254, +87,147, +65,-51, +-96,81, +144,-121, +94,-23, +-116,-23, +-74,100, +-4,-5, +-56,127, +81,82, +-27,15, +-55,-18, +-106,270, +-66,91, +-106,55, +-26,183, +-133,68, +-153,-234, +14,167, +-95,-60, +-35,-279, +-56,28, +271,-154, +139,37, +26,59, +-38,-48, +-72,209, +-26,-190, +-29,33, +-77,-262, +178,73, +79,74, +76,92, +-2,-97, +202,14, +132,-8, +133,-59, +30,54, +-10,-198, +30,1, +35,-62, +80,34, +-79,99, +-38,106, +-38,-61, +-40,22, +146,148, +48,-23, +23,-71, +18,-54, +-70,72, +48,47, +-49,79, +68,117, +44,-50, +47,97, +56,57, +1,-141, +20,102, +-6,13, +-68,70, +94,110, +-14,-76, +-34,-26, +39,-101, +-219,155, +-39,-64, +-154,132, +211,-70, +133,-206, +54,-52, +26,19, +130,-111, +13,-95, +-28,-50, +14,-46, +-117,128, +-142,167, +4,34, +30,36, +-10,-30, +-60,106, +20,148, +0,-52, +-92,116, +-92,120, +44,82, +-27,-4, +17,-130, +-20,-63, +-6,147, +-52,-89, +152,30, +-31,-25, +115,-73, +-113,268, +-12,-68, +39,207, +-264,46, +78,387, +-90,-55, +36,-76, +10,3, +-189,-140, +36,-38, +-64,14, +92,-222, +262,-15, +105,76, +118,-46, +-3,-9, +105,-115, +-59,-180, +90,-106, +54,-7, +125,-16, +173,54, +-146,-72, +-196,-163, +100,-126, +-195,-51, +-192,-54, +24,83, +7,31, +72,113, +102,54, +-28,-61, +30,28, +20,-11, +-11,7, +84,-158, +-5,-146, +-144,74, +193,-26, +172,87, +-124,220, +98,-158, +-149,156, +56,-1, +-103,-102, +-147,-43, +29,-86, +-231,165, +-29,62, +99,129, +-200,-229, +-181,-119, +24,-80, +-38,234, +188,66, +130,-85, +48,167, +125,-11, +49,-91, +82,-53, +-10,-7, +120,84, +5,-260, +-158,-66, +-25,-22, +126,-36, +8,189, +-59,72, +-160,101, +33,-120, +217,-10, +299,-114, +-178,92, +84,247, +-109,95, +-184,85, +-240,8, +-90,-55, +77,117, +-25,-171, +-58,226, +301,40, +29,45, +96,2, +191,-172, +-75,-140, +-87,101, +-90,300, +126,106, +-90,171, +23,-136, +234,-99, +184,111, +-177,37, +167,37, +100,111, +93,136, +96,230, +196,6, +-58,-6, +0,-10, +60,79, +127,107, +-86,118, +42,56, +-17,0, +170,5, +-54,-112, +49,-57, +-72,60, +-147,262, +-60,-198, +73,-88, +-86,-19, +88,-117, +71,-11, +133,-160, +25,-62, +62,-152, +-107,-143, +-43,-51, +-44,-64, +-66,27, +58,-318, +-56,107, +-127,-11, +-110,-119, +1,20, +57,89, +49,-45, +14,74, +30,210, +-78,-272, +197,-157, +140,42, +-32,-13, +58,-16, +-56,-33, +160,-186, +-36,123, +60,151, +39,-177, +32,-17, +92,-104, +-84,-76, +-127,-241, +21,22, +170,-34, +-57,33, +-89,-177, +61,-47, +-30,42, +-15,-206, +25,206, +90,-107, +-322,346, +24,-11, +-92,-68, +-53,-124, +211,-71, +159,-146, +-68,58, +49,-152, +96,10, +85,195, +-190,122, +-143,-192, +103,-9, +-137,-152, +129,-273, +-94,-35, +70,-106, +-40,-46, +-127,-68, +249,-208, +-70,51, +74,350, +59,-20, +3,-43, +12,-161, +-107,63, +-331,253, +151,-55, +51,-150, +-151,-54, +-102,111, +-81,-130, +-134,6, +-28,227, +-31,-108, +111,155, +51,245, +220,-77, +116,30, +44,93, +-176,-73, +268,-51, +54,-11, +-47,0, +-196,45, +225,-52, +-158,-43, +285,178, +-194,290, +73,-67, +-116,53, +56,54, +-69,-99, +119,84, +47,132, +61,-51, +59,-52, +-231,-103, +-81,-221, +-81,55, +-75,-120, +106,6, +-187,-190, +-31,5, +-179,199, +-58,144, +-38,-13, +166,103, +203,-243, +61,-42, +21,-44, +-55,31, +68,-63, +-144,-16, +145,-171, +-106,-119, +56,26, +92,-63, +137,-125, +-12,145, +-149,-189, +-20,-84, +-49,43, +-5,138, +-33,99, +48,-20, +-205,60, +-110,325, +-34,-12, +-123,-116, +-57,30, +30,96, +34,73, +-204,-88, +-19,-92, +204,288, +0,124, +45,-118, +44,-52, +42,-41, +132,135, +112,-134, +18,-36, +10,79, +-272,75, +-228,-24, +182,54, +246,207, +-95,52, +145,-49, +-4,-96, +59,-59, +86,-42, +-162,46, +-246,37, +73,278, +-155,-185, +-50,-102, +114,18, +-104,103, +-165,-180, +-91,-34, +138,-3, +56,-22, +-130,-48, +5,55, +-4,148, +-85,-141, +62,-245, +-243,-35, +153,12, +26,-275, +234,74, +28,-203, +-226,155, +138,-15, +-96,-58, +135,-130, +-32,26, +-62,14, +154,-263, +15,-107, +81,87, +-87,-71, +-32,-13, +-32,9, +46,-40, +250,-9, +42,-68, +-230,-37, +41,-4, +84,0, +137,137, +28,93, +221,-333, +-30,-51, +-1,83, +-78,37, +31,-55, +68,-216, +44,6, +-76,117, +-50,93, +121,45, +-40,48, +66,-175, +54,72, +83,74, +-36,90, +233,-44, +96,18, +60,-109, +85,66, +60,-44, +215,-42, +85,-189, +-58,190, +-80,180, +-54,-59, +118,-20, +-37,-48, +154,103, +258,-291, +54,241, +-85,-34, +92,-134, +61,-67, +29,-67, +180,-66, +162,119, +-40,130, +15,0, +-49,-118, +-138,-3, +18,13, +157,59, +23,-231, +-179,111, +7,-52, +367,187, +-43,-67, +-155,86, +133,78, +0,0, +-108,-37, +143,3, +-44,154, +71,84, +214,-26, +-136,-262, +210,-82, +-158,82, +-172,164, +-101,-26, +43,-88, +40,187, +20,89, +118,131, +-67,-394, +-29,194, +-114,13, +-222,-8, +-100,119, +27,-86, +-47,37, +-64,-153, +-33,-92, +141,125, +-290,199, +-59,301, +-36,-37, +-20,-133, +0,44, +27,45, +23,-235, +9,73, +77,-16, +-23,-267, +67,-75, +-129,15, +-98,37, +128,313, +-212,199, +-59,-73, +192,-30, +81,25, +-112,-70, +16,-29, +66,237, +-276,87, +-194,-82, +-27,76, +-169,61, +-115,26, +-160,107, +79,126, +233,93, +-69,26, +-21,75, +-38,-70, +19,41, +89,74, +-166,61, +-88,-159, +-92,-112, +-3,54, +-60,125, +-64,229, +-27,177, +-39,63, +-98,-22, +14,-41, +-53,185, +176,64, +-181,-144, +209,177, +87,-28, +77,9, +42,23, +158,-15, +-249,5, +302,7, +116,-81, +-32,-179, +125,-145, +7,-163, +13,42, +46,6, +-83,-173, +-50,99, +-59,-102, +-49,-358, +-62,-177, +-53,-66, +-19,-63, +-42,316, +185,-27, +-18,95, +-87,148, +110,16, +-100,74, +-232,-3, +-95,47, +110,0, +-99,-58, +66,-76, +57,-29, +83,-79, +-36,220, +88,-66, +-17,-216, +-5,242, +-120,-41, +168,-40, +112,-99, +-211,-76, +-73,71, +-70,152, +215,-101, +68,205, +108,-10, +78,-106, +211,-45, +-30,-276, +-114,176, +-91,109, +-53,-58, +94,-3, +221,-285, +184,17, +-119,-5, +18,-78, +-102,106, +114,-19, +-333,-72, +-142,157, +203,51, +-140,-163, +114,77, +7,-51, +-101,33, +-203,-201, +-112,-27, +-94,-174, +-14,8, +37,170, +172,25, +144,189, +18,271, +-64,22, +-22,45, +31,107, +-63,-143, +-168,41, +207,191, +-2,-59, +146,152, +-88,-48, +18,43, +60,-155, +-41,-122, +159,34, +-79,117, +-104,184, +-205,-140, +4,84, +-135,24, +35,215, +16,189, +11,32, +80,-40, +-31,-73, +-74,-124, +9,-85, +232,263, +6,121, +-88,-136, +-99,-165, +180,43, +33,502, +-85,6, +58,-179, +-65,215, +-130,110, +-6,-152, +124,15, +-107,153, +-101,-193, +-92,-79, +-109,-118, +132,77, +109,152, +-205,-77, +52,-57, +-56,64, +54,-7, +176,-83, +139,147, +-59,54, +6,-160, +99,-141, +-85,40, +-242,113, +157,-78, +-131,110, +267,46, +12,-30, +-27,-57, +59,75, +86,-146, +68,73, +114,-169, +-101,18, +224,-61, +-92,-25, +47,-13, +-99,96, +199,-96, +221,-23, +64,-155, +69,33, +-42,26, +136,-46, +-97,-93, +56,-160, +19,-182, +155,99, +218,56, +68,-10, +24,-76, +35,-60, +-54,-57, +-5,188, +-153,-81, +-14,-160, +-114,-92, +106,70, +64,145, +98,-32, +88,54, +21,-96, +-58,149, +20,-172, +-187,6, +232,-207, +1,-147, +139,-65, +14,29, +49,61, +54,251, +-40,-59, +124,61, +-117,191, +-2,-65, +-79,63, +106,147, +-58,113, +28,58, +-226,-90, +-72,-140, +71,10, +128,247, +79,-39, +-65,97, +10,-163, +-345,-3, +-75,131, +-206,92, +-117,-74, +33,-119, +-135,49, +48,87, +191,86, +-88,-119, +249,151, +-17,-82, +-38,-79, +-82,25, +0,-11, +57,-333, +-160,110, +125,66, +170,29, +202,-27, +161,-46, +203,30, +-58,-118, +85,-65, +-121,2, +284,-195, +150,185, +-151,65, +83,-141, +2,123, +-95,-140, +36,-62, +-103,-49, +8,-16, +152,63, +150,-59, +-142,76, +98,-192, +86,-111, +128,-17, +-131,-59, +153,98, +-157,-127, +6,-73, +-200,62, +-53,-67, +-84,94, +-185,-10, +62,252, +199,108, +-2,52, +-41,12, +-19,60, +202,5, +-12,-25, +29,46, +-59,-49, +55,-87, +-4,-193, +-59,-4, +-54,-51, +74,176, +120,-1, +-40,-92, +-119,-73, +-27,157, +-176,166, +71,-44, +-207,41, +-88,-56, +123,-36, +239,115, +105,175, +107,135, +193,-48, +82,-5, +67,29, +-69,-25, +-208,164, +134,-95, +-310,26, +-88,119, +57,38, +-128,-246, +-194,44, +-31,59, +152,-18, +1,62, +-150,50, +17,-69, +142,-238, +-36,-104, +-22,-100, +6,-27, +91,42, +56,32, +-55,-43, +99,-24, +13,72, +-160,138, +-19,-251, +-37,-94, +109,-19, +210,64, +-69,37, +26,159, +-7,44, +67,-61, +-4,138, +83,-190, +-90,120, +157,34, +32,201, +-141,-61, +-43,53, +-18,-83, +101,-94, +48,86, +103,108, +56,6, +-16,27, +82,131, +5,33, +160,120, +54,65, +-81,-145, +-121,-92, +-113,131, +109,-33, +214,8, +-120,-137, +73,-33, +64,90, +42,-80, +-31,-2, +80,233, +99,-3, +-29,171, +154,27, +-5,-31, +-147,69, +-61,31, +53,58, +-105,45, +15,-77, +55,92, +38,154, +-1,-120, +-9,0, +-173,3, +193,121, +81,-5, +-149,120, +172,-67, +15,-129, +-29,-57, +109,59, +21,-104, +120,-20, +38,38, +-35,8, +-80,-24, +-19,-174, +186,-37, +299,-86, +-111,103, +163,149, +54,67, +176,132, +-109,152, +7,-50, +5,302, +1,-38, +14,103, +-35,47, +-128,230, +-169,128, +-1,74, +66,218, +92,-145, +62,-17, +-84,52, +197,-38, +-127,113, +125,-175, +48,-115, +-132,54, +-58,-20, +145,152, +24,99, +0,-23, +80,-22, +-32,-115, +-51,35, +63,-107, +-97,96, +-14,-65, +-85,139, +89,-103, +-54,-40, +-182,-89, +-38,-58, +14,11, +-101,-11, +-79,-100, +3,-135, +219,74, +86,-54, +121,114, +54,-25, +69,24, +-131,-41, +55,19, +115,121, +25,109, +-75,-20, +-186,4, +-164,-102, +-16,13, +70,-55, +-10,-30, +-159,-85, +41,15, +28,23, +-33,-48, +-159,7, +111,92, +-21,-105, +-93,10, +-43,-1, +-50,131, +-8,36, +-96,-167, +104,161, +-70,61, +64,40, +-212,6, +39,61, +-95,13, +69,202, +141,142, +-30,-40, +-28,-98, +-7,-85, +-119,-33, +56,25, +82,-89, +3,12, +-101,-161, +24,51, +132,-136, +-180,-22, +9,-10, +-80,111, +-21,-111, +-146,-51, +70,170, +-85,-38, +-10,-46, +-26,-39, +-174,-42, +-8,22, +186,83, +95,70, +103,-1, +20,-157, +8,56, +11,-192, +162,126, +-25,-23, +27,-12, +-72,-82, +104,33, +123,-98, +-151,-88, +29,58, +26,-25, +12,-15, +-28,-128, +12,85, +3,-4, +-47,-96, +-77,-68, +20,112, +-74,-31, +-1,-170, +-74,-124, +32,-103, +78,29, +104,131, +25,-9, +-28,-40, +-25,-25, +74,136, +-41,21, +111,151, +-70,124, +-41,65, +-102,-125, +-27,-45, +22,1, +-41,-58, +-83,-109, +-75,-72, +34,37, +-73,45, +153,-175, +-91,64, +26,-19, +-54,-55, +-8,30, +-119,25, +59,-13, +81,74, +28,72, +135,-42, +-71,-83, +-95,40, +-12,11, +-102,92, +124,-89, +5,144, +-106,-53, +51,60, +12,131, +157,-71, +86,-114, +123,-83, +155,-44, +-87,-2, +176,31, +20,-3, +144,-49, +10,36, +119,-26, +100,215, +58,-43, +86,74, +1,87, +-151,235, +-5,-32, +-98,-115, +16,47, +72,13, +-75,3, +-33,174, +19,-54, +-22,-6, +-131,138, +9,-68, +17,31, +67,56, +19,16, +82,39, +-99,-117, +16,21, +41,54, +69,32, +8,-36, +-51,4, +79,-24, +65,-26, +-48,-94, +51,4, +46,55, +-21,64, +191,-4, +16,81, +30,4, +20,-30, +-41,118, +19,-35, +-35,14, +-122,54, +103,128, +23,-66, +-64,-143, +-66,7, +28,33, +59,32, +67,120, +44,-41, +43,23, +-4,59, +75,29, +51,58, +-61,44, +-35,32, +-15,-99, +46,-27, +8,19, +175,14, +-96,86, +49,-75, +-48,57, +39,39, +14,3, +69,-53, +72,82, +-7,15, +36,100, +-122,47, +-71,-130, +-7,-16, +115,10, +-42,-11, +-41,46, +49,-1, +12,36, +-34,48, +-20,-52, +-106,5, +-107,64, +-69,29, +58,-95, +9,-17, +0,117, +58,-22, +-34,-158, +-67,-1, +-44,-6, +112,-111, +-18,-10, +-7,-135, +17,39, +77,-82, +-52,-19, +9,131, +20,67, +3,45, +153,96, +56,116, +-55,63, +22,-62, +-22,-42, +3,-92, +75,45, +96,-106, +-40,-47, +-74,10, +57,31, +13,46, +58,-11, +-71,-51, +-56,8, +-80,15, +6,8, +-7,-53, +8,76, +1,34, +13,42, +32,-60, +2,33, +83,80, +80,26, +80,-56, +-65,-86, +73,-26, +-28,-27, +-50,-139, +10,83, +-44,-55, +39,20, +-28,1, +-83,114, +-35,-40, +-36,9, +47,33, +-39,77, +38,0, +-22,-9, +-93,-57, +45,16, +-61,7, +10,-45, +32,35, +11,25, +20,68, +-93,96, +6,-125, +-24,78, +-58,66, +49,62, +-41,89, +-19,123, +116,-18, +-59,-1, +-56,-22, +-59,24, +27,-40, +-41,-45, +-6,70, +-4,-17, +44,101, +-47,-9, +80,24, +25,18, +-74,-80, +-25,-12, +60,-35, +30,-153, +-12,-15, +2,-89, +-76,15, +100,22, +33,56, +17,32, +-40,-50, +-44,-44, +1,-61, +80,52, +51,-19, +-15,17, +47,-51, +18,15, +26,-20, +39,45, +7,-13, +95,18, +-8,41, +-44,-11, +-44,91, +-48,-18, +-85,34, +52,-73, +-54,15, +41,12, +-24,12, +17,45, +26,48, +52,-13, +-43,20, +-82,-60, +22,-13, +7,-37, +26,10, +-41,-7, +-29,10, +-2,42, +37,54, +-2,64, +-23,28, +-80,-32, +-36,35, +3,-21, +-2,40, +-7,-13, +-2,41, +-75,76, +24,45, +3,15, +2,-57, +-11,60, +0,-23, +-45,54, +19,-21, +-57,41, +21,46, +-22,-11, +6,-2, +-21,49, +25,-14, +16,84, +7,-59, +-3,-15, +44,-39, +-55,17, +-64,15, +47,-19, +18,34, +-16,64, +6,1, +9,13, +-25,-35, +5,-3, +15,-8, +27,42, +1,-2, +-86,-60, +3,-22, +17,-4, +-2,-7, +-27,29, +34,-42, +33,-27, +-22,17, +6,-8, +89,-11, +86,48, +-101,8, +-31,-79, +74,48, +16,45, +9,-4, +-30,-13, +-38,6, +-3,-10, +24,28, +28,9, +52,-29, +48,17, +-46,-40, +27,-30, +10,-41, +38,8, +10,-7, +-28,40, +-37,-14, +-11,-5, +42,24, +-38,-27, +49,59, +22,3, +-11,-8, +8,-34, +-3,16, +8,-2, +30,-26, +40,15, +40,31, +30,26, +11,28, +10,-19, +-19,-16, +-45,-19, +4,-48, +-38,-30, +29,30, +-16,-23, +-13,24, +6,0, +21,-15, +1,-45, +-9,-32, +6,48, +11,-54, +-16,5, +-13,35, +-6,33, +-62,21, +28,1, +27,-33, +-18,-17, +18,11, +-60,8, +-10,42, +31,5, +-17,19, +29,25, +6,19, +8,-56, +1,-1, +-21,11, +-26,7, +34,15, +-6,-29, +-4,8, +-15,14, +13,-1, +24,-5, +-36,37, +0,-14, +-1,-3, +-16,14, +14,-10, +12,-48, +-17,4, +30,2, +13,-12, +-6,9, +38,10, +1,7, +19,-9, +-12,-4, +-39,-13, +-34,-3, +-13,-5, +-5,-19, +2,6, +-14,-5, +3,-3, +-4,20, +-36,-6, +-15,4, +-6,30, +-6,0, +2,13, +5,-15, +-5,23, +-2,2, +15,17, +-8,5, +8,11, +-2,-18, +12,25, +12,-14, +-15,-10, +8,3, +25,-8, +13,-8, +18,2, +6,-8, +-15,-4, +-10,-12, +2,-8, +11,-4, +-2,14, +2,-7, +-1,-12, +8,14, +5,1, +11,10, +8,-1, +2,-28, +6,0, +3,-2, +-3,-23, +5,-10, +15,2, +2,-2, +-9,-5, +5,8, +-3,7, +-6,-4, +16,-3, +14,-8, +4,5, +1,-6, +-7,-8, +-11,12, +-1,-1, +0,-3, +-4,6, +-5,1, +6,-5, +-6,4, +-3,0, +11,-13, +12,2, +-1,-4, +1,1, +-4,-1, +-6,-2, +7,-2, +-3,0, +0,-6, +6,-6, +-5,2, +0,0, +-4,-3, +6,6, +1,0, +-1,-3, +-1,3, +2,-4, +2,-4, +-2,4, +-2,2, +-1,-5, +1,6, +0,0, +0,-5, +0,5, +0,0, +0,-5, +0,5, +0,0, +1,-6, +-1,5, +-2,-2, +-2,-4, +2,4, +2,4, +-1,-3, +-1,3, +1,0, +6,-6, +-4,3, +0,0, +-5,-2, +6,6, +0,6, +-3,0, +7,2, +-6,2, +-4,1, +1,-1, +-1,4, +12,-2, +11,13, +-3,0, +-6,-4, +6,5, +-5,-1, +-4,-6, +0,3, +-1,1, +-11,-12, +-7,8, +1,6, +4,-5, +14,8, +16,3, +-6,4, +-3,-7, +5,-8, +-9,5, +2,2, +15,-2, +5,10, +-3,23, +3,2, +6,0, +2,28, +8,1, +11,-10, +5,-1, +8,-14, +-1,12, +2,7, +-2,-14, +11,4, +2,8, +-10,12, +-15,4, +6,8, +18,-2, +13,8, +25,8, +8,-3, +-15,10, +12,14, +12,-25, +-2,18, +8,-11, +-8,-5, +15,-17, +-2,-2, +-5,-23, +5,15, +2,-13, +-6,0, +-6,-30, +-15,-4, +-36,6, +-4,-20, +3,3, +-14,5, +2,-6, +-5,19, +-13,5, +-34,3, +-39,13, +-12,4, +19,9, +1,-7, +38,-10, +-6,-9, +13,12, +30,-2, +-17,-4, +12,48, +14,10, +-16,-14, +-1,3, +0,14, +-36,-37, +24,5, +13,1, +-15,-14, +-4,-8, +-6,29, +34,-15, +-26,-7, +-21,-11, +1,1, +8,56, +6,-19, +29,-25, +-17,-19, +31,-5, +-10,-42, +-60,-8, +18,-11, +-18,17, +27,33, +28,-1, +-62,-21, +-6,-33, +-13,-35, +-16,-5, +11,54, +6,-48, +-9,32, +1,45, +21,15, +6,0, +-13,-24, +-16,23, +29,-30, +-38,30, +4,48, +-45,19, +-19,16, +10,19, +11,-28, +30,-26, +40,-31, +40,-15, +30,26, +8,2, +-3,-16, +8,34, +-11,8, +22,-3, +49,-59, +-38,27, +42,-24, +-11,5, +-37,14, +-28,-40, +10,7, +38,-8, +10,41, +27,30, +-46,40, +48,-17, +52,29, +28,-9, +24,-28, +-3,10, +-38,-6, +-30,13, +9,4, +16,-45, +74,-48, +-31,79, +-101,-8, +86,-48, +89,11, +6,8, +-22,-17, +33,27, +34,42, +-27,-29, +-2,7, +17,4, +3,22, +-86,60, +1,2, +27,-42, +15,8, +5,3, +-25,35, +9,-13, +6,-1, +-16,-64, +18,-34, +47,19, +-64,-15, +-55,-17, +44,39, +-3,15, +7,59, +16,-84, +25,14, +-21,-49, +6,2, +-22,11, +21,-46, +-57,-41, +19,21, +-45,-54, +0,23, +-11,-60, +2,57, +3,-15, +24,-45, +-75,-76, +-2,-41, +-7,13, +-2,-40, +3,21, +-36,-35, +-80,32, +-23,-28, +-2,-64, +37,-54, +-2,-42, +-29,-10, +-41,7, +26,-10, +7,37, +22,13, +-82,60, +-43,-20, +52,13, +26,-48, +17,-45, +-24,-12, +41,-12, +-54,-15, +52,73, +-85,-34, +-48,18, +-44,-91, +-44,11, +-8,-41, +95,-18, +7,13, +39,-45, +26,20, +18,-15, +47,51, +-15,-17, +51,19, +80,-52, +1,61, +-44,44, +-40,50, +17,-32, +33,-56, +100,-22, +-76,-15, +2,89, +-12,15, +30,153, +60,35, +-25,12, +-74,80, +25,-18, +80,-24, +-47,9, +44,-101, +-4,17, +-6,-70, +-41,45, +27,40, +-59,-24, +-56,22, +-59,1, +116,18, +-19,-123, +-41,-89, +49,-62, +-58,-66, +-24,-78, +6,125, +-93,-96, +20,-68, +11,-25, +32,-35, +10,45, +-61,-7, +45,-16, +-93,57, +-22,9, +38,0, +-39,-77, +47,-33, +-36,-9, +-35,40, +-83,-114, +-28,-1, +39,-20, +-44,55, +10,-83, +-50,139, +-28,27, +73,26, +-65,86, +80,56, +80,-26, +83,-80, +2,-33, +32,60, +13,-42, +1,-34, +8,-76, +-7,53, +6,-8, +-80,-15, +-56,-8, +-71,51, +58,11, +13,-46, +57,-31, +-74,-10, +-40,47, +96,106, +75,-45, +3,92, +-22,42, +22,62, +-55,-63, +56,-116, +153,-96, +3,-45, +20,-67, +9,-131, +-52,19, +77,82, +17,-39, +-7,135, +-18,10, +112,111, +-44,6, +-67,1, +-34,158, +58,22, +0,-117, +9,17, +58,95, +-69,-29, +-107,-64, +-106,-5, +-20,52, +-34,-48, +12,-36, +49,1, +-41,-46, +-42,11, +115,-10, +-7,16, +-71,130, +-122,-47, +36,-100, +-7,-15, +72,-82, +69,53, +14,-3, +39,-39, +-48,-57, +49,75, +-96,-86, +175,-14, +8,-19, +46,27, +-15,99, +-35,-32, +-61,-44, +51,-58, +75,-29, +-4,-59, +43,-23, +44,41, +67,-120, +59,-32, +28,-33, +-66,-7, +-64,143, +23,66, +103,-128, +-122,-54, +-35,-14, +19,35, +-41,-118, +20,30, +30,-4, +16,-81, +191,4, +-21,-64, +46,-55, +51,-4, +-48,94, +65,26, +79,24, +-51,-4, +8,36, +69,-32, +41,-54, +16,-21, +-99,117, +82,-39, +19,-16, +67,-56, +17,-31, +9,68, +-131,-138, +-22,6, +19,54, +-33,-174, +-75,-3, +72,-13, +16,-47, +-98,115, +-5,32, +-151,-235, +1,-87, +86,-74, +58,43, +100,-215, +119,26, +10,-36, +144,49, +20,3, +176,-31, +-87,2, +155,44, +123,83, +86,114, +157,71, +12,-131, +51,-60, +-106,53, +5,-144, +124,89, +-102,-92, +-12,-11, +-95,-40, +-71,83, +135,42, +28,-72, +81,-74, +59,13, +-119,-25, +-8,-30, +-54,55, +26,19, +-91,-64, +153,175, +-73,-45, +34,-37, +-75,72, +-83,109, +-41,58, +22,-1, +-27,45, +-102,125, +-41,-65, +-70,-124, +111,-151, +-41,-21, +74,-136, +-25,25, +-28,40, +25,9, +104,-131, +78,-29, +32,103, +-74,124, +-1,170, +-74,31, +20,-112, +-77,68, +-47,96, +3,4, +12,-85, +-28,128, +12,15, +26,25, +29,-58, +-151,88, +123,98, +104,-33, +-72,82, +27,12, +-25,23, +162,-126, +11,192, +8,-56, +20,157, +103,1, +95,-70, +186,-83, +-8,-22, +-174,42, +-26,39, +-10,46, +-85,38, +70,-170, +-146,51, +-21,111, +-80,-111, +9,10, +-180,22, +132,136, +24,-51, +-101,161, +3,-12, +82,89, +56,-25, +-119,33, +-7,85, +-28,98, +-30,40, +141,-142, +69,-202, +-95,-13, +39,-61, +-212,-6, +64,-40, +-70,-61, +104,-161, +-96,167, +-8,-36, +-50,-131, +-43,1, +-93,-10, +-21,105, +111,-92, +-159,-7, +-33,48, +28,-23, +41,-15, +-159,85, +-10,30, +70,55, +-16,-13, +-164,102, +-186,-4, +-75,20, +25,-109, +115,-121, +55,-19, +-131,41, +69,-24, +54,25, +121,-114, +86,54, +219,-74, +3,135, +-79,100, +-101,11, +14,-11, +-38,58, +-182,89, +-54,40, +89,103, +-85,-139, +-14,65, +-97,-96, +63,107, +-51,-35, +-32,115, +80,22, +0,23, +24,-99, +145,-152, +-58,20, +-132,-54, +48,115, +125,175, +-127,-113, +197,38, +-84,-52, +62,17, +92,145, +66,-218, +-1,-74, +-169,-128, +-128,-230, +-35,-47, +14,-103, +1,38, +5,-302, +7,50, +-109,-152, +176,-132, +54,-67, +163,-149, +-111,-103, +299,86, +186,37, +-19,174, +-80,24, +-35,-8, +38,-38, +120,20, +21,104, +109,-59, +-29,57, +15,129, +172,67, +-149,-120, +81,5, +193,-121, +-173,-3, +-9,0, +-1,120, +38,-154, +55,-92, +15,77, +-105,-45, +53,-58, +-61,-31, +-147,-69, +-5,31, +154,-27, +-29,-171, +99,3, +80,-233, +-31,2, +42,80, +64,-90, +73,33, +-120,137, +214,-8, +109,33, +-113,-131, +-121,92, +-81,145, +54,-65, +160,-120, +5,-33, +82,-131, +-16,-27, +56,-6, +103,-108, +48,-86, +101,94, +-18,83, +-43,-53, +-141,61, +32,-201, +157,-34, +-90,-120, +83,190, +-4,-138, +67,61, +-7,-44, +26,-159, +-69,-37, +210,-64, +109,19, +-37,94, +-19,251, +-160,-138, +13,-72, +99,24, +-55,43, +56,-32, +91,-42, +6,27, +-22,100, +-36,104, +142,238, +17,69, +-150,-50, +1,-62, +152,18, +-31,-59, +-194,-44, +-128,246, +57,-38, +-88,-119, +-310,-26, +134,95, +-208,-164, +-69,25, +67,-29, +82,5, +193,48, +107,-135, +105,-175, +239,-115, +123,36, +-88,56, +-207,-41, +71,44, +-176,-166, +-27,-157, +-119,73, +-40,92, +120,1, +74,-176, +-54,51, +-59,4, +-4,193, +55,87, +-59,49, +29,-46, +-12,25, +202,-5, +-19,-60, +-41,-12, +-2,-52, +199,-108, +62,-252, +-185,10, +-84,-94, +-53,67, +-200,-62, +6,73, +-157,127, +153,-98, +-131,59, +128,17, +86,111, +98,192, +-142,-76, +150,59, +152,-63, +8,16, +-103,49, +36,62, +-95,140, +2,-123, +83,141, +-151,-65, +150,-185, +284,195, +-121,-2, +85,65, +-58,118, +203,-30, +161,46, +202,27, +170,-29, +125,-66, +-160,-110, +57,333, +0,11, +-82,-25, +-38,79, +-17,82, +249,-151, +-88,119, +191,-86, +48,-87, +-135,-49, +33,119, +-117,74, +-206,-92, +-75,-131, +-345,3, +10,163, +-65,-97, +79,39, +128,-247, +71,-10, +-72,140, +-226,90, +28,-58, +-58,-113, +106,-147, +-79,-63, +-2,65, +-117,-191, +124,-61, +-40,59, +54,-251, +49,-61, +14,-29, +139,65, +1,147, +232,207, +-187,-6, +20,172, +-58,-149, +21,96, +88,-54, +98,32, +64,-145, +106,-70, +-114,92, +-14,160, +-153,81, +-5,-188, +-54,57, +35,60, +24,76, +68,10, +218,-56, +155,-99, +19,182, +56,160, +-97,93, +136,46, +-42,-26, +69,-33, +64,155, +221,23, +199,96, +-99,-96, +47,13, +-92,25, +224,61, +-101,-18, +114,169, +68,-73, +86,146, +59,-75, +-27,57, +12,30, +267,-46, +-131,-110, +157,78, +-242,-113, +-85,-40, +99,141, +6,160, +-59,-54, +139,-147, +176,83, +54,7, +-56,-64, +52,57, +-205,77, +109,-152, +132,-77, +-109,118, +-92,79, +-101,193, +-107,-153, +124,-15, +-6,152, +-130,-110, +-65,-215, +58,179, +-85,-6, +33,-502, +180,-43, +-99,165, +-88,136, +6,-121, +232,-263, +9,85, +-74,124, +-31,73, +80,40, +11,-32, +16,-189, +35,-215, +-135,-24, +4,-84, +-205,140, +-104,-184, +-79,-117, +159,-34, +-41,122, +60,155, +18,-43, +-88,48, +146,-152, +-2,59, +207,-191, +-168,-41, +-63,143, +31,-107, +-22,-45, +-64,-22, +18,-271, +144,-189, +172,-25, +37,-170, +-14,-8, +-94,174, +-112,27, +-203,201, +-101,-33, +7,51, +114,-77, +-140,163, +203,-51, +-142,-157, +-333,72, +114,19, +-102,-106, +18,78, +-119,5, +184,-17, +221,285, +94,3, +-53,58, +-91,-109, +-114,-176, +-30,276, +211,45, +78,106, +108,10, +68,-205, +215,101, +-70,-152, +-73,-71, +-211,76, +112,99, +168,40, +-120,41, +-5,-242, +-17,216, +88,66, +-36,-220, +83,79, +57,29, +66,76, +-99,58, +110,0, +-95,-47, +-232,3, +-100,-74, +110,-16, +-87,-148, +-18,-95, +185,27, +-42,-316, +-19,63, +-53,66, +-62,177, +-49,358, +-59,102, +-50,-99, +-83,173, +46,-6, +13,-42, +7,163, +125,145, +-32,179, +116,81, +302,-7, +-249,-5, +158,15, +42,-23, +77,-9, +87,28, +209,-177, +-181,144, +176,-64, +-53,-185, +14,41, +-98,22, +-39,-63, +-27,-177, +-64,-229, +-60,-125, +-3,-54, +-92,112, +-88,159, +-166,-61, +89,-74, +19,-41, +-38,70, +-21,-75, +-69,-26, +233,-93, +79,-126, +-160,-107, +-115,-26, +-169,-61, +-27,-76, +-194,82, +-276,-87, +66,-237, +16,29, +-112,70, +81,-25, +192,30, +-59,73, +-212,-199, +128,-313, +-98,-37, +-129,-15, +67,75, +-23,267, +77,16, +9,-73, +23,235, +27,-45, +0,-44, +-20,133, +-36,37, +-59,-301, +-290,-199, +141,-125, +-33,92, +-64,153, +-47,-37, +27,86, +-100,-119, +-222,8, +-114,-13, +-29,-194, +-67,394, +118,-131, +20,-89, +40,-187, +43,88, +-101,26, +-172,-164, +-158,-82, +210,82, +-136,262, +214,26, +71,-84, +-44,-154, +143,-3, +-108,37, +6,0, +92,-259, +-100,58, +-214,-54, +10,48, +-191,-148, +104,34, +74,177, +83,-5, +54,0, +101,-54, +0,54, +222,-94, +-17,77, +-40,-125, +-94,32, +165,-137, +9,91, +-129,41, +134,104, +-191,-49, +-248,24, +8,141, +-87,-115, +-31,260, +5,134, +-14,86, +203,128, +-118,-189, +-13,62, +-20,37, +-115,-199, +3,-63, +-128,118, +125,-200, +27,-77, +-82,163, +-121,188, +21,77, +-23,-20, +24,73, +-148,123, +-34,-106, +-27,-29, +268,-99, +-193,147, +111,-276, +-58,-159, +-86,76, +-131,42, +-62,273, +-232,280, +62,-2, +-135,-149, +-116,16, +-6,-34, +-25,2, +-16,-147, +-151,-89, +-52,60, +389,-70, +334,232, +48,174, +156,-418, +-157,-127, +-26,-53, +197,-196, +-8,29, +-140,112, +-50,154, +165,-239, +222,-34, +123,83, +-31,289, +-34,-14, +-11,33, +-36,-19, +-226,-21, +15,59, +59,124, +-68,191, +-92,3, +-83,85, +144,-24, +-79,-38, +32,47, +64,45, +22,-320, +-102,-107, +-13,135, +-89,-224, +52,125, +45,38, +-82,124, +-79,50, +34,-52, +-8,18, +-63,211, +180,11, +-51,63, +73,74, +-239,-236, +-99,-76, +-120,112, +2,224, +184,-44, +-34,-68, +49,-121, +43,-100, +108,117, +206,38, +-45,-156, +299,-240, +-151,-28, +-108,9, +-166,304, +22,-37, +176,-124, +145,173, +19,152, +18,-25, +-109,53, +129,-135, +39,87, +65,142, +-250,-247, +37,-25, +-43,85, +69,-82, +303,-99, +-3,-6, +-18,137, +-25,-48, +19,-143, +-27,-253, +-140,73, +-21,113, +137,-119, +-183,-32, +-51,60, +104,117, +-26,-66, +29,311, +-69,143, +116,-146, +-3,119, +236,-54, +-35,-92, +151,120, +-95,-35, +68,110, +-17,50, +4,-59, +21,7, +-94,-49, +262,126, +-16,48, +-62,-19, +-73,33, +-10,-2, +11,212, +-135,29, +195,-231, +-8,-18, +-163,322, +43,59, +-159,-218, +194,155, +-150,-206, +228,94, +29,45, +-36,80, +-1,-247, +-48,6, +70,116, +-94,31, +-73,14, +42,-203, +32,-142, +-82,133, +52,179, +-42,-141, +262,92, +125,115, +257,135, +-61,-221, +-240,-42, +65,38, +-113,-185, +-154,149, +5,91, +-167,52, +-51,296, +-205,59, +2,-80, +-273,-119, +-88,-11, +104,-38, +376,-97, +141,62, +95,135, +-44,122, +205,176, +-140,-110, +-152,91, +85,101, +-101,-208, +179,-74, +277,-61, +-114,-3, +-44,20, +113,-136, +77,-209, +41,0, +-73,-43, +122,-150, +-1,5, +95,-70, +-57,-44, +28,57, +109,91, +139,61, +-39,125, +23,1, +-82,151, +-4,56, +-21,142, +76,182, +90,10, +-86,-91, +-138,19, +-76,96, +-14,-38, +-38,147, +144,265, +33,64, +83,30, +-44,138, +154,111, +60,64, +-119,73, +-39,228, +90,-98, +-4,-111, +-145,72, +113,-57, +0,111, +94,-90, +72,4, +-11,28, +120,-56, +92,-133, +68,-25, +-55,-87, +-185,-58, +-65,263, +-104,27, +79,-5, +91,-116, +112,-150, +137,-123, +-66,97, +11,-116, +261,-46, +37,87, +-126,7, +141,122, +120,51, +51,159, +-74,-21, +-126,116, +88,-26, +-251,20, +78,136, +-70,146, +-39,-9, +155,32, +-31,167, +-67,-49, +4,-10, +91,179, +-97,-151, +-104,-15, +147,34, +114,230, +51,214, +92,-49, +210,-23, +-93,104, +-110,-62, +178,146, +131,54, +-128,-23, +-56,70, +-84,-24, +108,-14, +7,-31, +71,-35, +-57,-55, +156,-220, +85,173, +-65,55, +-75,-95, +-129,73, +-86,48, +-44,-214, +125,19, +34,46, +-21,70, +174,104, +79,-5, +-166,-69, +-163,-34, +87,-90, +-16,131, +83,-134, +191,-19, +77,282, +-85,-41, +-10,-136, +-131,-211, +47,-101, +-29,114, +24,-42, +98,170, +113,-11, +-2,27, +-58,91, +3,-74, +69,-1, +160,-49, +-8,20, +1,-99, +-178,-128, +-66,169, +-38,-223, +-61,-20, +42,-87, +50,109, +-109,77, +-160,162, +74,27, +-136,43, +53,150, +128,-14, +84,36, +-28,80, +50,-57, +108,54, +8,-4, +66,-31, +-19,-73, +-54,188, +-73,-82, +-37,-29, +120,-95, +19,-34, +123,-88, +-52,61, +108,-88, +236,39, +-106,91, +93,-221, +-234,-24, +119,-44, +-45,28, +-43,5, +-44,210, +-75,-88, +-47,4, +-86,-89, +-42,89, +119,-191, +-38,49, +42,30, +-26,101, +52,-156, +-108,-113, +73,-63, +-124,-21, +71,1, +-20,46, +35,-140, +-99,173, +-59,169, +-28,198, +-81,4, +-130,-55, +44,94, +-75,188, +-186,-126, +6,-10, +-108,53, +252,5, +-55,9, +70,-54, +-124,18, +7,130, +-165,36, +64,-63, +-116,102, +99,45, +129,3, +-102,129, +-24,-6, +53,132, +-8,88, +-36,-97, +-161,-64, +-93,29, +-132,-32, +-75,59, +-147,-68, +-20,25, +8,134, +-157,59, +-36,-105, +-52,-85, +-134,-64, +82,77, +1,124, +-3,24, +36,-163, +6,43, +-108,59, +25,-314, +-227,1, +-41,-209, +185,-127, +-66,-106, +-59,-156, +10,-45, +33,-119, +-106,252, +-238,-160, +242,238, +-19,-54, +-60,12, +-38,-21, +-164,-31, +89,8, +-71,-14, +-3,25, +-62,84, +57,106, +-112,-146, +11,-61, +-44,124, +164,-11, +-98,-33, +105,45, +-20,152, +-41,-19, +60,50, +77,-99, +43,128, +61,-2, +130,-122, +125,2, +-40,-71, +82,40, +143,166, +96,82, +68,114, +-81,-33, +-38,-166, +-203,143, +-59,124, +32,-4, +127,-77, +126,55, +13,-219, +4,163, +-37,14, +17,-12, +-18,231, +184,70, +50,229, +46,49, +-31,-104, +111,-91, +63,-26, +35,25, +79,103, +120,-182, +-52,-163, +140,-67, +91,-73, +26,85, +56,-28, +42,-139, +-44,-44, +-49,22, +245,12, +44,-72, +72,-57, +103,136, +-147,68, +7,38, +10,-151, +96,139, +87,-166, +-102,79, +-13,54, +-30,96, +36,-64, +20,113, +-105,-115, +13,192, +70,20, +-128,-100, +-252,-114, +-84,-191, +-196,-173, +-96,-152, +127,53, +-13,32, +130,-91, +-105,-28, +84,82, +8,-25, +132,-98, +-60,43, +57,-42, +-131,124, +97,107, +-122,-180, +131,42, +117,9, +-42,30, +-100,173, +40,80, +31,63, +-98,-91, +-68,50, +-32,55, +1,12, +60,120, +-157,56, +-159,55, +-47,12, +-69,132, +135,21, +-28,46, +-164,92, +-15,31, +61,-65, +57,170, +293,57, +2,57, +63,-31, +112,4, +-84,-37, +66,54, +-143,81, +16,114, +-13,60, +115,-114, +66,-92, +-40,-127, +-115,20, +100,-13, +162,119, +19,129, +90,24, +6,33, +-152,45, +29,143, +-8,53, +-35,10, +133,98, +-136,29, +57,-43, +133,36, +30,-17, +-81,72, +93,-45, +24,138, +-60,-126, +-26,-9, +-20,2, +114,-4, +44,-89, +-51,84, +-6,-98, +46,16, +-76,-101, +-38,-80, +158,112, +-123,8, +196,-3, +-53,-216, +71,71, +-147,59, +-33,-166, +-127,80, +-144,70, +3,-58, +-236,-59, +-27,-125, +-57,22, +8,-23, +-31,1, +-59,14, +116,44, +68,-39, +-44,2, +-102,-77, +-28,-75, +24,-19, +79,-70, +40,-10, +-22,-44, +-50,-140, +89,-33, +-41,-99, +-70,-90, +7,-72, +14,50, +55,11, +117,-52, +-39,9, +61,22, +70,58, +-20,35, +27,-136, +21,58, +44,-114, +53,-10, +-25,-41, +-56,116, +66,-42, +29,146, +-74,-147, +24,-83, +32,-6, +102,-46, +-21,-34, +-25,-67, +120,-30, +192,-36, +-16,-40, +43,-35, +-61,70, +27,-55, +6,33, +-63,-70, +-90,37, +-34,-52, +-36,46, +124,-27, +-61,35, +-34,10, +-49,29, +76,-77, +-142,-53, +67,7, +55,-74, +45,-32, +-24,55, +49,-84, +-129,59, +-21,-150, +-13,101, +18,51, +13,77, +-47,29, +12,-28, +-62,118, +-17,-5, +-84,10, +47,-36, +10,-62, +39,22, +-70,13, +33,26, +-7,44, +13,48, +11,-26, +22,38, +31,115, +31,-38, +63,6, +20,-38, +48,-34, +110,-90, +-10,30, +32,32, +-117,-39, +11,-23, +-51,-43, +43,-70, +-101,-63, +-23,78, +60,17, +-96,72, +24,9, +31,-60, +-6,16, +45,71, +17,30, +72,17, +-37,25, +16,-58, +-120,24, +-141,-70, +97,-26, +40,53, +29,90, +-14,27, +-55,35, +78,-5, +-84,-49, +-48,-99, +58,43, +3,82, +31,6, +86,2, +-74,61, +-49,6, +13,-89, +13,-20, +-26,-63, +42,-33, +25,65, +-21,40, +-110,19, +33,-21, +-18,68, +-45,-18, +49,25, +-22,-77, +12,-36, +52,60, +-2,74, +58,-43, +-15,-37, +1,72, +15,85, +47,-18, +128,81, +57,59, +-101,-51, +38,-39, +7,39, +14,10, +7,-57, +30,35, +48,13, +-12,13, +52,-3, +83,-63, +-16,32, +16,-100, +15,31, +38,-45, +9,-25, +92,120, +-15,13, +52,-45, +22,39, +-43,80, +1,20, +-13,-18, +-16,31, +-76,73, +-40,32, +-31,10, +71,5, +35,-83, +31,-31, +-47,-41, +-37,14, +-17,74, +-42,5, +8,26, +3,26, +-4,10, +-30,51, +70,-14, +-39,-8, +-33,-29, +8,41, +18,-8, +86,-55, +0,30, +37,47, +70,11, +-3,-18, +29,76, +102,-4, +48,19, +-3,-9, +22,-40, +21,-46, +-45,-18, +10,8, +65,43, +44,5, +40,-42, +17,21, +50,-30, +-2,4, +46,42, +36,50, +1,-16, +-8,16, +-2,-4, +-42,33, +-13,5, +-20,23, +-29,-38, +-33,62, +-59,41, +-13,-60, +26,22, +-19,57, +-70,39, +-1,32, +-10,-43, +15,-19, +30,-14, +-20,-9, +83,68, +47,-28, +-13,73, +-1,102, +-20,57, +-15,-69, +-19,-31, +-44,-56, +44,-6, +53,-73, +50,7, +20,-42, +7,-34, +15,-6, +-52,-36, +3,-20, +-19,-32, +-44,39, +110,108, +-15,-6, +-33,51, +54,-19, +48,-12, +-67,9, +-28,12, +-10,-26, +5,-13, +42,-3, +-8,16, +-54,-28, +-11,1, +74,31, +-61,-4, +33,58, +-26,-56, +-21,49, +5,-45, +80,-26, +2,17, +-67,10, +19,13, +38,-37, +16,19, +-8,-14, +8,-44, +6,43, +21,11, +17,23, +-40,-24, +20,9, +8,9, +-10,-17, +51,26, +-22,-23, +-12,50, +23,4, +-27,38, +5,-6, +33,15, +34,-25, +31,22, +-11,10, +34,-21, +-19,-9, +-16,-7, +20,19, +7,-29, +-30,-25, +-57,24, +10,-6, +19,-30, +4,42, +-32,22, +1,27, +10,9, +-23,-34, +-8,-1, +-11,-27, +24,35, +7,3, +-41,0, +29,-18, +32,19, +1,22, +2,25, +3,13, +11,-25, +52,-47, +-35,24, +-41,-9, +-15,46, +5,1, +4,27, +4,18, +-27,-13, +-24,18, +16,10, +18,11, +26,-17, +-20,-33, +-21,-5, +-9,-30, +20,31, +13,-1, +3,3, +27,-2, +-10,1, +-9,-10, +30,-10, +22,5, +-31,3, +27,-1, +-16,-16, +-19,-2, +-12,-3, +-23,11, +14,-1, +5,3, +-12,-2, +3,12, +24,-27, +0,-5, +24,16, +13,-13, +-12,-15, +2,-11, +4,2, +5,-7, +12,0, +37,11, +-27,24, +-14,21, +12,-7, +21,-19, +-17,10, +1,10, +-11,-2, +-31,-2, +-7,-8, +-9,25, +22,25, +17,26, +-23,11, +4,-23, +-2,-7, +-23,13, +14,-14, +1,-10, +-21,5, +6,-18, +27,0, +7,-12, +15,-11, +4,-7, +-19,5, +-7,-12, +-2,11, +5,-3, +-14,12, +6,-10, +-1,-5, +5,-3, +6,4, +-4,-3, +13,-5, +14,-6, +-13,4, +-4,1, +5,2, +-6,-9, +-8,2, +4,-3, +-3,-5, +-1,4, +0,-2, +6,8, +6,-2, +5,-5, +5,3, +-5,-5, +7,-7, +-1,-2, +-4,-2, +10,1, +-3,-1, +-3,2, +2,2, +-1,-5, +-6,3, +7,2, +-3,2, +-3,0, +5,2, +-2,1, +-2,1, +6,0, +-3,0, +-4,-2, +7,0, +-3,0, +-3,0, +6,0, +-3,0, +-3,0, +7,0, +-4,2, +-3,0, +6,0, +-2,-1, +-2,-1, +5,-2, +-3,0, +-3,-2, +7,-2, +-6,-3, +-1,5, +2,-2, +-3,-2, +-3,1, +10,-1, +-4,2, +-1,2, +7,7, +-5,5, +5,-3, +5,5, +6,2, +6,-8, +0,2, +-1,-4, +-3,5, +4,3, +-8,-2, +-6,9, +5,-2, +-4,-1, +-13,-4, +14,6, +13,5, +-4,3, +6,-4, +5,3, +-1,5, +6,10, +-14,-12, +5,3, +-2,-11, +-7,12, +-19,-5, +4,7, +15,11, +7,12, +27,0, +6,18, +-21,-5, +1,10, +14,14, +-23,-13, +-2,7, +4,23, +-23,-11, +17,-26, +22,-25, +-9,-25, +-7,8, +-31,2, +-11,2, +1,-10, +-17,-10, +21,19, +12,7, +-14,-21, +-27,-24, +37,-11, +12,0, +5,7, +4,-2, +2,11, +-12,15, +13,13, +24,-16, +0,5, +24,27, +3,-12, +-12,2, +5,-3, +14,1, +-23,-11, +-12,3, +-19,2, +-16,16, +27,1, +-31,-3, +22,-5, +30,10, +-9,10, +-10,-1, +27,2, +3,-3, +13,1, +20,-31, +-9,30, +-21,5, +-20,33, +26,17, +18,-11, +16,-10, +-24,-18, +-27,13, +4,-18, +4,-27, +5,-1, +-15,-46, +-41,9, +-35,-24, +52,47, +11,25, +3,-13, +2,-25, +1,-22, +32,-19, +29,18, +-41,0, +7,-3, +24,-35, +-11,27, +-8,1, +-23,34, +10,-9, +1,-27, +-32,-22, +4,-42, +19,30, +10,6, +-57,-24, +-30,25, +7,29, +20,-19, +-16,7, +-19,9, +34,21, +-11,-10, +31,-22, +34,25, +33,-15, +5,6, +-27,-38, +23,-4, +-12,-50, +-22,23, +51,-26, +-10,17, +8,-9, +20,-9, +-40,24, +17,-23, +21,-11, +6,-43, +8,44, +-8,14, +16,-19, +38,37, +19,-13, +-67,-10, +2,-17, +80,26, +5,45, +-21,-49, +-26,56, +33,-58, +-61,4, +74,-31, +-11,-1, +-54,28, +-8,-16, +42,3, +5,13, +-10,26, +-28,-12, +-67,-9, +48,12, +54,19, +-33,-51, +-15,6, +110,-108, +-44,-39, +-19,32, +3,20, +-52,36, +15,6, +7,34, +20,42, +50,-7, +53,73, +44,6, +-44,56, +-19,31, +-15,69, +-20,-57, +-1,-102, +-13,-73, +47,28, +83,-68, +-20,9, +30,14, +15,19, +-10,43, +-1,-32, +-70,-39, +-19,-57, +26,-22, +-13,60, +-59,-41, +-33,-62, +-29,38, +-20,-23, +-13,-5, +-42,-33, +-2,4, +-8,-16, +1,16, +36,-50, +46,-42, +-2,-4, +50,30, +17,-21, +40,42, +44,-5, +65,-43, +10,-8, +-45,18, +21,46, +22,40, +-3,9, +48,-19, +102,4, +29,-76, +-3,18, +70,-11, +37,-47, +0,-30, +86,55, +18,8, +8,-41, +-33,29, +-39,8, +70,14, +-30,-51, +-4,-10, +3,-26, +8,-26, +-42,-5, +-17,-74, +-37,-14, +-47,41, +31,31, +35,83, +71,-5, +-31,-10, +-40,-32, +-76,-73, +-16,-31, +-13,18, +1,-20, +-43,-80, +22,-39, +52,45, +-15,-13, +92,-120, +9,25, +38,45, +15,-31, +16,100, +-16,-32, +83,63, +52,3, +-12,-13, +48,-13, +30,-35, +7,57, +14,-10, +7,-39, +38,39, +-101,51, +57,-59, +128,-81, +47,18, +15,-85, +1,-72, +-15,37, +58,43, +-2,-74, +52,-60, +12,36, +-22,77, +49,-25, +-45,18, +-18,-68, +33,21, +-110,-19, +-21,-40, +25,-65, +42,33, +-26,63, +13,20, +13,89, +-49,-6, +-74,-61, +86,-2, +31,-6, +3,-82, +58,-43, +-48,99, +-84,49, +78,5, +-55,-35, +-14,-27, +29,-90, +40,-53, +97,26, +-141,70, +-120,-24, +16,58, +-37,-25, +72,-17, +17,-30, +45,-71, +-6,-16, +31,60, +24,-9, +-96,-72, +60,-17, +-23,-78, +-101,63, +43,70, +-51,43, +11,23, +-117,39, +32,-32, +-10,-30, +110,90, +48,34, +20,38, +63,-6, +31,38, +31,-115, +22,-38, +11,26, +13,-48, +-7,-44, +33,-26, +-70,-13, +39,-22, +10,62, +47,36, +-84,-10, +-17,5, +-62,-118, +12,28, +-47,-29, +13,-77, +18,-51, +-13,-101, +-21,150, +-129,-59, +49,84, +-24,-55, +45,32, +55,74, +67,-7, +-142,53, +76,77, +-49,-29, +-34,-10, +-61,-35, +124,27, +-36,-46, +-34,52, +-90,-37, +-63,70, +6,-33, +27,55, +-61,-70, +43,35, +-16,40, +192,36, +120,30, +-25,67, +-21,34, +102,46, +32,6, +24,83, +-74,147, +29,-146, +66,42, +-56,-116, +-25,41, +53,10, +44,114, +21,-58, +27,136, +-20,-35, +70,-58, +61,-22, +-39,-9, +117,52, +55,-11, +14,-50, +7,72, +-70,90, +-41,99, +89,33, +-50,140, +-22,44, +40,10, +79,70, +24,19, +-28,75, +-102,77, +-44,-2, +68,39, +116,-44, +-59,-14, +-31,-1, +8,23, +-57,-22, +-27,125, +-236,59, +3,58, +-144,-70, +-127,-80, +-33,166, +-147,-59, +71,-71, +-53,216, +196,3, +-123,-8, +158,-112, +-38,80, +-76,101, +46,-16, +-6,98, +-51,-84, +44,89, +114,4, +-20,-2, +-26,9, +-60,126, +24,-138, +93,45, +-81,-72, +30,17, +133,-36, +57,43, +-136,-29, +133,-98, +-35,-10, +-8,-53, +29,-143, +-152,-45, +6,-33, +90,-24, +19,-129, +162,-119, +100,13, +-115,-20, +-40,127, +66,92, +115,114, +-13,-60, +16,-114, +-143,-81, +66,-54, +-84,37, +112,-4, +63,31, +2,-57, +293,-57, +57,-170, +61,65, +-15,-31, +-164,-92, +-28,-46, +135,-21, +-69,-132, +-47,-12, +-159,-55, +-157,-56, +60,-120, +1,-12, +-32,-55, +-68,-50, +-98,91, +31,-63, +40,-80, +-100,-173, +-42,-30, +117,-9, +131,-42, +-122,180, +97,-107, +-131,-124, +57,42, +-60,-43, +132,98, +8,25, +84,-82, +-105,28, +130,91, +-13,-32, +127,-53, +-96,152, +-196,173, +-84,191, +-252,114, +-128,100, +70,-20, +13,-192, +-105,115, +20,-113, +36,64, +-30,-96, +-13,-54, +-102,-79, +87,166, +96,-139, +10,151, +7,-38, +-147,-68, +103,-136, +72,57, +44,72, +245,-12, +-49,-22, +-44,44, +42,139, +56,28, +26,-85, +91,73, +140,67, +-52,163, +120,182, +79,-103, +35,-25, +63,26, +111,91, +-31,104, +46,-49, +50,-229, +184,-70, +-18,-231, +17,12, +-37,-14, +4,-163, +13,219, +126,-55, +127,77, +32,4, +-59,-124, +-203,-143, +-38,166, +-81,33, +68,-114, +96,-82, +143,-166, +82,-40, +-40,71, +125,-2, +130,122, +61,2, +43,-128, +77,99, +60,-50, +-41,19, +-20,-152, +105,-45, +-98,33, +164,11, +-44,-124, +11,61, +-112,146, +57,-106, +-62,-84, +-3,-25, +-71,14, +89,-8, +-164,31, +-38,21, +-60,-12, +-19,54, +242,-238, +-238,160, +-106,-252, +33,119, +10,45, +-59,156, +-66,106, +185,127, +-41,209, +-227,-1, +25,314, +-108,-59, +6,-43, +36,163, +-3,-24, +1,-124, +82,-77, +-134,64, +-52,85, +-36,105, +-157,-59, +8,-134, +-20,-25, +-147,68, +-75,-59, +-132,32, +-93,-29, +-161,64, +-36,97, +-8,-88, +53,-132, +-24,6, +-102,-129, +129,-3, +99,-45, +-116,-102, +64,63, +-165,-36, +7,-130, +-124,-18, +70,54, +-55,-9, +252,-5, +-108,-53, +6,10, +-186,126, +-75,-188, +44,-94, +-130,55, +-81,-4, +-28,-198, +-59,-169, +-99,-173, +35,140, +-20,-46, +71,-1, +-124,21, +73,63, +-108,113, +52,156, +-26,-101, +42,-30, +-38,-49, +119,191, +-42,-89, +-86,89, +-47,-4, +-75,88, +-44,-210, +-43,-5, +-45,-28, +119,44, +-234,24, +93,221, +-106,-91, +236,-39, +108,88, +-52,-61, +123,88, +19,34, +120,95, +-37,29, +-73,82, +-54,-188, +-19,73, +66,31, +8,4, +108,-54, +50,57, +-28,-80, +84,-36, +128,14, +53,-150, +-136,-43, +74,-27, +-160,-162, +-109,-77, +50,-109, +42,87, +-61,20, +-38,223, +-66,-169, +-178,128, +1,99, +-8,-20, +160,49, +69,1, +3,74, +-58,-91, +-2,-27, +113,11, +98,-170, +24,42, +-29,-114, +47,101, +-131,211, +-10,136, +-85,41, +77,-282, +191,19, +83,134, +-16,-131, +87,90, +-163,34, +-166,69, +79,5, +174,-104, +-21,-70, +34,-46, +125,-19, +-44,214, +-86,-48, +-129,-73, +-75,95, +-65,-55, +85,-173, +156,220, +-57,55, +71,35, +7,31, +108,14, +-84,24, +-56,-70, +-128,23, +131,-54, +178,-146, +-110,62, +-93,-104, +210,23, +92,49, +51,-214, +114,-230, +147,-34, +-104,15, +-97,151, +91,-179, +4,10, +-67,49, +-31,-167, +155,-32, +-39,9, +-70,-146, +78,-136, +-251,-20, +88,26, +-126,-116, +-74,21, +51,-159, +120,-51, +141,-122, +-126,-7, +37,-87, +261,46, +11,116, +-66,-97, +137,123, +112,150, +91,116, +79,5, +-104,-27, +-65,-263, +-185,58, +-55,87, +68,25, +92,133, +120,56, +-11,-28, +72,-4, +94,90, +0,-111, +113,57, +-145,-72, +-4,111, +90,98, +-39,-228, +-119,-73, +60,-64, +154,-111, +-44,-138, +83,-30, +33,-64, +144,-265, +-38,-147, +-14,38, +-76,-96, +-138,-19, +-86,91, +90,-10, +76,-182, +-21,-142, +-4,-56, +-82,-151, +23,-1, +-39,-125, +139,-61, +109,-91, +28,-57, +-57,44, +95,70, +-1,-5, +122,150, +-73,43, +41,0, +77,209, +113,136, +-44,-20, +-114,3, +277,61, +179,74, +-101,208, +85,-101, +-152,-91, +-140,110, +205,-176, +-44,-122, +95,-135, +141,-62, +376,97, +104,38, +-88,11, +-273,119, +2,80, +-205,-59, +-51,-296, +-167,-52, +5,-91, +-154,-149, +-113,185, +65,-38, +-240,42, +-61,221, +257,-135, +125,-115, +262,-92, +-42,141, +52,-179, +-82,-133, +32,142, +42,203, +-73,-14, +-94,-31, +70,-116, +-48,-6, +-1,247, +-36,-80, +29,-45, +228,-94, +-150,206, +194,-155, +-159,218, +43,-59, +-163,-322, +-8,18, +195,231, +-135,-29, +11,-212, +-10,2, +-73,-33, +-62,19, +-16,-48, +262,-126, +-94,49, +21,-7, +4,59, +-17,-50, +68,-110, +-95,35, +151,-120, +-35,92, +236,54, +-3,-119, +116,146, +-69,-143, +29,-311, +-26,66, +104,-117, +-51,-60, +-183,32, +137,119, +-21,-113, +-140,-73, +-27,253, +19,143, +-25,48, +-18,-137, +-3,6, +303,99, +69,82, +-43,-85, +37,25, +-250,247, +65,-142, +39,-87, +129,135, +-109,-53, +18,25, +19,-152, +145,-173, +176,124, +22,37, +-166,-304, +-108,-9, +-151,28, +299,240, +-45,156, +206,-38, +108,-117, +43,100, +49,121, +-34,68, +184,44, +2,-224, +-120,-112, +-99,76, +-239,236, +73,-74, +-51,-63, +180,-11, +-63,-211, +-8,-18, +34,52, +-79,-50, +-82,-124, +45,-38, +52,-125, +-89,224, +-13,-135, +-102,107, +22,320, +64,-45, +32,-47, +-79,38, +144,24, +-83,-85, +-92,-3, +-68,-191, +59,-124, +15,-59, +-226,21, +-36,19, +-11,-33, +-34,14, +-31,-289, +123,-83, +222,34, +165,239, +-50,-154, +-140,-112, +-8,-29, +197,196, +-26,53, +-157,127, +156,418, +48,-174, +334,-232, +389,70, +-52,-60, +-151,89, +-16,147, +-25,-2, +-6,34, +-116,-16, +-135,149, +62,2, +-232,-280, +-62,-273, +-131,-42, +-86,-76, +-58,159, +111,276, +-193,-147, +268,99, +-27,29, +-34,106, +-148,-123, +24,-73, +-23,20, +21,-77, +-121,-188, +-82,-163, +27,77, +125,200, +-128,-118, +3,63, +-115,199, +-20,-37, +-13,-62, +-118,189, +203,-128, +-14,-86, +5,-134, +-31,-260, +-87,115, +8,-141, +-248,-24, +-191,49, +134,-104, +-129,-41, +9,-91, +165,137, +-94,-32, +-40,125, +-17,-77, +222,94, +0,-54, +101,54, +54,0, +83,5, +74,-177, +104,-34, +-191,148, +10,-48, +-214,54, +-100,-58, +92,259, +6,0, +-86,197, +132,57, +-126,-15, +-103,238, +65,-109, +4,-44, +-152,7, +-7,-82, +-27,58, +50,178, +-169,-56, +166,178, +149,136, +106,-77, +-86,122, +-115,-121, +195,-214, +-35,-23, +9,-69, +224,20, +-57,125, +-94,6, +-291,-273, +106,-105, +-110,159, +84,46, +0,140, +-13,189, +-125,223, +-80,-13, +166,-8, +153,178, +64,-46, +161,-2, +-117,-128, +38,-234, +-83,195, +191,-174, +-202,-33, +128,164, +87,-34, +-249,92, +78,-123, +310,-19, +-239,29, +22,-33, +30,-96, +-89,69, +34,3, +146,-27, +-105,21, +-104,-168, +-118,-147, +-182,73, +-5,246, +52,117, +2,-81, +124,-135, +-147,-106, +6,111, +-17,-28, +24,-85, +14,119, +-35,-40, +87,102, +192,-53, +181,-97, +118,24, +-49,56, +-263,9, +136,-63, +275,-293, +106,-81, +-153,-81, +56,63, +18,-68, +-99,11, +-160,34, +91,-186, +131,-261, +-113,208, +-209,-59, +181,101, +193,29, +34,30, +-75,121, +38,94, +-145,165, +-122,-199, +116,129, +-79,262, +118,168, +-133,-84, +-10,-53, +-67,164, +-68,331, +36,110, +-177,29, +50,-12, +4,1, +100,-36, +3,-127, +167,62, +-215,-194, +-48,205, +-53,271, +-184,-9, +-9,87, +-277,2, +-92,77, +140,-41, +64,-40, +59,-180, +190,-55, +-15,-8, +-43,73, +166,108, +117,-131, +6,1, +-27,138, +-79,25, +-118,-220, +58,121, +93,110, +-22,-98, +-26,43, +-42,-69, +-4,164, +96,-49, +15,-146, +302,-66, +166,79, +-10,-87, +68,1, +-84,42, +37,-14, +371,-76, +-67,51, +-77,-20, +-109,170, +47,71, +-47,69, +150,266, +164,-31, +-45,-42, +-71,6, +-168,-102, +30,215, +-139,-175, +111,59, +-53,64, +365,142, +-11,1, +97,236, +28,-288, +-64,139, +28,-36, +159,92, +-25,-20, +-13,-97, +154,-38, +-298,-38, +158,-66, +-107,119, +191,-154, +126,-12, +-11,-9, +13,201, +-27,110, +-8,150, +124,-83, +187,58, +88,-50, +55,191, +138,165, +164,132, +-320,122, +-2,-30, +-81,59, +-111,-179, +-1,82, +-94,40, +-139,-25, +-41,-160, +147,-194, +36,32, +-75,-34, +7,-317, +140,83, +-174,19, +60,22, +93,37, +-77,165, +8,-51, +215,174, +-10,-119, +141,145, +-27,-26, +-129,-15, +-237,202, +-2,87, +65,-200, +160,-199, +-122,-95, +9,59, +-62,-96, +-110,51, +-223,-23, +3,-79, +20,-138, +51,-94, +3,100, +-21,-126, +-62,99, +38,166, +109,-42, +-287,-159, +84,156, +-23,-63, +149,0, +-105,-7, +3,-41, +-295,41, +11,48, +-115,20, +107,29, +86,-140, +-157,15, +-28,0, +-281,12, +-190,108, +-40,133, +-167,-58, +23,9, +113,72, +-11,223, +25,105, +50,180, +199,133, +-85,-113, +70,214, +88,88, +-33,48, +-6,-7, +63,-9, +70,48, +-36,31, +22,169, +105,150, +49,67, +204,-49, +17,69, +8,-38, +17,101, +85,-38, +-265,0, +-203,179, +-71,338, +-208,-218, +-152,33, +97,65, +6,220, +207,-128, +-167,-27, +-48,115, +96,-137, +-186,-9, +68,97, +-216,8, +115,114, +107,27, +-1,-53, +-57,-29, +22,-151, +-29,-126, +160,-28, +94,150, +-41,-92, +94,189, +-123,-88, +145,96, +-146,78, +-138,-116, +-67,240, +50,-143, +-2,-12, +-68,-55, +146,7, +-319,37, +8,12, +234,1, +144,-151, +-28,200, +45,167, +-163,-32, +11,-23, +-233,121, +52,96, +-246,-48, +-31,97, +62,-166, +-53,100, +51,29, +73,22, +92,25, +-197,-149, +27,31, +-41,-15, +72,78, +75,-42, +-142,-98, +27,-69, +137,-19, +27,227, +21,57, +-99,21, +111,5, +101,-68, +-29,-13, +0,-48, +-86,30, +-155,-12, +-12,-218, +65,22, +43,277, +199,-61, +-39,194, +-120,-123, +-82,102, +100,-22, +-127,20, +116,130, +-1,16, +-45,36, +126,-78, +69,-55, +102,23, +-69,-148, +18,-45, +209,245, +42,80, +176,-97, +108,51, +-99,-129, +11,-20, +-100,122, +-61,-22, +69,49, +-190,-146, +101,-52, +-41,-43, +-22,53, +-9,-57, +184,84, +-1,-91, +-188,-150, +190,-191, +-19,98, +61,49, +-209,143, +-127,67, +219,147, +203,-29, +116,157, +-322,85, +-11,-239, +107,-85, +-34,-81, +-71,92, +42,-13, +55,119, +121,210, +-42,161, +91,36, +73,79, +30,-134, +-203,-145, +111,-11, +-124,-27, +-27,-6, +83,-97, +6,-43, +-39,-18, +76,-144, +62,-57, +-40,0, +16,-49, +97,171, +-88,59, +-196,121, +125,-166, +108,-155, +17,-210, +111,110, +-151,-92, +21,-67, +175,148, +-25,-164, +-44,-99, +44,-23, +-24,-135, +34,45, +52,-109, +-5,-53, +-9,67, +-14,-67, +-4,-137, +-85,56, +-9,87, +44,-67, +53,-59, +114,-139, +68,-77, +-3,155, +15,40, +-34,-68, +56,128, +-136,-4, +151,-33, +-17,-67, +60,109, +303,173, +104,-63, +103,-43, +-55,-167, +-19,-8, +147,97, +149,-81, +-2,49, +14,19, +-37,97, +24,99, +-14,-50, +92,142, +-23,45, +117,116, +59,124, +208,96, +45,-17, +-94,109, +-56,-7, +-189,128, +-14,19, +-182,-219, +24,-166, +13,-78, +58,-53, +26,-53, +-60,-17, +-4,63, +-36,-132, +-23,70, +64,-142, +72,-137, +-38,-38, +146,107, +107,69, +99,-11, +17,70, +64,59, +247,98, +-142,-106, +-253,-54, +0,-105, +25,84, +105,-154, +-19,-6, +-8,-54, +-34,-29, +-37,222, +-102,-26, +33,28, +111,72, +-291,114, +-152,52, +88,-148, +9,135, +-114,-92, +-86,42, +-173,-106, +45,131, +80,66, +-64,55, +-177,6, +22,164, +106,12, +-106,86, +-90,-12, +0,27, +-11,105, +-115,133, +85,-170, +-85,88, +-5,52, +119,23, +139,57, +65,182, +96,-94, +126,-69, +1,-90, +74,-20, +-73,-124, +-49,-42, +-157,1, +-81,-28, +-54,-34, +-118,50, +-17,65, +9,-34, +-36,-15, +18,-14, +-73,-22, +-7,-72, +-8,50, +-20,-21, +27,-60, +84,-32, +-36,-118, +-59,-82, +40,-77, +-63,-166, +-112,47, +-49,-19, +-2,60, +-201,83, +47,117, +87,51, +80,125, +12,143, +109,-59, +-56,-1, +22,-20, +-26,-1, +163,-101, +31,51, +-18,-92, +22,-112, +142,100, +-2,46, +114,-200, +9,-52, +75,129, +59,-69, +51,-43, +-179,-137, +145,-115, +-65,56, +-4,61, +-39,-193, +151,-140, +66,-22, +-55,91, +132,-74, +17,-92, +93,25, +-46,-37, +-126,10, +48,32, +-97,122, +27,-103, +-122,-177, +-24,-64, +7,77, +126,190, +7,-46, +10,39, +60,211, +85,-4, +-24,45, +-149,48, +-32,30, +-80,-2, +46,-15, +-70,-48, +45,1, +-46,-8, +-70,40, +-32,63, +-165,-75, +-151,-19, +3,-158, +78,-14, +73,-146, +-31,-34, +98,62, +19,84, +97,158, +107,-18, +69,72, +-1,8, +115,37, +-39,-28, +85,26, +115,-46, +-111,40, +54,107, +39,90, +-43,11, +-56,-28, +-108,0, +22,209, +65,102, +129,100, +-46,45, +-102,-44, +127,93, +-25,-115, +-4,52, +73,6, +27,-29, +-3,68, +-79,88, +-121,27, +18,33, +59,6, +-10,-67, +-52,-26, +-39,43, +-12,-63, +8,21, +-37,63, +-103,-37, +65,38, +-99,19, +-122,-68, +42,41, +-57,90, +16,-13, +2,-19, +-73,-30, +8,88, +-210,64, +-53,31, +22,-49, +134,-126, +-4,81, +69,47, +-42,-83, +-65,77, +-30,60, +-69,-71, +-16,49, +-27,53, +-69,-80, +43,35, +-38,-63, +-105,-12, +-41,-66, +-10,105, +76,9, +77,28, +135,18, +79,86, +15,1, +-12,-47, +59,-8, +-172,69, +-65,-49, +28,-109, +62,-58, +58,260, +2,43, +124,-61, +18,-59, +88,-100, +8,150, +-64,-22, +-150,-31, +12,-24, +-21,91, +29,40, +-15,-78, +7,64, +-69,-57, +-21,17, +-66,-69, +86,13, +13,-30, +-26,-81, +5,36, +-71,19, +6,67, +52,121, +86,13, +26,68, +-88,-17, +-35,-32, +30,151, +-66,-6, +-22,-18, +97,62, +-10,-36, +40,30, +38,-19, +-66,2, +99,-103, +-70,24, +118,53, +53,74, +39,10, +-81,-15, +-73,-57, +63,-62, +-17,-14, +-71,21, +42,24, +-37,46, +-17,13, +110,-81, +30,86, +44,59, +-44,-37, +-70,6, +-2,-18, +23,32, +24,46, +-50,-87, +18,-4, +-70,-22, +35,79, +72,-7, +-67,4, +45,13, +-44,-34, +20,-45, +35,-108, +67,51, +-23,-148, +-13,25, +106,-19, +42,-19, +-5,82, +-56,131, +38,-67, +7,-39, +0,-52, +-1,61, +-70,-44, +51,19, +-44,4, +89,-114, +-33,-3, +5,-18, +90,48, +-75,-63, +86,55, +6,29, +-1,25, +-58,63, +-45,-48, +-54,-14, +6,24, +22,32, +1,6, +61,27, +16,-138, +-28,72, +2,-35, +-11,-44, +10,29, +-19,-38, +8,104, +139,-7, +-99,-66, +5,-62, +69,-50, +121,-88, +-27,-79, +4,-13, +15,59, +26,-42, +-25,42, +29,53, +-2,48, +66,14, +73,30, +17,-18, +-7,10, +34,57, +-25,-32, +0,-4, +99,53, +-6,-13, +35,16, +12,27, +63,65, +76,-33, +40,28, +64,34, +-24,-16, +-1,-11, +35,-65, +47,-57, +5,-61, +2,-97, +-13,31, +-10,-11, +-40,10, +43,46, +17,-104, +-19,-14, +26,-62, +-13,14, +-39,-11, +53,81, +-21,-74, +-14,-6, +-17,-23, +45,36, +25,-17, +3,-22, +-34,17, +25,1, +-64,25, +-49,-21, +36,-50, +-22,-60, +-6,7, +-1,-33, +-4,7, +-96,2, +-42,61, +33,-25, +34,-63, +24,-56, +-1,24, +-16,-8, +66,54, +-52,25, +56,15, +25,-14, +10,18, +-1,6, +46,-10, +-43,-17, +-28,51, +-46,-40, +4,-2, +-24,66, +-77,-19, +-3,-62, +40,15, +-29,-35, +8,-30, +-34,17, +27,-68, +13,-19, +42,-6, +56,64, +25,8, +29,22, +-33,56, +24,27, +4,3, +54,-4, +32,-12, +24,20, +-40,24, +8,20, +-18,53, +19,-77, +-22,40, +-20,-35, +-2,11, +-17,21, +4,6, +50,17, +-57,-1, +32,-7, +-29,6, +53,58, +11,-1, +28,73, +-13,-36, +15,5, +-27,-21, +49,-8, +-37,-49, +-20,12, +41,36, +5,16, +44,13, +26,-10, +-3,-4, +39,-47, +-13,32, +-16,29, +6,40, +9,-14, +-18,-20, +9,35, +-3,25, +-11,31, +-25,55, +-4,-22, +3,8, +35,12, +-39,-31, +5,5, +29,30, +-5,-8, +-13,-14, +-10,-7, +28,-16, +-2,1, +-12,37, +0,12, +28,-4, +-1,12, +-26,12, +-10,21, +-23,20, +1,7, +5,-11, +18,-24, +-15,-45, +27,10, +34,-21, +16,-31, +8,11, +-35,-18, +12,28, +-16,4, +-6,9, +11,-11, +-6,2, +23,-25, +44,7, +29,-7, +-13,-23, +-8,13, +21,-18, +43,19, +4,-4, +-4,-8, +-7,-17, +39,-7, +0,4, +6,-7, +17,32, +-12,19, +23,-22, +-3,-21, +-11,22, +-32,7, +3,-18, +6,-14, +-9,8, +-1,-5, +9,-5, +-32,2, +-13,37, +-17,10, +1,-20, +12,-16, +-4,22, +-9,16, +1,14, +-3,16, +13,-5, +-4,-6, +1,12, +-2,-3, +1,-13, +2,12, +-20,-13, +-6,11, +14,10, +17,-14, +8,-6, +-12,-7, +-12,-20, +-3,2, +3,10, +-1,-4, +1,-1, +1,7, +-8,-15, +3,4, +0,8, +-6,5, +-6,-7, +16,-2, +-4,6, +-1,2, +5,-10, +-13,15, +6,-12, +-11,1, +-9,4, +12,6, +-1,6, +0,8, +5,-1, +4,-9, +11,0, +5,4, +3,-4, +2,5, +0,-5, +-10,-2, +-3,-10, +9,4, +-2,3, +-2,1, +1,1, +-6,0, +-4,2, +3,-4, +1,1, +-2,6, +6,-1, +1,0, +-3,-1, +6,1, +-2,-1, +-4,-1, +4,0, +-2,0, +-3,-1, +6,0, +-3,0, +-3,0, +6,0, +-3,0, +-3,0, +6,0, +-3,1, +-2,0, +4,0, +-4,1, +-2,1, +6,-1, +-3,1, +1,0, +6,1, +-2,-6, +1,-1, +3,4, +-4,-2, +-6,0, +1,-1, +-2,-1, +-2,-3, +9,-4, +-3,10, +-10,2, +0,5, +2,-5, +3,4, +5,-4, +11,0, +4,9, +5,1, +0,-8, +-1,-6, +12,-6, +-9,-4, +-11,-1, +6,12, +-13,-15, +5,10, +-1,-2, +-4,-6, +16,2, +-6,7, +-6,-5, +0,-8, +3,-4, +-8,15, +1,-7, +1,1, +-1,4, +3,-10, +-3,-2, +-12,20, +-12,7, +8,6, +17,14, +14,-10, +-6,-11, +-20,13, +2,-12, +1,13, +-2,3, +1,-12, +-4,6, +13,5, +-3,-16, +1,-14, +-9,-16, +-4,-22, +12,16, +1,20, +-17,-10, +-13,-37, +-32,-2, +9,5, +-1,5, +-9,-8, +6,14, +3,18, +-32,-7, +-11,-22, +-3,21, +23,22, +-12,-19, +17,-32, +6,7, +0,-4, +39,7, +-7,17, +-4,8, +4,4, +43,-19, +21,18, +-8,-13, +-13,23, +29,7, +44,-7, +23,25, +-6,-2, +11,11, +-6,-9, +-16,-4, +12,-28, +-35,18, +8,-11, +16,31, +34,21, +27,-10, +-15,45, +18,24, +5,11, +1,-7, +-23,-20, +-10,-21, +-26,-12, +-1,-12, +28,4, +0,-12, +-12,-37, +-2,-1, +28,16, +-10,7, +-13,14, +-5,8, +29,-30, +5,-5, +-39,31, +35,-12, +3,-8, +-4,22, +-25,-55, +-11,-31, +-3,-25, +9,-35, +-18,20, +9,14, +6,-40, +-16,-29, +-13,-32, +39,47, +-3,4, +26,10, +44,-13, +5,-16, +41,-36, +-20,-12, +-37,49, +49,8, +-27,21, +15,-5, +-13,36, +28,-73, +11,1, +53,-58, +-29,-6, +32,7, +-57,1, +50,-17, +4,-6, +-17,-21, +-2,-11, +-20,35, +-22,-40, +19,77, +-18,-53, +8,-20, +-40,-24, +24,-20, +32,12, +54,4, +4,-3, +24,-27, +-33,-56, +29,-22, +25,-8, +56,-64, +42,6, +13,19, +27,68, +-34,-17, +8,30, +-29,35, +40,-15, +-3,62, +-77,19, +-24,-66, +4,2, +-46,40, +-28,-51, +-43,17, +46,10, +-1,-6, +10,-18, +25,14, +56,-15, +-52,-25, +66,-54, +-16,8, +-1,-24, +24,56, +34,63, +33,25, +-42,-61, +-96,-2, +-4,-7, +-1,33, +-6,-7, +-22,60, +36,50, +-49,21, +-64,-25, +25,-1, +-34,-17, +3,22, +25,17, +45,-36, +-17,23, +-14,6, +-21,74, +53,-81, +-39,11, +-13,-14, +26,62, +-19,14, +17,104, +43,-46, +-40,-10, +-10,11, +-13,-31, +2,97, +5,61, +47,57, +35,65, +-1,11, +-24,16, +64,-34, +40,-28, +76,33, +63,-65, +12,-27, +35,-16, +-6,13, +99,-53, +0,4, +-25,32, +34,-57, +-7,-10, +17,18, +73,-30, +66,-14, +-2,-48, +29,-53, +-25,-42, +26,42, +15,-59, +4,13, +-27,79, +121,88, +69,50, +5,62, +-99,66, +139,7, +8,-104, +-19,38, +10,-29, +-11,44, +2,35, +-28,-72, +16,138, +61,-27, +1,-6, +22,-32, +6,-24, +-54,14, +-45,48, +-58,-63, +-1,-25, +6,-29, +86,-55, +-75,63, +90,-48, +5,18, +-33,3, +89,114, +-44,-4, +51,-19, +-70,44, +-1,-61, +0,52, +7,39, +38,67, +-56,-131, +-5,-82, +42,19, +106,19, +-13,-25, +-23,148, +67,-51, +35,108, +20,45, +-44,34, +45,-13, +-67,-4, +72,7, +35,-79, +-70,22, +18,4, +-50,87, +24,-46, +23,-32, +-2,18, +-70,-6, +-44,37, +44,-59, +30,-86, +110,81, +-17,-13, +-37,-46, +42,-24, +-71,-21, +-17,14, +63,62, +-73,57, +-81,15, +39,-10, +53,-74, +118,-53, +-70,-24, +99,103, +-66,-2, +38,19, +40,-30, +-10,36, +97,-62, +-22,18, +-66,6, +30,-151, +-35,32, +-88,17, +26,-68, +86,-13, +52,-121, +6,-67, +-71,-19, +5,-36, +-26,81, +13,30, +86,-13, +-66,69, +-21,-17, +-69,57, +7,-64, +-15,78, +29,-40, +-21,-91, +12,24, +-150,31, +-64,22, +8,-150, +88,100, +18,59, +124,61, +2,-43, +58,-260, +62,58, +28,109, +-65,49, +-172,-69, +59,8, +-12,47, +15,-1, +79,-86, +135,-18, +77,-28, +76,-9, +-10,-105, +-41,66, +-105,12, +-38,63, +43,-35, +-69,80, +-27,-53, +-16,-49, +-69,71, +-30,-60, +-65,-77, +-42,83, +69,-47, +-4,-81, +134,126, +22,49, +-53,-31, +-210,-64, +8,-88, +-73,30, +2,19, +16,13, +-57,-90, +42,-41, +-122,68, +-99,-19, +65,-38, +-103,37, +-37,-63, +8,-21, +-12,63, +-39,-43, +-52,26, +-10,67, +59,-6, +18,-33, +-121,-27, +-79,-88, +-3,-68, +27,29, +73,-6, +-4,-52, +-25,115, +127,-93, +-102,44, +-46,-45, +129,-100, +65,-102, +22,-209, +-108,0, +-56,28, +-43,-11, +39,-90, +54,-107, +-111,-40, +115,46, +85,-26, +-39,28, +115,-37, +-1,-8, +69,-72, +107,18, +97,-158, +19,-84, +98,-62, +-31,34, +73,146, +78,14, +3,158, +-151,19, +-165,75, +-32,-63, +-70,-40, +-46,8, +45,-1, +-70,48, +46,15, +-80,2, +-32,-30, +-149,-48, +-24,-45, +85,4, +60,-211, +10,-39, +7,46, +126,-190, +7,-77, +-24,64, +-122,177, +27,103, +-97,-122, +48,-32, +-126,-10, +-46,37, +93,-25, +17,92, +132,74, +-55,-91, +66,22, +151,140, +-39,193, +-4,-61, +-65,-56, +145,115, +-179,137, +51,43, +59,69, +75,-129, +9,52, +114,200, +-2,-46, +142,-100, +22,112, +-18,92, +31,-51, +163,101, +-26,1, +22,20, +-56,1, +109,59, +12,-143, +80,-125, +87,-51, +47,-117, +-201,-83, +-2,-60, +-49,19, +-112,-47, +-63,166, +40,77, +-59,82, +-36,118, +84,32, +27,60, +-20,21, +-8,-50, +-7,72, +-73,22, +18,14, +-36,15, +9,34, +-17,-65, +-118,-50, +-54,34, +-81,28, +-157,-1, +-49,42, +-73,124, +74,20, +1,90, +126,69, +96,94, +65,-182, +139,-57, +119,-23, +-5,-52, +-85,-88, +85,170, +-115,-133, +-11,-105, +0,-27, +-90,12, +-106,-86, +106,-12, +22,-164, +-177,-6, +-64,-55, +80,-66, +45,-131, +-173,106, +-86,-42, +-114,92, +9,-135, +88,148, +-152,-52, +-291,-114, +111,-72, +33,-28, +-102,26, +-37,-222, +-34,29, +-8,54, +-19,6, +105,154, +25,-84, +0,105, +-253,54, +-142,106, +247,-98, +64,-59, +17,-70, +99,11, +107,-69, +146,-107, +-38,38, +72,137, +64,142, +-23,-70, +-36,132, +-4,-63, +-60,17, +26,53, +58,53, +13,78, +24,166, +-182,219, +-14,-19, +-189,-128, +-56,7, +-94,-109, +45,17, +208,-96, +59,-124, +117,-116, +-23,-45, +92,-142, +-14,50, +24,-99, +-37,-97, +14,-19, +-2,-49, +149,81, +147,-97, +-19,8, +-55,167, +103,43, +104,63, +303,-173, +60,-109, +-17,67, +151,33, +-136,4, +56,-128, +-34,68, +15,-40, +-3,-155, +68,77, +114,139, +53,59, +44,67, +-9,-87, +-85,-56, +-4,137, +-14,67, +-9,-67, +-5,53, +52,109, +34,-45, +-24,135, +44,23, +-44,99, +-25,164, +175,-148, +21,67, +-151,92, +111,-110, +17,210, +108,155, +125,166, +-196,-121, +-88,-59, +97,-171, +16,49, +-40,0, +62,57, +76,144, +-39,18, +6,43, +83,97, +-27,6, +-124,27, +111,11, +-203,145, +30,134, +73,-79, +91,-36, +-42,-161, +121,-210, +55,-119, +42,13, +-71,-92, +-34,81, +107,85, +-11,239, +-322,-85, +116,-157, +203,29, +219,-147, +-127,-67, +-209,-143, +61,-49, +-19,-98, +190,191, +-188,150, +-1,91, +184,-84, +-9,57, +-22,-53, +-41,43, +101,52, +-190,146, +69,-49, +-61,22, +-100,-122, +11,20, +-99,129, +108,-51, +176,97, +42,-80, +209,-245, +18,45, +-69,148, +102,-23, +69,55, +126,78, +-45,-36, +-1,-16, +116,-130, +-127,-20, +100,22, +-82,-102, +-120,123, +-39,-194, +199,61, +43,-277, +65,-22, +-12,218, +-155,12, +-86,-30, +0,48, +-29,13, +101,68, +111,-5, +-99,-21, +21,-57, +27,-227, +137,19, +27,69, +-142,98, +75,42, +72,-78, +-41,15, +27,-31, +-197,149, +92,-25, +73,-22, +51,-29, +-53,-100, +62,166, +-31,-97, +-246,48, +52,-96, +-233,-121, +11,23, +-163,32, +45,-167, +-28,-200, +144,151, +234,-1, +8,-12, +-319,-37, +146,-7, +-68,55, +-2,12, +50,143, +-67,-240, +-138,116, +-146,-78, +145,-96, +-123,88, +94,-189, +-41,92, +94,-150, +160,28, +-29,126, +22,151, +-57,29, +-1,53, +107,-27, +115,-114, +-216,-8, +68,-97, +-186,9, +96,137, +-48,-115, +-167,27, +207,128, +6,-220, +97,-65, +-152,-33, +-208,218, +-71,-338, +-203,-179, +-265,0, +85,38, +17,-101, +8,38, +17,-69, +204,49, +49,-67, +105,-150, +22,-169, +-36,-31, +70,-48, +63,9, +-6,7, +-33,-48, +88,-88, +70,-214, +-85,113, +199,-133, +50,-180, +25,-105, +-11,-223, +113,-72, +23,-9, +-167,58, +-40,-133, +-190,-108, +-281,-12, +-28,0, +-157,-15, +86,140, +107,-29, +-115,-20, +11,-48, +-295,-41, +3,41, +-105,7, +149,0, +-23,63, +84,-156, +-287,159, +109,42, +38,-166, +-62,-99, +-21,126, +3,-100, +51,94, +20,138, +3,79, +-223,23, +-110,-51, +-62,96, +9,-59, +-122,95, +160,199, +65,200, +-2,-87, +-237,-202, +-129,15, +-27,26, +141,-145, +-10,119, +215,-174, +8,51, +-77,-165, +93,-37, +60,-22, +-174,-19, +140,-83, +7,317, +-75,34, +36,-32, +147,194, +-41,160, +-139,25, +-94,-40, +-1,-82, +-111,179, +-81,-59, +-2,30, +-320,-122, +164,-132, +138,-165, +55,-191, +88,50, +187,-58, +124,83, +-8,-150, +-27,-110, +13,-201, +-11,9, +126,12, +191,154, +-107,-119, +158,66, +-298,38, +154,38, +-13,97, +-25,20, +159,-92, +28,36, +-64,-139, +28,288, +97,-236, +-11,-1, +365,-142, +-53,-64, +111,-59, +-139,175, +30,-215, +-168,102, +-71,-6, +-45,42, +164,31, +150,-266, +-47,-69, +47,-71, +-109,-170, +-77,20, +-67,-51, +371,76, +37,14, +-84,-42, +68,-1, +-10,87, +166,-79, +302,66, +15,146, +96,49, +-4,-164, +-42,69, +-26,-43, +-22,98, +93,-110, +58,-121, +-118,220, +-79,-25, +-27,-138, +6,-1, +117,131, +166,-108, +-43,-73, +-15,8, +190,55, +59,180, +64,40, +140,41, +-92,-77, +-277,-2, +-9,-87, +-184,9, +-53,-271, +-48,-205, +-215,194, +167,-62, +3,127, +100,36, +4,-1, +50,12, +-177,-29, +36,-110, +-68,-331, +-67,-164, +-10,53, +-133,84, +118,-168, +-79,-262, +116,-129, +-122,199, +-145,-165, +38,-94, +-75,-121, +34,-30, +193,-29, +181,-101, +-209,59, +-113,-208, +131,261, +91,186, +-160,-34, +-99,-11, +18,68, +56,-63, +-153,81, +106,81, +275,293, +136,63, +-263,-9, +-49,-56, +118,-24, +181,97, +192,53, +87,-102, +-35,40, +14,-119, +24,85, +-17,28, +6,-111, +-147,106, +124,135, +2,81, +52,-117, +-5,-246, +-182,-73, +-118,147, +-104,168, +-105,-21, +146,27, +34,-3, +-89,-69, +30,96, +22,33, +-239,-29, +310,19, +78,123, +-249,-92, +87,34, +128,-164, +-202,33, +191,174, +-83,-195, +38,234, +-117,128, +161,2, +64,46, +153,-178, +166,8, +-80,13, +-125,-223, +-13,-189, +0,-140, +84,-46, +-110,-159, +106,105, +-291,273, +-94,-6, +-57,-125, +224,-20, +9,69, +-35,23, +195,214, +-115,121, +-86,-122, +106,77, +149,-136, +166,-178, +-169,56, +50,-178, +-27,-58, +-7,82, +-152,-7, +4,44, +65,109, +-103,-238, +-126,15, +132,-57, +-86,-197, +11,0, +-84,11, +-9,-205, +-35,-287, +-77,-101, +-56,-77, +106,142, +-68,-209, +58,-83, +13,49, +-55,-110, +-77,-191, +74,34, +-116,58, +-96,289, +134,320, +65,-14, +166,77, +39,140, +-42,-117, +-81,-149, +242,14, +-38,157, +29,-12, +-18,-86, +33,-88, +-157,62, +44,-261, +130,-191, +-233,-82, +133,115, +-92,-104, +55,197, +-114,-2, +23,-1, +107,-53, +-37,-191, +-173,74, +-92,-37, +292,-19, +-30,-113, +-63,-13, +215,218, +157,139, +19,-253, +-96,-21, +223,-89, +133,-25, +-40,54, +77,-110, +-109,-74, +-151,248, +-140,254, +47,15, +17,-146, +78,57, +44,123, +10,124, +189,43, +262,147, +157,5, +-128,48, +-10,-64, +-211,-67, +17,112, +172,79, +-14,56, +69,-89, +108,22, +65,147, +68,2, +117,19, +170,19, +-56,-158, +102,354, +-214,44, +67,89, +64,-73, +82,165, +137,-12, +-223,-216, +-182,-51, +-9,-35, +-179,82, +116,-91, +32,-46, +-223,54, +191,36, +351,18, +68,-80, +-201,-151, +-51,161, +-89,-51, +39,-200, +-288,14, +-23,-19, +-127,71, +64,231, +97,18, +46,-171, +63,48, +-223,-53, +40,-85, +4,102, +293,-59, +15,-17, +40,-61, +55,40, +94,243, +-187,274, +-15,-90, +91,76, +-48,10, +-110,-148, +-3,53, +-132,-20, +-114,100, +35,-124, +100,43, +123,-75, +-144,104, +41,-127, +-141,244, +113,14, +22,-4, +109,-94, +99,-61, +122,145, +45,93, +7,-27, +-144,-107, +305,-33, +-3,9, +-260,-12, +-9,-88, +109,-8, +-206,130, +-88,-189, +89,-34, +-87,219, +126,-142, +29,149, +122,-101, +-18,117, +-125,116, +161,-172, +-157,284, +224,-128, +40,198, +131,-109, +-25,121, +116,109, +26,239, +-63,14, +-71,65, +-45,19, +3,-161, +130,101, +127,-166, +247,14, +186,180, +-17,84, +8,83, +-61,-63, +-53,74, +-166,-78, +-188,119, +-124,70, +-59,-67, +-158,10, +-14,219, +-80,106, +-259,-77, +55,51, +-94,0, +31,353, +95,44, +-46,-72, +53,56, +137,-76, +22,-185, +-176,57, +177,303, +-57,-32, +-63,163, +-271,103, +85,33, +-23,102, +64,-18, +241,-67, +-76,-112, +76,113, +235,10, +-177,110, +25,44, +136,81, +-17,276, +-64,77, +0,68, +25,-232, +-50,87, +99,-127, +-45,146, +78,-283, +64,-130, +11,-100, +-67,-25, +-23,-218, +107,10, +168,-126, +-22,6, +-142,126, +-58,-10, +-8,-64, +206,-114, +236,-46, +-136,123, +-39,-15, +83,-202, +-79,18, +125,-12, +167,-109, +83,58, +40,36, +32,-59, +-100,4, +-17,84, +43,-45, +-11,-158, +266,149, +-90,10, +111,38, +-115,61, +39,-54, +-135,185, +-213,7, +27,-45, +-38,-193, +-118,-75, +110,-154, +-160,117, +-236,58, +-148,-73, +-138,-31, +5,141, +95,-191, +-8,52, +-92,-38, +-183,59, +-79,-34, +-45,-44, +-116,-209, +233,-180, +17,24, +-84,-147, +-193,-122, +11,-89, +50,-127, +-128,82, +-54,-61, +13,-32, +-64,-124, +-334,-130, +-54,135, +-14,-111, +108,138, +90,-59, +-23,12, +212,68, +142,111, +68,196, +21,25, +-185,-266, +-49,165, +-247,26, +-75,120, +264,9, +-81,-97, +9,98, +153,179, +-188,-46, +-62,142, +187,-25, +-84,-17, +36,11, +-5,137, +-77,-36, +20,-66, +68,-286, +65,-84, +-32,179, +2,142, +-184,-56, +120,145, +4,110, +69,65, +43,-51, +-88,-134, +28,-19, +202,32, +18,-131, +-78,18, +-46,-49, +-172,-142, +14,31, +2,-159, +-252,95, +101,157, +-166,173, +-14,-119, +-83,-76, +0,-22, +28,-54, +44,-24, +-177,-21, +56,127, +2,-83, +233,-126, +69,56, +-111,-63, +-59,49, +-87,94, +-21,160, +99,-121, +-83,124, +85,-265, +-117,27, +83,-7, +-103,68, +-19,114, +-109,-44, +48,-175, +-37,-50, +-13,-291, +90,-36, +-23,53, +-118,155, +39,29, +58,8, +-118,2, +2,9, +-195,178, +254,130, +29,2, +80,224, +41,-32, +5,53, +75,62, +-3,119, +49,60, +2,159, +40,-34, +65,-73, +-37,-153, +-51,131, +111,-39, +-134,-38, +-19,-184, +82,-212, +240,93, +-97,-120, +42,143, +152,-41, +61,-168, +-64,17, +17,283, +151,-17, +-43,-77, +-7,-82, +207,160, +-171,186, +-26,8, +-33,168, +-103,-43, +-112,62, +-204,254, +-2,240, +-188,106, +4,-47, +-30,113, +124,17, +35,-94, +-9,228, +50,145, +61,-39, +110,-118, +35,117, +95,53, +-55,-83, +-125,-88, +45,80, +45,178, +57,-66, +183,-61, +22,185, +-71,-98, +-20,3, +23,-105, +143,64, +-132,-20, +43,-17, +-12,135, +8,58, +-150,-14, +130,-40, +168,44, +49,40, +9,-72, +14,5, +142,-23, +0,77, +-118,-3, +-122,-35, +-81,261, +228,-33, +-62,43, +-17,-26, +-24,59, +-103,-36, +34,19, +-53,-161, +4,90, +-65,-26, +-67,-1, +-158,25, +9,0, +69,-230, +-36,235, +-220,131, +-22,-71, +-2,58, +-112,-53, +111,86, +101,-58, +80,62, +-49,52, +21,162, +-114,119, +9,11, +-37,-160, +61,-57, +-24,26, +19,55, +-292,47, +18,-96, +23,-97, +37,-123, +43,-121, +80,119, +-7,-45, +75,148, +-31,-2, +107,10, +-106,-32, +-29,121, +-156,-21, +-123,50, +26,-60, +-44,-9, +-32,130, +310,18, +89,-74, +107,-212, +149,-125, +-73,74, +-86,-50, +80,44, +52,220, +-74,113, +-123,-154, +198,66, +-79,-133, +28,-61, +93,34, +-119,-86, +107,-110, +-82,249, +-123,-81, +-110,56, +-70,-49, +3,-4, +9,-84, +-10,-74, +4,183, +16,-114, +116,-132, +-135,90, +-79,-117, +-14,48, +-7,21, +111,-26, +118,4, +24,-91, +84,251, +97,60, +-27,-2, +11,82, +24,-81, +156,134, +-39,-8, +40,9, +-45,-127, +-39,-50, +100,93, +45,12, +33,81, +-128,97, +-3,174, +149,-32, +55,-53, +32,-13, +-7,-44, +-39,39, +41,-33, +-58,-11, +-69,139, +34,77, +83,5, +181,-59, +6,-79, +70,151, +47,33, +-26,-29, +-107,-6, +-62,-34, +124,62, +-49,30, +108,144, +-61,-83, +38,14, +140,109, +54,33, +132,55, +-167,118, +36,61, +86,36, +-114,-18, +73,-121, +-51,-38, +-82,10, +-42,97, +30,-52, +87,15, +-180,18, +-9,-37, +91,-10, +-185,-131, +189,-144, +20,45, +-8,-85, +-67,70, +-10,-14, +-63,-3, +-19,70, +-105,-19, +21,67, +13,-171, +196,71, +70,106, +-47,-139, +9,-8, +-21,113, +-234,49, +-95,174, +121,138, +-4,79, +40,-84, +6,0, +-90,-49, +121,-158, +13,-76, +7,50, +-17,-94, +73,138, +-23,-34, +148,16, +-63,84, +-13,29, +-103,-10, +-127,112, +-23,-115, +6,-96, +52,-116, +27,92, +-61,-42, +-97,43, +-38,-53, +149,-33, +85,-47, +65,34, +23,-16, +19,155, +-62,25, +134,-45, +-110,-18, +4,-29, +173,-131, +13,-85, +4,115, +-116,-42, +52,-94, +2,-63, +12,-28, +-37,-50, +33,50, +-126,-79, +53,2, +19,-32, +7,-77, +-53,79, +131,24, +12,60, +106,-156, +-36,-79, +-3,40, +84,38, +-81,75, +-15,-37, +32,41, +14,152, +-17,31, +-18,-31, +61,-74, +57,74, +31,-64, +-29,17, +0,-13, +40,107, +-157,-55, +91,-67, +16,75, +-4,64, +-17,68, +63,48, +102,-14, +-69,-45, +-83,-43, +78,30, +42,83, +-52,13, +-59,83, +151,15, +77,-10, +9,48, +-22,36, +52,49, +36,-89, +-9,-14, +208,-117, +160,-26, +-2,-150, +49,-38, +13,15, +98,-115, +54,24, +112,8, +5,65, +-155,-23, +100,35, +112,83, +14,-81, +-81,27, +-14,146, +-5,-41, +92,3, +-119,88, +-20,120, +-116,-100, +-106,14, +90,-11, +-18,8, +-24,-21, +-100,18, +42,38, +30,11, +81,-5, +51,46, +51,-4, +-16,40, +80,13, +5,10, +102,118, +43,-15, +66,75, +68,-157, +-36,15, +-4,33, +57,-24, +43,-28, +72,-11, +-77,15, +-73,25, +-139,-12, +-10,-31, +-44,23, +16,-91, +96,13, +5,-28, +-104,35, +57,-78, +-140,76, +75,-24, +31,1, +60,-5, +3,-89, +30,-27, +-51,52, +-18,61, +-26,94, +-7,-74, +72,0, +-62,-41, +-27,40, +19,2, +-72,-37, +-39,-63, +65,43, +124,-123, +-30,27, +21,-67, +-79,-32, +-15,16, +-24,-109, +-41,-27, +4,68, +-35,27, +-1,36, +-35,0, +-62,-42, +38,46, +95,75, +-3,-74, +37,36, +45,-61, +70,-16, +-23,48, +-114,48, +-99,-44, +67,13, +7,7, +18,-66, +-3,75, +14,13, +-16,-39, +88,-8, +6,-9, +42,17, +23,34, +-58,9, +38,42, +126,-101, +-90,-113, +11,38, +-29,-74, +45,38, +113,121, +5,8, +-33,54, +58,22, +-38,19, +43,48, +-23,-82, +11,-91, +-88,-66, +-32,34, +48,-43, +-64,-40, +18,14, +-45,1, +-99,-61, +3,-73, +-28,67, +-74,20, +-66,25, +-30,-66, +-8,-24, +0,-42, +51,-85, +-83,34, +29,34, +-9,-28, +1,-12, +-17,-80, +27,-109, +4,-9, +4,-20, +-84,-3, +-43,-18, +-37,-19, +41,-42, +2,-68, +55,-12, +-20,33, +0,-71, +65,91, +-15,-8, +-14,59, +-27,3, +25,-30, +4,-3, +-19,-5, +19,7, +-2,43, +-13,64, +-9,8, +-22,25, +-26,-8, +-33,-19, +32,-1, +22,27, +-67,95, +-34,17, +44,-64, +-2,-15, +2,-4, +13,23, +-77,67, +-9,-11, +-35,-45, +-23,26, +-73,29, +-16,-19, +-63,44, +72,-10, +-60,-3, +-13,11, +-29,6, +79,-44, +33,20, +53,44, +25,-36, +-9,15, +51,17, +3,30, +-19,19, +-35,11, +23,58, +-6,4, +29,-33, +50,2, +-8,-97, +55,46, +43,6, +28,-19, +-47,-15, +-21,55, +2,0, +-9,1, +27,18, +46,1, +72,6, +-47,-39, +5,-15, +37,-53, +36,-10, +17,-6, +-17,-56, +13,-13, +23,-41, +10,-61, +-26,-10, +31,7, +-16,-36, +43,26, +41,41, +-14,42, +-2,59, +-30,14, +14,2, +-26,-3, +12,-23, +37,-19, +12,18, +65,11, +-3,15, +13,0, +-18,57, +66,-14, +-45,38, +53,-32, +-16,18, +6,-17, +47,6, +-56,52, +42,-24, +11,20, +-9,6, +-13,-30, +-6,-22, +21,9, +-23,-3, +-12,-47, +15,4, +-15,33, +-21,20, +-3,-47, +21,35, +17,26, +4,5, +-28,25, +-10,26, +36,-23, +-5,24, +33,-33, +-28,-1, +18,6, +-12,32, +-3,-4, +-10,-20, +34,-12, +-28,-18, +-4,-8, +6,-7, +-14,8, +19,-1, +23,-18, +45,-10, +15,35, +-15,-11, +-14,13, +18,31, +-12,33, +-1,-39, +3,9, +-17,-17, +-7,11, +1,24, +22,-4, +22,-5, +0,-24, +-16,-8, +-9,-38, +-10,24, +3,-23, +10,-34, +-33,22, +3,49, +22,4, +-11,0, +-3,-9, +4,0, +-15,13, +16,-33, +-15,-17, +-27,-5, +2,-16, +15,29, +2,16, +-13,-22, +42,11, +-2,-15, +16,8, +-12,11, +-2,21, +13,-1, +5,10, +4,17, +-2,-5, +-4,10, +17,13, +5,-4, +-4,-8, +-6,-16, +0,2, +10,4, +1,30, +14,14, +6,0, +11,6, +5,4, +-10,3, +-5,2, +28,-6, +15,-20, +-7,2, +-3,-3, +-1,1, +-2,11, +1,10, +-14,1, +-5,-7, +1,18, +16,9, +2,-4, +-10,4, +-2,7, +5,6, +-8,-16, +2,-2, +-9,9, +-3,-2, +10,-3, +-3,-2, +6,6, +-1,-10, +0,6, +-11,-4, +-6,1, +-4,2, +2,-7, +-6,4, +-1,0, +6,0, +1,2, +-7,6, +0,-8, +3,3, +0,7, +3,0, +5,1, +6,3, +4,-6, +-2,-1, +-2,5, +-1,-6, +0,0, +-1,5, +-1,-4, +-1,0, +1,5, +-2,-5, +-1,0, +0,5, +0,-5, +0,0, +0,5, +0,-5, +-1,0, +-2,5, +1,-5, +-1,0, +-1,4, +-1,-5, +0,0, +-1,6, +-2,-5, +-2,1, +4,6, +6,-3, +5,-1, +3,0, +0,-7, +3,-3, +0,8, +-7,-6, +1,-2, +6,0, +-1,0, +-6,-4, +2,7, +-4,-2, +-6,-1, +-11,4, +0,-6, +-1,10, +6,-6, +-3,2, +10,3, +-3,2, +-9,-9, +2,2, +-8,16, +5,-6, +-2,-7, +-10,-4, +2,4, +16,-9, +1,-18, +-5,7, +-14,-1, +1,-10, +-2,-11, +-1,-1, +-3,3, +-7,-2, +15,20, +28,6, +-5,-2, +-10,-3, +5,-4, +11,-6, +6,0, +14,-14, +1,-30, +10,-4, +0,-2, +-6,16, +-4,8, +5,4, +17,-13, +-4,-10, +-2,5, +4,-17, +5,-10, +13,1, +-2,-21, +-12,-11, +16,-8, +-2,15, +42,-11, +-13,22, +2,-16, +15,-29, +2,16, +-27,5, +-15,17, +16,33, +-15,-13, +4,0, +-3,9, +-11,0, +22,-4, +3,-49, +-33,-22, +10,34, +3,23, +-10,-24, +-9,38, +-16,8, +0,24, +22,5, +22,4, +1,-24, +-7,-11, +-17,17, +3,-9, +-1,39, +-12,-33, +18,-31, +-14,-13, +-15,11, +15,-35, +45,10, +23,18, +19,1, +-14,-8, +6,7, +-4,8, +-28,18, +34,12, +-10,20, +-3,4, +-12,-32, +18,-6, +-28,1, +33,33, +-5,-24, +36,23, +-10,-26, +-28,-25, +4,-5, +17,-26, +21,-35, +-3,47, +-21,-20, +-15,-33, +15,-4, +-12,47, +-23,3, +21,-9, +-6,22, +-13,30, +-9,-6, +11,-20, +42,24, +-56,-52, +47,-6, +6,17, +-16,-18, +53,32, +-45,-38, +66,14, +-18,-57, +13,0, +-3,-15, +65,-11, +12,-18, +37,19, +12,23, +-26,3, +14,-2, +-30,-14, +-2,-59, +-14,-42, +41,-41, +43,-26, +-16,36, +31,-7, +-26,10, +10,61, +23,41, +13,13, +-17,56, +17,6, +36,10, +37,53, +5,15, +-47,39, +72,-6, +46,-1, +27,-18, +-9,-1, +2,0, +-21,-55, +-47,15, +28,19, +43,-6, +55,-46, +-8,97, +50,-2, +29,33, +-6,-4, +23,-58, +-35,-11, +-19,-19, +3,-30, +51,-17, +-9,-15, +25,36, +53,-44, +33,-20, +79,44, +-29,-6, +-13,-11, +-60,3, +72,10, +-63,-44, +-16,19, +-73,-29, +-23,-26, +-35,45, +-9,11, +-77,-67, +13,-23, +2,4, +-2,15, +44,64, +-34,-17, +-67,-95, +22,-27, +32,1, +-33,19, +-26,8, +-22,-25, +-9,-8, +-13,-64, +-2,-43, +19,-7, +-19,5, +4,3, +25,30, +-27,-3, +-14,-59, +-15,8, +65,-91, +0,71, +-20,-33, +55,12, +2,68, +41,42, +-37,19, +-43,18, +-84,3, +4,20, +4,9, +27,109, +-17,80, +1,12, +-9,28, +29,-34, +-83,-34, +51,85, +0,42, +-8,24, +-30,66, +-66,-25, +-74,-20, +-28,-67, +3,73, +-99,61, +-45,-1, +18,-14, +-64,40, +48,43, +-32,-34, +-88,66, +11,91, +-23,82, +43,-48, +-38,-19, +58,-22, +-33,-54, +5,-8, +113,-121, +45,-38, +-29,74, +11,-38, +-90,113, +126,101, +38,-42, +-58,-9, +23,-34, +42,-17, +6,9, +88,8, +-16,39, +14,-13, +-3,-75, +18,66, +7,-7, +67,-13, +-99,44, +-114,-48, +-23,-48, +70,16, +45,61, +37,-36, +-3,74, +95,-75, +38,-46, +-62,42, +-35,0, +-1,-36, +-35,-27, +4,-68, +-41,27, +-24,109, +-15,-16, +-79,32, +21,67, +-30,-27, +124,123, +65,-43, +-39,63, +-72,37, +19,-2, +-27,-40, +-62,41, +72,0, +-7,74, +-26,-94, +-18,-61, +-51,-52, +30,27, +3,89, +60,5, +31,-1, +75,24, +-140,-76, +57,78, +-104,-35, +5,28, +96,-13, +16,91, +-44,-23, +-10,31, +-139,12, +-73,-25, +-77,-15, +72,11, +43,28, +57,24, +-4,-33, +-36,-15, +68,157, +66,-75, +43,15, +102,-118, +5,-10, +80,-13, +-16,-40, +51,4, +51,-46, +81,5, +30,-11, +42,-38, +-100,-18, +-24,21, +-18,-8, +90,11, +-106,-14, +-116,100, +-20,-120, +-119,-88, +92,-3, +-5,41, +-14,-146, +-81,-27, +14,81, +112,-83, +100,-35, +-155,23, +5,-65, +112,-8, +54,-24, +98,115, +13,-15, +49,38, +-2,150, +160,26, +208,117, +-9,14, +36,89, +52,-49, +-22,-36, +9,-48, +77,10, +151,-15, +-59,-83, +-52,-13, +42,-83, +78,-30, +-83,43, +-69,45, +102,14, +63,-48, +-17,-68, +-4,-64, +16,-75, +91,67, +-157,55, +40,-107, +0,13, +-29,-17, +31,64, +57,-74, +61,74, +-18,31, +-17,-31, +14,-152, +32,-41, +-15,37, +-81,-75, +84,-38, +-3,-40, +-36,79, +106,156, +12,-60, +131,-24, +-53,-79, +7,77, +19,32, +53,-2, +-126,79, +33,-50, +-37,50, +12,28, +2,63, +52,94, +-116,42, +4,-115, +13,85, +173,131, +4,29, +-110,18, +134,45, +-62,-25, +19,-155, +23,16, +65,-34, +85,47, +149,33, +-38,53, +-97,-43, +-61,42, +27,-92, +52,116, +6,96, +-23,115, +-127,-112, +-103,10, +-13,-29, +-63,-84, +148,-16, +-23,34, +73,-138, +-17,94, +7,-50, +13,76, +121,158, +-90,49, +6,0, +40,84, +-4,-79, +121,-138, +-95,-174, +-234,-49, +-21,-113, +9,8, +-47,139, +70,-106, +196,-71, +13,171, +21,-67, +-105,19, +-19,-70, +-63,3, +-10,14, +-67,-70, +-8,85, +20,-45, +189,144, +-185,131, +91,10, +-9,37, +-180,-18, +87,-15, +30,52, +-42,-97, +-82,-10, +-51,38, +73,121, +-114,18, +86,-36, +36,-61, +-167,-118, +132,-55, +54,-33, +140,-109, +38,-14, +-61,83, +108,-144, +-49,-30, +124,-62, +-62,34, +-107,6, +-26,29, +47,-33, +70,-151, +6,79, +181,59, +83,-5, +34,-77, +-69,-139, +-58,11, +41,33, +-39,-39, +-7,44, +32,13, +55,53, +149,32, +-3,-174, +-128,-97, +33,-81, +45,-12, +100,-93, +-39,50, +-45,127, +40,-9, +-39,8, +156,-134, +24,81, +11,-82, +-27,2, +97,-60, +84,-251, +24,91, +118,-4, +111,26, +-7,-21, +-14,-48, +-79,117, +-135,-90, +116,132, +16,114, +4,-183, +-10,74, +9,84, +3,4, +-70,49, +-110,-56, +-123,81, +-82,-249, +107,110, +-119,86, +93,-34, +28,61, +-79,133, +198,-66, +-123,154, +-74,-113, +52,-220, +80,-44, +-86,50, +-73,-74, +149,125, +107,212, +89,74, +310,-18, +-32,-130, +-44,9, +26,60, +-123,-50, +-156,21, +-29,-121, +-106,32, +107,-10, +-31,2, +75,-148, +-7,45, +80,-119, +43,121, +37,123, +23,97, +18,96, +-292,-47, +19,-55, +-24,-26, +61,57, +-37,160, +9,-11, +-114,-119, +21,-162, +-49,-52, +80,-62, +101,58, +111,-86, +-112,53, +-2,-58, +-22,71, +-220,-131, +-36,-235, +69,230, +9,0, +-158,-25, +-67,1, +-65,26, +4,-90, +-53,161, +34,-19, +-103,36, +-24,-59, +-17,26, +-62,-43, +228,33, +-81,-261, +-122,35, +-118,3, +0,-77, +142,23, +14,-5, +9,72, +49,-40, +168,-44, +130,40, +-150,14, +8,-58, +-12,-135, +43,17, +-132,20, +143,-64, +23,105, +-20,-3, +-71,98, +22,-185, +183,61, +57,66, +45,-178, +45,-80, +-125,88, +-55,83, +95,-53, +35,-117, +110,118, +61,39, +50,-145, +-9,-228, +35,94, +124,-17, +-30,-113, +4,47, +-188,-106, +-2,-240, +-204,-254, +-112,-62, +-103,43, +-33,-168, +-26,-8, +-171,-186, +207,-160, +-7,82, +-43,77, +151,17, +17,-283, +-64,-17, +61,168, +152,41, +42,-143, +-97,120, +240,-93, +82,212, +-19,184, +-134,38, +111,39, +-51,-131, +-37,153, +65,73, +40,34, +2,-159, +49,-60, +-3,-119, +75,-62, +5,-53, +41,32, +80,-224, +29,-2, +254,-130, +-195,-178, +2,-9, +-118,-2, +58,-8, +39,-29, +-118,-155, +-23,-53, +90,36, +-13,291, +-37,50, +48,175, +-109,44, +-19,-114, +-103,-68, +83,7, +-117,-27, +85,265, +-83,-124, +99,121, +-21,-160, +-87,-94, +-59,-49, +-111,63, +69,-56, +233,126, +2,83, +56,-127, +-177,21, +44,24, +28,54, +0,22, +-83,76, +-14,119, +-166,-173, +101,-157, +-252,-95, +2,159, +14,-31, +-172,142, +-46,49, +-78,-18, +18,131, +202,-32, +28,19, +-88,134, +43,51, +69,-65, +4,-110, +120,-145, +-184,56, +2,-142, +-32,-179, +65,84, +68,286, +20,66, +-77,36, +-5,-137, +36,-11, +-84,17, +187,25, +-62,-142, +-188,46, +153,-179, +9,-98, +-81,97, +264,-9, +-75,-120, +-247,-26, +-49,-165, +-185,266, +21,-25, +68,-196, +142,-111, +212,-68, +-23,-12, +90,59, +108,-138, +-14,111, +-54,-135, +-334,130, +-64,124, +13,32, +-54,61, +-128,-82, +50,127, +11,89, +-193,122, +-84,147, +17,-24, +233,180, +-116,209, +-45,44, +-79,34, +-183,-59, +-92,38, +-8,-52, +95,191, +5,-141, +-138,31, +-148,73, +-236,-58, +-160,-117, +110,154, +-118,75, +-38,193, +27,45, +-213,-7, +-135,-185, +39,54, +-115,-61, +111,-38, +-90,-10, +266,-149, +-11,158, +43,45, +-17,-84, +-100,-4, +32,59, +40,-36, +83,-58, +167,109, +125,12, +-79,-18, +83,202, +-39,15, +-136,-123, +236,46, +206,114, +-8,64, +-58,10, +-142,-126, +-22,-6, +168,126, +107,-10, +-23,218, +-67,25, +11,100, +64,130, +78,283, +-45,-146, +99,127, +-50,-87, +25,232, +0,-68, +-64,-77, +-17,-276, +136,-81, +25,-44, +-177,-110, +235,-10, +76,-113, +-76,112, +241,67, +64,18, +-23,-102, +85,-33, +-271,-103, +-63,-163, +-57,32, +177,-303, +-176,-57, +22,185, +137,76, +53,-56, +-46,72, +95,-44, +31,-353, +-94,0, +55,-51, +-259,77, +-80,-106, +-14,-219, +-158,-10, +-59,67, +-124,-70, +-188,-119, +-166,78, +-53,-74, +-61,63, +8,-83, +-17,-84, +186,-180, +247,-14, +127,166, +130,-101, +3,161, +-45,-19, +-71,-65, +-63,-14, +26,-239, +116,-109, +-25,-121, +131,109, +40,-198, +224,128, +-157,-284, +161,172, +-125,-116, +-18,-117, +122,101, +29,-149, +126,142, +-87,-219, +89,34, +-88,189, +-206,-130, +109,8, +-9,88, +-260,12, +-3,-9, +305,33, +-144,107, +7,27, +45,-93, +122,-145, +99,61, +109,94, +22,4, +113,-14, +-141,-244, +41,127, +-144,-104, +123,75, +100,-43, +35,124, +-114,-100, +-132,20, +-3,-53, +-110,148, +-48,-10, +91,-76, +-15,90, +-187,-274, +94,-243, +55,-40, +40,61, +15,17, +293,59, +4,-102, +40,85, +-223,53, +63,-48, +46,171, +97,-18, +64,-231, +-127,-71, +-23,19, +-288,-14, +39,200, +-89,51, +-51,-161, +-201,151, +68,80, +351,-18, +191,-36, +-223,-54, +32,46, +116,91, +-179,-82, +-9,35, +-182,51, +-223,216, +137,12, +82,-165, +64,73, +67,-89, +-214,-44, +102,-354, +-56,158, +170,-19, +117,-19, +68,-2, +65,-147, +108,-22, +69,89, +-14,-56, +172,-79, +17,-112, +-211,67, +-10,64, +-128,-48, +157,-5, +262,-147, +189,-43, +10,-124, +44,-123, +78,-57, +17,146, +47,-15, +-140,-254, +-151,-248, +-109,74, +77,110, +-40,-54, +133,25, +223,89, +-96,21, +19,253, +157,-139, +215,-218, +-63,13, +-30,113, +292,19, +-92,37, +-173,-74, +-37,191, +107,53, +23,1, +-114,2, +55,-197, +-92,104, +133,-115, +-233,82, +130,191, +44,261, +-157,-62, +33,88, +-18,86, +29,12, +-38,-157, +242,-14, +-81,149, +-42,117, +39,-140, +166,-77, +65,14, +134,-320, +-96,-289, +-116,-58, +74,-34, +-77,191, +-55,110, +13,-49, +58,83, +-68,209, +106,-142, +-56,77, +-77,101, +-35,287, +-9,205, +-84,-11, +11,0, +-17,-72, +-43,-147, +120,90, +321,-12, +-95,-114, +208,-261, +16,-94, +-81,-9, +-26,154, +48,-103, +-28,-22, +-154,35, +143,248, +-70,-121, +114,-26, +78,27, +84,-24, +-51,-65, +-54,38, +50,149, +209,-16, +1,-37, +155,22, +-251,-190, +-270,-61, +111,-26, +145,-46, +-267,-68, +163,21, +-59,55, +-118,52, +1,-89, +273,14, +145,-16, +-74,114, +-34,-339, +1,50, +-72,76, +160,78, +-92,24, +24,248, +164,146, +-79,99, +-279,170, +160,-40, +114,217, +155,-143, +74,69, +-60,-196, +66,-134, +78,-90, +42,166, +-273,-153, +-138,-69, +8,-21, +63,-50, +90,-49, +157,-40, +238,-133, +-70,33, +273,-12, +-89,203, +57,118, +-12,-224, +78,-83, +-120,155, +-10,31, +-132,197, +60,158, +-197,22, +-21,183, +28,-69, +-6,122, +223,-109, +143,19, +78,50, +-120,131, +5,21, +76,-191, +-23,11, +63,214, +-126,143, +-179,-187, +-174,158, +-93,118, +47,-93, +-46,-2, +34,183, +51,96, +28,-163, +52,-25, +-4,65, +-111,77, +-63,122, +-34,228, +121,-41, +77,-2, +-140,-295, +171,51, +40,5, +-154,-111, +197,-179, +135,-254, +125,-248, +-124,-104, +-59,104, +221,-43, +88,83, +60,-140, +-47,-55, +91,56, +-28,-147, +36,-113, +-67,-168, +-130,-197, +42,-206, +86,191, +72,-179, +44,46, +159,36, +-118,51, +20,-26, +-92,1, +-170,120, +110,184, +145,-85, +-198,1, +296,90, +-9,60, +139,26, +-33,-134, +54,27, +131,307, +118,-111, +-184,-55, +-43,-269, +-112,-91, +-26,-146, +-61,108, +3,183, +-137,226, +-235,70, +-150,-84, +-158,-155, +56,-15, +119,-91, +-113,10, +-304,-17, +-14,-78, +-174,-10, +-109,-219, +87,101, +-153,-102, +-193,49, +111,196, +33,-59, +-46,81, +-162,-10, +-52,-50, +92,-51, +61,15, +138,26, +132,181, +47,137, +-41,-18, +-47,21, +-96,-63, +-31,-197, +-128,-169, +68,4, +78,92, +60,106, +271,186, +18,112, +-31,-229, +96,-12, +-116,-126, +26,-6, +8,2, +65,-126, +-115,-280, +103,-2, +142,-206, +82,96, +-75,-201, +-84,68, +-129,76, +-72,-121, +257,52, +91,-19, +49,209, +218,-146, +-196,-6, +3,4, +20,157, +147,-61, +56,-83, +-170,34, +-30,-152, +187,-57, +-14,-127, +43,3, +26,-147, +215,-19, +-77,44, +-283,-104, +118,-63, +-56,190, +29,22, +-110,261, +-34,-275, +-45,49, +22,237, +-138,9, +118,32, +-24,-52, +-64,-110, +17,-133, +-122,25, +59,-66, +81,81, +50,265, +-108,203, +7,-66, +72,158, +82,128, +149,6, +-154,136, +-199,245, +33,105, +204,-29, +123,-77, +-160,218, +-53,-61, +266,-47, +-60,13, +17,-94, +143,-5, +-198,185, +127,-32, +-54,-140, +-70,-11, +-130,50, +-156,72, +5,-75, +-180,180, +66,-113, +-81,156, +-43,-87, +25,-46, +-48,-43, +188,-101, +45,-47, +-64,178, +118,70, +3,-205, +-277,-15, +-78,54, +-122,-57, +-129,126, +48,-76, +-18,-115, +22,-58, +-109,37, +63,80, +-134,88, +-51,214, +119,-220, +-142,122, +119,53, +-17,-18, +-117,175, +-23,-164, +-75,59, +144,70, +109,-22, +-103,-56, +91,-225, +-136,-80, +-144,-82, +-106,172, +20,142, +-68,119, +-254,-50, +47,-205, +-56,-113, +-73,-42, +82,2, +77,-181, +138,56, +30,-47, +-28,-16, +-146,163, +-28,-31, +-200,157, +-68,-65, +259,32, +60,40, +-104,-146, +-241,-149, +8,80, +52,-35, +-146,-89, +-126,-109, +-236,-90, +80,-96, +-177,-67, +97,-105, +-107,46, +152,-29, +166,57, +284,8, +103,-63, +-100,118, +-128,4, +5,143, +82,-24, +-201,-1, +-44,-93, +77,-85, +33,0, +-137,12, +-200,-129, +39,-85, +-136,4, +51,-200, +-36,56, +-64,69, +-110,70, +125,13, +173,4, +5,-33, +-189,15, +-55,190, +-8,94, +309,-91, +-265,-156, +-93,191, +-14,56, +-1,15, +-28,-45, +39,101, +-22,-94, +53,-57, +-27,-144, +86,-61, +-46,-1, +99,-28, +-70,192, +-145,185, +-135,-49, +1,-45, +-19,21, +55,101, +-95,-48, +-58,69, +-84,45, +-38,181, +34,84, +-75,125, +19,82, +87,-145, +-64,61, +-82,-273, +-29,86, +-33,38, +-178,-19, +18,-87, +-214,-54, +-84,-258, +77,56, +-49,-58, +28,93, +-102,74, +175,139, +-204,-226, +92,182, +-212,-4, +-114,-87, +160,36, +123,87, +-138,-57, +17,25, +67,68, +107,78, +235,6, +-141,91, +83,16, +82,-62, +44,-53, +-59,162, +147,-15, +-89,50, +107,-5, +33,-89, +96,-34, +-23,114, +-193,-35, +18,204, +52,12, +-12,-78, +-58,26, +-13,-108, +24,-231, +-46,21, +-4,-14, +-149,-207, +203,88, +42,70, +-36,-150, +6,-22, +16,24, +241,99, +-128,-43, +-148,-202, +131,-105, +-14,-73, +15,84, +-129,18, +127,-38, +214,14, +118,108, +25,-95, +-60,10, +225,-47, +-80,-48, +54,30, +-58,68, +-65,-54, +-53,-11, +-45,52, +111,-12, +57,-57, +11,-137, +155,9, +-152,-45, +-106,27, +207,73, +-57,53, +-20,-88, +38,-5, +40,-60, +103,-70, +-194,-14, +94,-121, +-154,-61, +113,2, +-25,32, +5,16, +151,-98, +-55,-85, +86,-64, +-191,-98, +-138,-29, +-45,-82, +-212,-66, +84,-55, +62,-158, +98,-159, +124,109, +-209,-91, +34,-15, +30,-117, +-123,-224, +-83,165, +-4,30, +77,32, +131,98, +2,177, +-34,-10, +46,-33, +-57,116, +9,6, +83,17, +54,178, +-186,10, +-34,-108, +21,212, +91,-64, +18,-110, +-65,15, +49,-6, +36,33, +-33,-236, +20,-72, +25,-89, +-25,-194, +-1,29, +75,172, +-198,24, +15,-39, +-44,-46, +103,-93, +144,-25, +83,-62, +3,102, +27,105, +-2,-42, +-1,59, +105,167, +-150,-107, +125,30, +-52,67, +27,-130, +-168,46, +-13,-66, +-178,-58, +64,11, +-47,137, +-6,53, +-5,-6, +-39,-95, +-102,-3, +130,-2, +121,15, +-17,-96, +-57,44, +28,-218, +-132,-18, +51,-83, +-11,87, +-39,-88, +60,108, +9,-109, +108,88, +15,38, +11,-68, +127,56, +11,106, +-158,77, +26,98, +-70,76, +-100,-197, +113,30, +118,-61, +-15,23, +-86,13, +-147,0, +-102,-7, +-65,21, +-178,11, +163,6, +-38,18, +-182,-40, +108,67, +26,106, +0,-146, +-5,-76, +122,6, +53,88, +-1,-18, +76,5, +9,-27, +-34,8, +153,19, +123,56, +-53,119, +152,-2, +-10,-130, +-57,-36, +-163,15, +-62,-65, +67,2, +-83,-80, +-10,177, +-163,106, +-95,-109, +6,36, +-79,-179, +-83,-114, +7,-23, +-112,-138, +-79,151, +-17,4, +-58,24, +57,53, +27,-55, +-113,76, +-34,-155, +-50,73, +-54,-101, +-23,127, +-46,45, +-24,-124, +-1,103, +91,42, +-4,-40, +-9,-70, +-36,9, +-43,124, +-117,-12, +42,56, +32,60, +-42,-138, +7,-21, +23,30, +21,-122, +-21,135, +-25,4, +-55,61, +32,-33, +-20,109, +67,160, +-27,67, +-14,-17, +65,-122, +1,142, +-178,-17, +-57,-87, +-59,-13, +15,29, +131,160, +-120,-82, +-71,-33, +92,124, +-22,2, +-78,43, +-26,-119, +-20,27, +-117,8, +-95,-27, +-4,-26, +-25,-9, +21,38, +59,-16, +112,-68, +-49,-92, +41,94, +-50,93, +-47,-89, +42,131, +58,-39, +-15,7, +84,38, +-98,74, +-8,-52, +107,89, +-5,-20, +-6,153, +143,88, +-59,-98, +-31,-7, +108,77, +-25,57, +-78,-56, +111,-57, +-54,-128, +23,104, +-33,-98, +125,84, +-8,-78, +60,35, +-94,10, +-36,-63, +-120,-62, +-25,-111, +-16,6, +56,-87, +-49,-13, +2,-30, +-161,-42, +71,26, +-25,42, +61,-38, +129,-34, +20,41, +97,-72, +1,-84, +-2,37, +25,-52, +65,27, +-83,4, +6,-87, +113,-113, +75,21, +36,-17, +-37,38, +-36,-4, +-45,43, +-98,-40, +16,53, +-4,-9, +28,-30, +-45,29, +92,4, +42,-148, +-24,20, +-103,-17, +82,145, +99,-104, +6,-94, +-18,12, +11,100, +-2,45, +29,-27, +82,-70, +-48,23, +-18,-37, +-68,15, +-22,-75, +-49,-34, +-32,-107, +25,9, +-44,79, +-61,-73, +-10,-55, +40,-4, +-16,39, +105,-84, +-18,-59, +6,79, +5,112, +3,129, +27,17, +-27,42, +-3,-86, +-73,67, +-36,-103, +-34,-17, +-71,-121, +-53,-45, +27,11, +-22,5, +-34,-91, +-66,-117, +-19,115, +37,61, +14,-21, +-44,-53, +134,-84, +-26,-15, +7,-37, +45,23, +-70,44, +-12,83, +-33,-10, +-7,-19, +-72,13, +-65,-57, +-44,-39, +42,-76, +115,11, +17,-21, +12,-109, +-70,-7, +-66,-30, +-80,29, +47,-1, +17,56, +-38,38, +63,-104, +-67,0, +67,26, +59,-57, +-70,66, +49,-30, +-11,-17, +82,-4, +27,-45, +17,15, +-28,-39, +-62,40, +15,-26, +-18,-31, +36,-31, +7,-93, +-38,-50, +-37,-25, +3,23, +64,21, +7,-1, +-55,37, +-22,62, +-20,-61, +6,-5, +-32,24, +82,-69, +-47,20, +49,-60, +-7,-29, +29,-63, +-6,-40, +-57,32, +1,-50, +48,44, +17,-35, +-35,20, +-13,44, +-7,-1, +3,51, +11,-61, +59,-11, +-72,139, +46,-8, +125,-108, +10,7, +9,6, +80,39, +6,46, +13,-21, +61,-30, +95,18, +17,42, +5,-21, +-23,17, +-29,-43, +-42,-12, +-9,28, +-23,-24, +55,16, +45,-33, +-6,1, +3,-21, +-52,-13, +135,-40, +-6,53, +-20,-36, +2,-37, +-15,-44, +-12,47, +-9,64, +-50,-53, +5,51, +-54,34, +-16,-17, +-19,-25, +-6,-9, +-16,47, +16,41, +54,-67, +-61,20, +11,0, +11,45, +50,38, +-46,35, +18,26, +0,-67, +-7,-26, +19,4, +-77,-10, +40,65, +-68,18, +-53,-25, +-36,-1, +-2,43, +-16,-49, +2,20, +-56,-2, +-12,-12, +-4,34, +62,36, +35,44, +10,12, +13,6, +-47,-6, +-60,-41, +-2,3, +-9,-27, +2,-11, +38,22, +36,25, +18,31, +-4,35, +-11,-3, +-15,2, +11,-30, +-11,-45, +28,49, +10,2, +22,-49, +5,-13, +-38,-3, +21,-23, +-57,-18, +1,-40, +9,-39, +-27,-41, +5,29, +-17,13, +-31,-28, +-22,-48, +24,-38, +37,-35, +52,-6, +12,2, +-16,-26, +-47,1, +-13,-38, +-66,-8, +29,2, +26,36, +21,12, +-22,-1, +-13,-5, +31,64, +10,-25, +-9,32, +8,-3, +7,11, +41,-3, +1,-33, +-19,-13, +20,21, +19,-15, +-33,32, +27,13, +-21,7, +-4,8, +-43,-11, +-31,-25, +-26,4, +-5,16, +-14,-15, +-1,17, +-6,-3, +-23,21, +31,26, +-4,6, +-16,-30, +-32,9, +-42,57, +-37,-14, +-8,6, +5,8, +-18,-4, +-4,16, +-42,-10, +23,14, +21,15, +20,-28, +11,-11, +12,6, +-10,-2, +-15,7, +6,12, +31,-4, +-5,2, +-12,0, +22,-6, +6,-28, +-5,-23, +0,-6, +38,-9, +-3,14, +-22,1, +1,-4, +17,-2, +6,-5, +-6,28, +5,16, +-13,8, +22,-3, +-6,-4, +17,-6, +17,-20, +8,15, +20,-21, +4,-4, +-8,6, +-13,5, +1,-14, +22,22, +9,-7, +-16,19, +5,8, +-10,19, +-9,7, +5,5, +-5,3, +-15,-17, +5,-14, +-4,-5, +4,14, +-15,-1, +-9,0, +-9,3, +13,9, +-11,18, +17,-3, +3,-7, +5,-10, +16,8, +11,6, +4,-4, +2,-1, +11,10, +-10,-10, +-3,-1, +-8,3, +9,0, +-5,15, +-2,6, +1,-16, +4,7, +0,0, +-3,-6, +-2,0, +0,10, +-5,-13, +-3,-9, +-3,5, +1,4, +0,-1, +3,10, +4,-6, +-3,-4, +-1,8, +2,0, +-3,-3, +0,9, +2,-6, +3,-1, +-3,4, +0,-3, +0,-1, +1,4, +-2,-3, +-2,0, +-1,6, +0,-4, +0,1, +0,5, +0,-5, +0,0, +0,5, +0,-5, +0,-1, +0,4, +-1,-6, +-2,0, +-2,3, +1,-4, +0,1, +0,3, +-3,-4, +3,1, +2,6, +0,-9, +-3,3, +2,0, +-1,-8, +-3,4, +4,6, +3,-10, +0,1, +1,-4, +-3,-5, +-3,9, +-5,13, +0,-10, +-2,0, +-3,6, +0,0, +4,-7, +1,16, +-2,-6, +-5,-15, +9,0, +-8,-3, +-3,1, +-10,10, +11,-10, +2,1, +4,4, +11,-6, +16,-8, +5,10, +3,7, +17,3, +-11,-18, +13,-9, +-9,-3, +-9,0, +-15,1, +4,-14, +-4,5, +5,14, +-15,17, +-5,-3, +5,-5, +-9,-7, +-10,-19, +5,-8, +-16,-19, +9,7, +22,-22, +1,14, +-13,-5, +-8,-6, +4,4, +20,21, +8,-15, +17,20, +17,6, +-6,4, +22,3, +-13,-8, +5,-16, +-6,-28, +6,5, +17,2, +1,4, +-22,-1, +-3,-14, +38,9, +0,6, +-5,23, +6,28, +22,6, +-12,0, +-5,-2, +31,4, +6,-12, +-15,-7, +-10,2, +12,-6, +11,11, +20,28, +21,-15, +23,-14, +-42,10, +-4,-16, +-18,4, +5,-8, +-8,-6, +-37,14, +-42,-57, +-32,-9, +-16,30, +-4,-6, +31,-26, +-23,-21, +-6,3, +-1,-17, +-14,15, +-5,-16, +-26,-4, +-31,25, +-43,11, +-4,-8, +-21,-7, +27,-13, +-33,-32, +19,15, +20,-21, +-19,13, +1,33, +41,3, +7,-11, +8,3, +-9,-32, +10,25, +31,-64, +-13,5, +-22,1, +21,-12, +26,-36, +29,-2, +-66,8, +-13,38, +-47,-1, +-16,26, +12,-2, +52,6, +37,35, +24,38, +-22,48, +-31,28, +-17,-13, +5,-29, +-27,41, +9,39, +1,40, +-57,18, +21,23, +-38,3, +5,13, +22,49, +10,-2, +28,-49, +-11,45, +11,30, +-15,-2, +-11,3, +-4,-35, +18,-31, +36,-25, +38,-22, +2,11, +-9,27, +-2,-3, +-60,41, +-47,6, +13,-6, +10,-12, +35,-44, +62,-36, +-4,-34, +-12,12, +-56,2, +2,-20, +-16,49, +-2,-43, +-36,1, +-53,25, +-68,-18, +40,-65, +-77,10, +19,-4, +-7,26, +0,67, +18,-26, +-46,-35, +50,-38, +11,-45, +11,0, +-61,-20, +54,67, +16,-41, +-16,-47, +-6,9, +-19,25, +-16,17, +-54,-34, +5,-51, +-50,53, +-9,-64, +-12,-47, +-15,44, +2,37, +-20,36, +-6,-53, +135,40, +-52,13, +3,21, +-6,-1, +45,33, +55,-16, +-23,24, +-9,-28, +-42,12, +-29,43, +-23,-17, +5,21, +17,-42, +95,-18, +61,30, +13,21, +6,-46, +80,-39, +9,-6, +10,-7, +125,108, +46,8, +-72,-139, +59,11, +11,61, +3,-51, +-7,1, +-13,-44, +-35,-20, +17,35, +48,-44, +1,50, +-57,-32, +-6,40, +29,63, +-7,29, +49,60, +-47,-20, +82,69, +-32,-24, +6,5, +-20,61, +-22,-62, +-55,-37, +7,1, +64,-21, +3,-23, +-37,25, +-38,50, +7,93, +36,31, +-18,31, +15,26, +-62,-40, +-28,39, +17,-15, +27,45, +82,4, +-11,17, +49,30, +-70,-66, +59,57, +67,-26, +-67,0, +63,104, +-38,-38, +17,-56, +47,1, +-80,-29, +-66,30, +-70,7, +12,109, +17,21, +115,-11, +42,76, +-44,39, +-65,57, +-72,-13, +-7,19, +-33,10, +-12,-83, +-70,-44, +45,-23, +7,37, +-26,15, +134,84, +-44,53, +14,21, +37,-61, +-19,-115, +-66,117, +-34,91, +-22,-5, +27,-11, +-53,45, +-71,121, +-34,17, +-36,103, +-73,-67, +-3,86, +-27,-42, +27,-17, +3,-129, +5,-112, +6,-79, +-18,59, +105,84, +-16,-39, +40,4, +-10,55, +-61,73, +-44,-79, +25,-9, +-32,107, +-49,34, +-22,75, +-68,-15, +-18,37, +-48,-23, +82,70, +29,27, +-2,-45, +11,-100, +-18,-12, +6,94, +99,104, +82,-145, +-103,17, +-24,-20, +42,148, +92,-4, +-45,-29, +28,30, +-4,9, +16,-53, +-98,40, +-45,-43, +-36,4, +-37,-38, +36,17, +75,-21, +113,113, +6,87, +-83,-4, +65,-27, +25,52, +-2,-37, +1,84, +97,72, +20,-41, +129,34, +61,38, +-25,-42, +71,-26, +-161,42, +2,30, +-49,13, +56,87, +-16,-6, +-25,111, +-120,62, +-36,63, +-94,-10, +60,-35, +-8,78, +125,-84, +-33,98, +23,-104, +-54,128, +111,57, +-78,56, +-25,-57, +108,-77, +-31,7, +-59,98, +143,-88, +-6,-153, +-5,20, +107,-89, +-8,52, +-98,-74, +84,-38, +-15,-7, +58,39, +42,-131, +-47,89, +-50,-93, +41,-94, +-49,92, +112,68, +59,16, +21,-38, +-25,9, +-4,26, +-95,27, +-117,-8, +-20,-27, +-26,119, +-78,-43, +-22,-2, +92,-124, +-71,33, +-120,82, +131,-160, +15,-29, +-59,13, +-57,87, +-178,17, +1,-142, +65,122, +-14,17, +-27,-67, +67,-160, +-20,-109, +32,33, +-55,-61, +-25,-4, +-21,-135, +21,122, +23,-30, +7,21, +-42,138, +32,-60, +42,-56, +-117,12, +-43,-124, +-36,-9, +-9,70, +-4,40, +91,-42, +-1,-103, +-24,124, +-46,-45, +-23,-127, +-54,101, +-50,-73, +-34,155, +-113,-76, +27,55, +57,-53, +-58,-24, +-17,-4, +-79,-151, +-112,138, +7,23, +-83,114, +-79,179, +6,-36, +-95,109, +-163,-106, +-10,-177, +-83,80, +67,-2, +-62,65, +-163,-15, +-57,36, +-10,130, +152,2, +-53,-119, +123,-56, +153,-19, +-34,-8, +9,27, +76,-5, +-1,18, +53,-88, +122,-6, +-5,76, +0,146, +26,-106, +108,-67, +-182,40, +-38,-18, +163,-6, +-178,-11, +-65,-21, +-102,7, +-147,0, +-86,-13, +-15,-23, +118,61, +113,-30, +-100,197, +-70,-76, +26,-98, +-158,-77, +11,-106, +127,-56, +11,68, +15,-38, +108,-88, +9,109, +60,-108, +-39,88, +-11,-87, +51,83, +-132,18, +28,218, +-57,-44, +-17,96, +121,-15, +130,2, +-102,3, +-39,95, +-5,6, +-6,-53, +-47,-137, +64,-11, +-178,58, +-13,66, +-168,-46, +27,130, +-52,-67, +125,-30, +-150,107, +105,-167, +-1,-59, +-2,42, +27,-105, +3,-102, +83,62, +144,25, +103,93, +-44,46, +15,39, +-198,-24, +75,-172, +-1,-29, +-25,194, +25,89, +20,72, +-33,236, +36,-33, +49,6, +-65,-15, +18,110, +91,64, +21,-212, +-34,108, +-186,-10, +54,-178, +83,-17, +9,-6, +-57,-116, +46,33, +-34,10, +2,-177, +131,-98, +77,-32, +-4,-30, +-83,-165, +-123,224, +30,117, +34,15, +-209,91, +124,-109, +98,159, +62,158, +84,55, +-212,66, +-45,82, +-138,29, +-191,98, +86,64, +-55,85, +151,98, +5,-16, +-25,-32, +113,-2, +-154,61, +94,121, +-194,14, +103,70, +40,60, +38,5, +-20,88, +-57,-53, +207,-73, +-106,-27, +-152,45, +155,-9, +11,137, +57,57, +111,12, +-45,-52, +-53,11, +-65,54, +-58,-68, +54,-30, +-80,48, +225,47, +-60,-10, +25,95, +118,-108, +214,-14, +127,38, +-129,-18, +15,-84, +-14,73, +131,105, +-148,202, +-128,43, +241,-99, +16,-24, +6,22, +-36,150, +42,-70, +203,-88, +-149,207, +-4,14, +-46,-21, +24,231, +-13,108, +-58,-26, +-12,78, +52,-12, +18,-204, +-193,35, +-23,-114, +96,34, +33,89, +107,5, +-89,-50, +147,15, +-59,-162, +44,53, +82,62, +83,-16, +-141,-91, +235,-6, +107,-78, +67,-68, +17,-25, +-138,57, +123,-87, +160,-36, +-114,87, +-212,4, +92,-182, +-204,226, +175,-139, +-102,-74, +28,-93, +-49,58, +77,-56, +-84,258, +-214,54, +18,87, +-178,19, +-33,-38, +-29,-86, +-82,273, +-64,-61, +87,145, +19,-82, +-75,-125, +34,-84, +-38,-181, +-84,-45, +-58,-69, +-95,48, +55,-101, +-19,-21, +1,45, +-135,49, +-145,-185, +-70,-192, +99,28, +-46,1, +86,61, +-27,144, +53,57, +-22,94, +39,-101, +-28,45, +-1,-15, +-14,-56, +-93,-191, +-265,156, +309,91, +-8,-94, +-55,-190, +-189,-15, +5,33, +173,-4, +125,-13, +-110,-70, +-64,-69, +-36,-56, +51,200, +-136,-4, +39,85, +-200,129, +-137,-12, +33,0, +77,85, +-44,93, +-201,1, +82,24, +5,-143, +-128,-4, +-100,-118, +103,63, +284,-8, +166,-57, +152,29, +-107,-46, +97,105, +-177,67, +80,96, +-236,90, +-126,109, +-146,89, +52,35, +8,-80, +-241,149, +-104,146, +60,-40, +259,-32, +-68,65, +-200,-157, +-28,31, +-146,-163, +-28,16, +30,47, +138,-56, +77,181, +82,-2, +-73,42, +-56,113, +47,205, +-254,50, +-68,-119, +20,-142, +-106,-172, +-144,82, +-136,80, +91,225, +-103,56, +109,22, +144,-70, +-75,-59, +-23,164, +-117,-175, +-17,18, +119,-53, +-142,-122, +119,220, +-51,-214, +-134,-88, +63,-80, +-109,-37, +22,58, +-18,115, +48,76, +-129,-126, +-122,57, +-78,-54, +-277,15, +3,205, +118,-70, +-64,-178, +45,47, +188,101, +-48,43, +25,46, +-43,87, +-81,-156, +66,113, +-180,-180, +5,75, +-156,-72, +-130,-50, +-70,11, +-54,140, +127,32, +-198,-185, +143,5, +17,94, +-60,-13, +266,47, +-53,61, +-160,-218, +123,77, +204,29, +33,-105, +-199,-245, +-154,-136, +149,-6, +82,-128, +72,-158, +7,66, +-108,-203, +50,-265, +81,-81, +59,66, +-122,-25, +17,133, +-64,110, +-24,52, +118,-32, +-138,-9, +22,-237, +-45,-49, +-34,275, +-110,-261, +29,-22, +-56,-190, +118,63, +-283,104, +-77,-44, +215,19, +26,147, +43,-3, +-14,127, +187,57, +-30,152, +-170,-34, +56,83, +147,61, +20,-157, +3,-4, +-196,6, +218,146, +49,-209, +91,19, +257,-52, +-72,121, +-129,-76, +-84,-68, +-75,201, +82,-96, +142,206, +103,2, +-115,280, +65,126, +8,-2, +26,6, +-116,126, +96,12, +-31,229, +18,-112, +271,-186, +60,-106, +78,-92, +68,-4, +-128,169, +-31,197, +-96,63, +-47,-21, +-41,18, +47,-137, +132,-181, +138,-26, +61,-15, +92,51, +-52,50, +-162,10, +-46,-81, +33,59, +111,-196, +-193,-49, +-153,102, +87,-101, +-109,219, +-174,10, +-14,78, +-304,17, +-113,-10, +119,91, +56,15, +-158,155, +-150,84, +-235,-70, +-137,-226, +3,-183, +-61,-108, +-26,146, +-112,91, +-43,269, +-184,55, +118,111, +131,-307, +54,-27, +-33,134, +139,-26, +-9,-60, +296,-90, +-198,-1, +145,85, +110,-184, +-170,-120, +-92,-1, +20,26, +-118,-51, +159,-36, +44,-46, +72,179, +86,-191, +42,206, +-130,197, +-67,168, +36,113, +-28,147, +91,-56, +-47,55, +60,140, +88,-83, +221,43, +-59,-104, +-124,104, +125,248, +135,254, +197,179, +-154,111, +40,-5, +171,-51, +-140,295, +77,2, +121,41, +-34,-228, +-63,-122, +-111,-77, +-4,-65, +52,25, +28,163, +51,-96, +34,-183, +-46,2, +47,93, +-93,-118, +-174,-158, +-179,187, +-126,-143, +63,-214, +-23,-11, +76,191, +5,-21, +-120,-131, +78,-50, +143,-19, +223,109, +-6,-122, +28,69, +-21,-183, +-197,-22, +60,-158, +-132,-197, +-10,-31, +-120,-155, +78,83, +-12,224, +57,-118, +-89,-203, +273,12, +-70,-33, +238,133, +157,40, +90,49, +63,50, +8,21, +-138,69, +-273,153, +42,-166, +78,90, +66,134, +-60,196, +74,-69, +155,143, +114,-217, +160,40, +-279,-170, +-79,-99, +164,-146, +24,-248, +-92,-24, +160,-78, +-72,-76, +1,-50, +-34,339, +-74,-114, +145,16, +273,-14, +1,89, +-118,-52, +-59,-55, +163,-21, +-267,68, +145,46, +111,26, +-270,61, +-251,190, +155,-22, +1,37, +209,16, +50,-149, +-54,-38, +-51,65, +84,24, +78,-27, +114,26, +-70,121, +143,-248, +-154,-35, +-28,22, +48,103, +-26,-154, +-81,9, +16,94, +208,261, +-95,114, +321,12, +120,-90, +-43,147, +-17,72, +6,0, +24,-146, +221,231, +308,121, +20,-72, +60,93, +113,-117, +88,117, +-72,-57, +1,88, +113,-104, +-36,-13, +-283,160, +73,-91, +-273,4, +-78,45, +59,-63, +88,102, +330,-86, +-54,-79, +41,-96, +-207,-60, +270,-168, +-10,-252, +1,-95, +-150,-30, +172,-13, +-130,71, +18,-71, +156,-64, +-75,8, +-207,98, +204,-97, +-157,-129, +-128,-198, +127,-147, +2,75, +-241,79, +-36,-87, +-3,-8, +49,19, +71,154, +26,245, +4,-107, +31,181, +92,-142, +-44,49, +-148,-29, +38,121, +318,50, +-24,0, +-188,218, +-159,222, +93,-71, +39,-96, +-46,52, +-148,-51, +-175,-73, +-15,-197, +100,-194, +107,131, +38,-8, +-148,-135, +51,149, +-278,176, +-115,59, +-80,-62, +-132,91, +-187,201, +-132,65, +198,40, +-83,223, +-199,-37, +81,-102, +-278,-104, +-139,-120, +-52,125, +-60,-184, +53,34, +119,-86, +-71,71, +-135,-51, +26,-120, +56,0, +-208,76, +24,-57, +143,17, +41,70, +110,15, +29,10, +147,-91, +16,160, +-99,48, +5,-124, +102,95, +-78,-8, +-245,142, +-10,-45, +-123,-94, +37,184, +29,-205, +37,-41, +177,-74, +-239,-149, +-196,161, +-237,30, +-106,-10, +44,-142, +77,0, +25,136, +-78,73, +112,-255, +-94,4, +81,-126, +167,256, +108,-105, +16,-41, +-31,-77, +-51,-28, +70,115, +136,97, +-3,-77, +-15,-177, +3,-284, +43,-153, +-55,15, +-201,6, +170,-48, +-201,34, +44,83, +-5,210, +-51,-112, +-111,53, +-193,22, +284,-58, +-33,144, +-145,-176, +-63,-54, +-41,58, +-49,264, +93,118, +122,-126, +58,258, +-113,76, +24,-102, +167,-22, +-42,-43, +-45,-41, +0,-27, +-12,-35, +90,-188, +61,19, +155,-51, +-44,170, +-52,109, +-201,-50, +-223,-207, +201,75, +134,-36, +-133,215, +67,-96, +-186,-13, +70,-51, +191,-121, +-110,-84, +-16,200, +69,-31, +-168,-153, +-211,185, +53,-199, +35,13, +85,-148, +-110,-13, +-51,-111, +106,-106, +-119,222, +17,16, +58,88, +-130,0, +-231,45, +-105,-69, +133,129, +180,183, +60,-15, +14,111, +-167,205, +-15,147, +103,133, +-295,81, +-225,129, +203,104, +-158,-180, +114,120, +-8,232, +128,125, +63,30, +-169,123, +-97,108, +-22,78, +123,24, +-29,-7, +60,92, +-220,-86, +-96,-43, +307,26, +-118,-220, +65,54, +-139,-174, +174,157, +-33,-60, +-73,220, +-145,-39, +9,1, +159,53, +56,-40, +38,17, +-63,-44, +-110,-95, +-188,95, +246,-8, +2,-87, +59,-110, +-150,-151, +-53,-168, +38,-82, +-2,263, +-80,74, +217,36, +248,155, +-209,19, +72,-113, +-80,-69, +-217,85, +-39,-78, +159,196, +45,-84, +-137,58, +-60,159, +52,-250, +-294,-4, +47,39, +2,114, +66,251, +-100,109, +97,-61, +19,292, +27,-19, +52,-123, +-1,47, +77,-2, +68,219, +76,99, +194,-40, +100,27, +-97,-48, +18,67, +53,54, +-158,-57, +-24,208, +-284,118, +-54,-81, +-207,91, +-65,-96, +71,-22, +104,99, +-195,52, +-104,-57, +-40,232, +2,-97, +84,-106, +49,-120, +-193,62, +172,45, +105,3, +-57,-115, +29,-9, +61,-39, +65,-53, +66,47, +278,-19, +-92,-16, +111,-200, +-52,-143, +-38,-169, +-29,-94, +148,90, +184,176, +20,29, +28,-138, +127,103, +105,76, +142,129, +-78,-102, +69,-78, +14,37, +-109,45, +-50,76, +143,-67, +1,63, +-139,-235, +32,-49, +37,-222, +39,-4, +-92,-15, +-103,304, +120,31, +137,37, +81,14, +-180,-114, +37,-39, +-97,-129, +44,-136, +-123,137, +11,198, +-6,-102, +-17,106, +-135,44, +78,-46, +-194,-30, +47,-18, +89,-66, +120,7, +-100,-33, +161,54, +-8,158, +105,159, +-162,145, +159,-7, +228,62, +-33,96, +-56,114, +-42,-51, +-66,-80, +-81,-50, +-68,31, +-15,-62, +-209,6, +208,-141, +44,-43, +-62,-87, +-8,-114, +-3,-61, +-57,-39, +257,171, +13,-19, +-49,215, +43,-88, +-74,25, +1,-119, +-127,-13, +-225,-28, +-11,-58, +-121,17, +-57,22, +61,-24, +-8,-61, +-192,-7, +-22,69, +86,82, +123,185, +114,241, +-43,-44, +-116,144, +251,9, +-76,-42, +94,-301, +-63,-79, +-122,98, +-13,-37, +-197,-151, +122,1, +-64,141, +135,114, +173,114, +-79,-145, +73,38, +85,72, +-99,-50, +-109,-153, +56,-87, +76,-51, +-100,126, +-75,-38, +181,-228, +-45,-1, +-6,36, +-25,-47, +71,-4, +116,-46, +81,-62, +-84,33, +76,186, +-201,-125, +-88,33, +121,166, +108,-112, +-16,135, +274,-70, +-64,71, +-3,104, +39,193, +-82,91, +7,44, +50,113, +93,-29, +-102,-215, +-24,124, +2,50, +141,127, +-49,-120, +-42,115, +-84,-65, +-149,-45, +-58,-65, +-65,29, +130,103, +-38,147, +-75,-177, +-207,72, +81,64, +226,71, +-29,253, +95,43, +-95,48, +-253,21, +92,163, +105,164, +-5,-45, +-2,-152, +100,-80, +-116,127, +-104,-51, +30,20, +-24,95, +-57,-182, +-101,40, +-48,156, +-53,158, +-54,-68, +9,59, +-122,-105, +192,-47, +63,35, +110,-69, +188,-48, +-188,96, +79,7, +-63,26, +-5,94, +-53,-68, +-59,30, +-97,-119, +-35,41, +170,-19, +-58,-120, +-116,13, +-67,98, +-15,-86, +-172,36, +-21,-23, +60,-229, +187,46, +-73,-119, +91,-17, +-86,-150, +-151,-41, +-2,-13, +61,-13, +9,1, +70,-79, +-68,-169, +76,84, +-112,-116, +104,140, +-111,-74, +-9,56, +-124,79, +-155,-42, +-36,-21, +44,21, +-6,-66, +195,1, +89,123, +37,152, +0,90, +-31,-214, +-64,-36, +6,-150, +-106,-81, +-56,-164, +-33,33, +-184,61, +-16,-63, +-79,-98, +-73,-45, +151,30, +-55,-136, +139,58, +-45,142, +24,-148, +-9,40, +-150,17, +-3,102, +-23,-10, +-11,-89, +-197,-23, +-20,14, +-130,-41, +57,32, +-62,82, +78,-11, +-11,43, +51,-67, +-82,88, +88,-17, +42,53, +6,-92, +20,42, +-30,-183, +-29,-62, +-39,-104, +-48,50, +67,-78, +145,-63, +-154,-73, +39,23, +40,60, +38,-72, +-28,198, +-91,-68, +38,27, +-117,-31, +-75,-156, +85,-19, +-1,-116, +-104,-68, +-165,-9, +-4,-93, +-196,-8, +-42,-21, +-32,-30, +193,31, +116,147, +-43,62, +-7,106, +-12,-17, +-30,-43, +8,-99, +29,-117, +30,-82, +57,59, +-95,-111, +154,100, +-141,-93, +-32,56, +-85,-19, +-40,54, +28,43, +-15,-24, +-75,-104, +-53,-59, +-132,-14, +58,100, +-147,-23, +-33,190, +-93,-79, +-15,-142, +55,-14, +-40,-13, +46,-186, +-40,47, +-98,78, +37,-8, +28,-85, +-185,-35, +127,-57, +12,-37, +-38,74, +114,-152, +17,89, +-65,-18, +17,123, +-14,152, +-75,-19, +18,66, +-62,-97, +20,-4, +80,-37, +183,-65, +-71,-40, +-16,-91, +-20,20, +27,11, +31,-104, +-6,-47, +17,37, +-145,23, +-40,-26, +131,128, +130,-10, +26,-112, +-24,-97, +149,6, +60,112, +131,43, +72,102, +-68,-81, +32,-202, +-26,115, +140,9, +20,-14, +-65,-64, +-51,-68, +33,-110, +-55,-21, +78,28, +-67,-21, +166,124, +-9,-84, +-83,-67, +-68,72, +103,77, +39,-97, +32,53, +165,-11, +88,-82, +-41,127, +116,10, +-103,98, +82,57, +45,57, +-8,-65, +9,-61, +26,-79, +90,68, +-71,-13, +-21,81, +-14,72, +-23,-13, +34,-65, +-38,76, +-104,11, +-50,21, +61,-82, +27,22, +-121,82, +-70,-104, +-26,-62, +36,87, +-2,-11, +-14,14, +-33,68, +156,78, +66,40, +-28,-72, +-54,58, +-40,-167, +46,-4, +-30,8, +-167,-95, +-110,158, +137,-23, +-46,25, +73,-34, +101,28, +121,109, +59,66, +33,-66, +0,-62, +-41,-25, +-12,22, +17,-23, +-6,-39, +-10,-91, +-31,-40, +-26,-114, +-5,-50, +-95,70, +86,-74, +-15,-17, +113,99, +2,8, +47,76, +-76,-28, +-55,-44, +-28,-2, +-75,63, +-16,-3, +-59,37, +12,-129, +-12,9, +-9,-31, +-62,-72, +-8,0, +41,-41, +73,-6, +14,109, +24,82, +41,-25, +126,-76, +63,164, +19,-57, +24,23, +-46,44, +-8,65, +-1,-43, +-45,24, +-13,-101, +60,29, +-26,-39, +37,-14, +49,0, +70,-1, +-37,-90, +-88,71, +-42,-70, +-2,-41, +-42,5, +14,116, +89,5, +35,-13, +112,-41, +-97,-28, +-36,78, +-101,-20, +-20,-68, +-78,20, +63,57, +-21,-28, +38,-47, +28,22, +-56,-13, +-27,28, +27,9, +92,86, +-22,47, +-3,14, +-18,14, +78,74, +66,88, +-63,-24, +-73,-42, +-67,51, +-73,-65, +-54,78, +55,39, +-31,74, +-9,11, +9,49, +-51,-18, +-12,-6, +-13,68, +16,5, +25,6, +-20,-43, +-117,48, +50,27, +15,-37, +31,-66, +3,-26, +42,-16, +-17,61, +-6,-32, +-22,-71, +27,-88, +22,-2, +62,-138, +41,18, +-42,9, +48,-31, +23,4, +-71,30, +51,55, +38,62, +15,20, +110,8, +-62,35, +-49,0, +75,5, +-1,37, +59,-2, +32,7, +51,-29, +91,69, +24,-61, +-82,-33, +19,-46, +-24,18, +27,-63, +44,2, +-40,90, +69,-41, +-19,-82, +-17,14, +-36,-54, +11,11, +41,33, +23,85, +42,4, +53,-40, +22,31, +-99,-15, +-39,-48, +-30,-26, +-52,92, +23,-21, +8,15, +-13,-71, +-23,-23, +-4,16, +11,36, +-8,22, +4,24, +23,-39, +-4,-63, +83,40, +-55,2, +39,22, +-64,-73, +-5,78, +-38,-5, +2,18, +-7,-44, +-16,-59, +42,70, +-10,-1, +9,-7, +66,-24, +17,-32, +6,-22, +54,61, +69,39, +6,-74, +3,83, +-23,-29, +60,-53, +43,-42, +1,-24, +70,14, +65,-24, +2,-39, +29,46, +38,48, +26,25, +7,-17, +-16,-71, +28,-34, +-6,15, +44,-4, +13,-5, +14,-14, +-50,21, +-20,-28, +16,-22, +-80,72, +38,-27, +-24,-60, +-4,-9, +-3,-8, +19,-18, +14,21, +-50,4, +-11,15, +-6,13, +3,-68, +-7,26, +70,30, +-48,6, +-20,-5, +-10,-68, +17,-32, +28,31, +31,-1, +-51,35, +-4,12, +-18,4, +-17,-7, +-3,-10, +3,4, +-31,15, +-7,22, +32,-23, +12,-9, +25,54, +-7,5, +56,-15, +43,8, +-54,-24, +4,-40, +-3,27, +12,10, +-4,10, +-2,-59, +12,0, +-5,18, +56,-36, +-9,21, +-18,-27, +20,6, +-7,-32, +-38,6, +-34,16, +-51,-20, +-11,9, +27,25, +10,7, +-1,-4, +-6,-7, +-28,-1, +14,24, +1,31, +32,1, +-54,8, +-2,-10, +-7,12, +20,-9, +12,15, +-26,10, +-19,-21, +39,-33, +-10,-46, +-1,-10, +-10,-8, +-30,36, +6,-3, +-11,-15, +13,18, +-13,-34, +4,-22, +34,-7, +-24,5, +5,3, +8,-7, +1,-4, +15,14, +-18,25, +6,-10, +18,20, +-8,22, +-3,-13, +11,-10, +-2,-2, +-17,5, +-1,-17, +0,-6, +4,12, +-18,5, +9,-1, +-18,-9, +11,-26, +-19,-7, +-22,-21, +16,-2, +7,-9, +10,2, +11,11, +14,-35, +12,-13, +-3,4, +-2,-29, +26,-11, +8,-11, +-10,1, +0,-10, +6,17, +-9,11, +-25,-10, +-6,-8, +3,-14, +-7,-10, +0,11, +-4,2, +9,-11, +24,-17, +1,5, +-4,13, +16,13, +3,-14, +-16,-7, +17,12, +-12,1, +8,-6, +10,9, +10,2, +1,-2, +-1,10, +-2,-10, +-1,-13, +8,4, +-7,3, +-15,-10, +-3,2, +-3,-2, +-3,-2, +10,-6, +-7,5, +-5,1, +7,-1, +-1,-2, +-6,5, +2,-10, +-10,7, +-11,2, +5,1, +-5,-8, +-9,8, +8,1, +-4,7, +-2,1, +6,-5, +-4,0, +-3,-4, +6,-1, +-2,-3, +-4,2, +5,1, +-1,-1, +-5,1, +7,2, +-4,0, +-3,1, +7,1, +-3,1, +-3,0, +6,0, +-3,0, +-3,-1, +7,-1, +-3,-1, +-4,0, +7,-2, +-5,-1, +-1,1, +5,-1, +-4,-2, +-2,3, +6,1, +-3,4, +-4,0, +6,5, +-2,-1, +-4,-7, +8,-1, +-9,-8, +-5,8, +5,-1, +-11,-2, +-10,-7, +2,10, +-6,-5, +-1,2, +7,1, +-5,-1, +-7,-5, +10,6, +-3,2, +-3,2, +-3,-2, +-15,10, +-7,-3, +8,-4, +-1,13, +-2,10, +-1,-10, +1,2, +10,-2, +10,-9, +8,6, +-12,-1, +17,-12, +-16,7, +3,14, +16,-13, +-4,-13, +1,-5, +24,17, +9,11, +-4,-2, +0,-11, +-7,10, +3,14, +-6,8, +-25,10, +-9,-11, +6,-17, +0,10, +-10,-1, +8,11, +26,11, +-2,29, +-3,-4, +12,13, +14,35, +11,-11, +10,-2, +7,9, +16,2, +-22,21, +-19,7, +11,26, +-18,9, +9,1, +-18,-5, +4,-12, +0,6, +-1,17, +-17,-5, +-2,2, +11,10, +-3,13, +-8,-22, +18,-20, +6,10, +-18,-25, +15,-14, +1,4, +8,7, +5,-3, +-24,-5, +34,7, +4,22, +-13,34, +13,-18, +-11,15, +6,3, +-30,-36, +-10,8, +-1,10, +-10,46, +39,33, +-19,21, +-26,-10, +12,-15, +20,9, +-7,-12, +-2,10, +-54,-8, +32,-1, +1,-31, +14,-24, +-28,1, +-6,7, +-1,4, +10,-7, +27,-25, +-11,-9, +-51,20, +-34,-16, +-38,-6, +-7,32, +20,-6, +-18,27, +-9,-21, +56,36, +-5,-18, +12,0, +-2,59, +-4,-10, +12,-10, +-3,-27, +4,40, +-54,24, +43,-8, +56,15, +-7,-5, +25,-54, +12,9, +32,23, +-7,-22, +-31,-15, +3,-4, +-3,10, +-17,7, +-18,-4, +-4,-12, +-51,-35, +31,1, +28,-31, +17,32, +-10,68, +-20,5, +-48,-6, +70,-30, +-7,-26, +3,68, +-6,-13, +-11,-15, +-50,-4, +14,-21, +19,18, +-3,8, +-4,9, +-24,60, +38,27, +-80,-72, +16,22, +-20,28, +-50,-21, +14,14, +13,5, +44,4, +-6,-15, +28,34, +-16,71, +7,17, +26,-25, +38,-48, +29,-46, +2,39, +65,24, +70,-14, +1,24, +43,42, +60,53, +-23,29, +3,-83, +6,74, +69,-39, +54,-61, +6,22, +17,32, +66,24, +9,7, +-10,1, +42,-70, +-16,59, +-7,44, +2,-18, +-38,5, +-5,-78, +-64,73, +39,-22, +-55,-2, +83,-40, +-4,63, +23,39, +4,-24, +-8,-22, +11,-36, +-4,-16, +-23,23, +-13,71, +8,-15, +23,21, +-52,-92, +-30,26, +-39,48, +-99,15, +22,-31, +53,40, +42,-4, +23,-85, +41,-33, +11,-11, +-36,54, +-17,-14, +-19,82, +69,41, +-40,-90, +44,-2, +27,63, +-24,-18, +19,46, +-82,33, +24,61, +91,-69, +51,29, +32,-7, +59,2, +-1,-37, +75,-5, +-49,0, +-62,-35, +110,-8, +15,-20, +38,-62, +51,-55, +-71,-30, +23,-4, +48,31, +-42,-9, +41,-18, +62,138, +22,2, +27,88, +-22,71, +-6,32, +-17,-61, +42,16, +3,26, +31,66, +15,37, +50,-27, +-117,-48, +-20,43, +25,-6, +16,-5, +-13,-68, +-12,6, +-51,18, +9,-49, +-9,-11, +-31,-74, +55,-39, +-54,-78, +-73,65, +-67,-51, +-73,42, +-63,24, +66,-88, +78,-74, +-18,-14, +-3,-14, +-22,-47, +92,-86, +27,-9, +-27,-28, +-56,13, +28,-22, +38,47, +-21,28, +63,-57, +-78,-20, +-20,68, +-101,20, +-36,-78, +-97,28, +112,41, +35,13, +89,-5, +14,-116, +-42,-5, +-2,41, +-42,70, +-88,-71, +-37,90, +70,1, +49,0, +37,14, +-26,39, +60,-29, +-13,101, +-45,-24, +-1,43, +-8,-65, +-46,-44, +24,-23, +19,57, +63,-164, +126,76, +41,25, +24,-82, +14,-109, +73,6, +41,41, +-8,0, +-62,72, +-9,31, +-12,-9, +12,129, +-59,-37, +-16,3, +-75,-63, +-28,2, +-55,44, +-76,28, +47,-76, +2,-8, +113,-99, +-15,17, +86,74, +-95,-70, +-5,50, +-26,114, +-31,40, +-10,91, +-6,39, +17,23, +-12,-22, +-41,25, +0,62, +33,66, +59,-66, +121,-109, +101,-28, +73,34, +-46,-25, +137,23, +-110,-158, +-167,95, +-30,-8, +46,4, +-40,167, +-54,-58, +-28,72, +66,-40, +156,-78, +-33,-68, +-14,-14, +-2,11, +36,-87, +-26,62, +-70,104, +-121,-82, +27,-22, +61,82, +-50,-21, +-104,-11, +-38,-76, +34,65, +-23,13, +-14,-72, +-21,-81, +-71,13, +90,-68, +26,79, +9,61, +-8,65, +45,-57, +82,-57, +-103,-98, +116,-10, +-41,-127, +88,82, +165,11, +32,-53, +39,97, +103,-77, +-68,-72, +-83,67, +-9,84, +166,-124, +-67,21, +78,-28, +-55,21, +33,110, +-51,68, +-65,64, +20,14, +140,-9, +-26,-115, +32,202, +-68,81, +72,-102, +131,-43, +60,-112, +149,-6, +-24,97, +26,112, +130,10, +131,-128, +-40,26, +-145,-23, +17,-37, +-6,47, +31,104, +27,-11, +-20,-20, +-16,91, +-71,40, +183,65, +80,37, +20,4, +-62,97, +18,-66, +-75,19, +-14,-152, +17,-123, +-65,18, +17,-89, +114,152, +-38,-74, +12,37, +127,57, +-185,35, +28,85, +37,8, +-98,-78, +-40,-47, +46,186, +-40,13, +55,14, +-15,142, +-93,79, +-33,-190, +-147,23, +58,-100, +-132,14, +-53,59, +-75,104, +-15,24, +28,-43, +-40,-54, +-85,19, +-32,-56, +-141,93, +154,-100, +-95,111, +57,-59, +30,82, +29,117, +8,99, +-30,43, +-12,17, +-7,-106, +-43,-62, +116,-147, +193,-31, +-32,30, +-42,21, +-196,8, +-4,93, +-165,9, +-104,68, +-1,116, +85,19, +-75,156, +-117,31, +38,-27, +-91,68, +-28,-198, +38,72, +40,-60, +39,-23, +-154,73, +145,63, +67,78, +-48,-50, +-39,104, +-29,62, +-30,183, +20,-42, +6,92, +42,-53, +88,17, +-82,-88, +51,67, +-11,-43, +78,11, +-62,-82, +57,-32, +-130,41, +-20,-14, +-197,23, +-11,89, +-23,10, +-3,-102, +-150,-17, +-9,-40, +24,148, +-45,-142, +139,-58, +-55,136, +151,-30, +-73,45, +-79,98, +-16,63, +-184,-61, +-33,-33, +-56,164, +-106,81, +6,150, +-64,36, +-31,214, +0,-90, +37,-152, +89,-123, +195,-1, +-6,66, +44,-21, +-36,21, +-155,42, +-124,-79, +-9,-56, +-111,74, +104,-140, +-112,116, +76,-84, +-68,169, +70,79, +9,-1, +61,13, +-2,13, +-151,41, +-86,150, +91,17, +-73,119, +187,-46, +60,229, +-21,23, +-172,-36, +-15,86, +-67,-98, +-116,-13, +-58,120, +170,19, +-35,-41, +-97,119, +-59,-30, +-53,68, +-5,-94, +-63,-26, +79,-7, +-188,-96, +188,48, +110,69, +63,-35, +192,47, +-122,105, +9,-59, +-54,68, +-53,-158, +-48,-156, +-101,-40, +-57,182, +-24,-95, +30,-20, +-104,51, +-116,-127, +100,80, +-2,152, +-5,45, +105,-164, +92,-163, +-253,-21, +-95,-48, +95,-43, +-29,-253, +226,-71, +81,-64, +-207,-72, +-75,177, +-38,-147, +130,-103, +-65,-29, +-58,65, +-149,45, +-84,65, +-42,-115, +-49,120, +141,-127, +2,-50, +-24,-124, +-102,215, +93,29, +50,-113, +7,-44, +-82,-91, +39,-193, +-3,-104, +-64,-71, +274,70, +-16,-135, +108,112, +121,-166, +-88,-33, +-201,125, +76,-186, +-84,-33, +81,62, +116,46, +71,4, +-25,47, +-6,-36, +-45,1, +181,228, +-75,38, +-100,-126, +76,51, +56,87, +-109,153, +-99,50, +85,-72, +73,-38, +-79,145, +173,-114, +135,-114, +-64,-141, +122,-1, +-197,151, +-13,37, +-122,-98, +-63,79, +94,301, +-76,42, +251,-9, +-116,-144, +-43,44, +114,-241, +123,-185, +86,-82, +-22,-69, +-192,7, +-8,61, +61,24, +-57,-22, +-121,-17, +-11,58, +-225,28, +-127,13, +1,119, +-74,-25, +43,88, +-49,-215, +13,19, +257,-171, +-57,39, +-3,61, +-8,114, +-62,87, +44,43, +208,141, +-209,-6, +-15,62, +-68,-31, +-81,50, +-66,80, +-42,51, +-56,-114, +-33,-96, +228,-62, +159,7, +-162,-145, +105,-159, +-8,-158, +161,-54, +-100,33, +120,-7, +89,66, +47,18, +-194,30, +78,46, +-135,-44, +-17,-106, +-6,102, +11,-198, +-123,-137, +44,136, +-97,129, +37,39, +-180,114, +81,-14, +137,-37, +120,-31, +-103,-304, +-92,15, +39,4, +37,222, +32,49, +-139,235, +1,-63, +143,67, +-50,-76, +-109,-45, +14,-37, +69,78, +-78,102, +142,-129, +105,-76, +127,-103, +28,138, +20,-29, +184,-176, +148,-90, +-29,94, +-38,169, +-52,143, +111,200, +-92,16, +278,19, +66,-47, +65,53, +61,39, +29,9, +-57,115, +105,-3, +172,-45, +-193,-62, +49,120, +84,106, +2,97, +-40,-232, +-104,57, +-195,-52, +104,-99, +71,22, +-65,96, +-207,-91, +-54,81, +-284,-118, +-24,-208, +-158,57, +53,-54, +18,-67, +-97,48, +100,-27, +194,40, +76,-99, +68,-219, +77,2, +-1,-47, +52,123, +27,19, +19,-292, +97,61, +-100,-109, +66,-251, +2,-114, +47,-39, +-294,4, +52,250, +-60,-159, +-137,-58, +45,84, +159,-196, +-39,78, +-217,-85, +-80,69, +72,113, +-209,-19, +248,-155, +217,-36, +-80,-74, +-2,-263, +38,82, +-53,168, +-150,151, +59,110, +2,87, +246,8, +-188,-95, +-110,95, +-63,44, +38,-17, +56,40, +159,-53, +9,-1, +-145,39, +-73,-220, +-33,60, +174,-157, +-139,174, +65,-54, +-118,220, +307,-26, +-96,43, +-220,86, +60,-92, +-29,7, +123,-24, +-22,-78, +-97,-108, +-169,-123, +63,-30, +128,-125, +-8,-232, +114,-120, +-158,180, +203,-104, +-225,-129, +-295,-81, +103,-133, +-15,-147, +-167,-205, +14,-111, +60,15, +180,-183, +133,-129, +-105,69, +-231,-45, +-130,0, +58,-88, +17,-16, +-119,-222, +106,106, +-51,111, +-110,13, +85,148, +35,-13, +53,199, +-211,-185, +-168,153, +69,31, +-16,-200, +-110,84, +191,121, +70,51, +-186,13, +67,96, +-133,-215, +134,36, +201,-75, +-223,207, +-201,50, +-52,-109, +-44,-170, +155,51, +61,-19, +90,188, +-12,35, +0,27, +-45,41, +-42,43, +167,22, +24,102, +-113,-76, +58,-258, +122,126, +93,-118, +-49,-264, +-41,-58, +-63,54, +-145,176, +-33,-144, +284,58, +-193,-22, +-111,-53, +-51,112, +-5,-210, +44,-83, +-201,-34, +170,48, +-201,-6, +-55,-15, +43,153, +3,284, +-15,177, +-3,77, +136,-97, +70,-115, +-51,28, +-31,77, +16,41, +108,105, +167,-256, +81,126, +-94,-4, +112,255, +-78,-73, +25,-136, +77,0, +44,142, +-106,10, +-237,-30, +-196,-161, +-239,149, +177,74, +37,41, +29,205, +37,-184, +-123,94, +-10,45, +-245,-142, +-78,8, +102,-95, +5,124, +-99,-48, +16,-160, +147,91, +29,-10, +110,-15, +41,-70, +143,-17, +24,57, +-208,-76, +56,0, +26,120, +-135,51, +-71,-71, +119,86, +53,-34, +-60,184, +-52,-125, +-139,120, +-278,104, +81,102, +-199,37, +-83,-223, +198,-40, +-132,-65, +-187,-201, +-132,-91, +-80,62, +-115,-59, +-278,-176, +51,-149, +-148,135, +38,8, +107,-131, +100,194, +-15,197, +-175,73, +-148,51, +-46,-52, +39,96, +93,71, +-159,-222, +-188,-218, +-24,0, +318,-50, +38,-121, +-148,29, +-44,-49, +92,142, +31,-181, +4,107, +26,-245, +71,-154, +49,-19, +-3,8, +-36,87, +-241,-79, +2,-75, +127,147, +-128,198, +-157,129, +204,97, +-207,-98, +-75,-8, +156,64, +18,71, +-130,-71, +172,13, +-150,30, +1,95, +-10,252, +270,168, +-207,60, +41,96, +-54,79, +330,86, +88,-102, +59,63, +-78,-45, +-273,-4, +73,91, +-283,-160, +-36,13, +113,104, +1,-88, +-72,57, +88,-117, +113,117, +60,-93, +20,72, +308,-121, +221,-231, +24,146, +6,0, +73,-54, +225,-38, +-2,129, +-335,-9, +-113,-7, +-260,-114, +-65,-65, +-155,-170, +133,7, +104,55, +0,31, +-169,80, +-231,136, +1,21, +-143,31, +-81,27, +-188,118, +30,150, +-42,-317, +-101,123, +161,-22, +122,-25, +-27,80, +101,-31, +-18,-201, +203,-15, +-36,-68, +192,-76, +-48,217, +-107,13, +-70,121, +-63,-53, +266,18, +105,0, +30,66, +-42,-34, +-86,12, +220,67, +157,-170, +-69,309, +-30,-233, +-60,-8, +-85,-4, +-17,72, +42,-77, +3,4, +130,-134, +8,52, +218,-227, +-90,-125, +-11,-215, +103,-239, +174,171, +199,161, +109,85, +-161,-92, +-38,-294, +82,41, +-43,-141, +-149,97, +90,91, +41,212, +-4,105, +-153,23, +92,-111, +-133,172, +84,-297, +12,93, +-97,90, +-33,-6, +-30,-151, +97,25, +131,-79, +-149,38, +64,65, +88,262, +-61,-52, +-58,252, +-40,146, +-210,-90, +66,18, +18,223, +106,167, +33,94, +240,156, +-15,-7, +136,-201, +-25,-33, +-26,-158, +243,-107, +-31,-115, +199,55, +133,-89, +-228,123, +-176,-20, +-12,-140, +98,69, +27,23, +156,68, +72,-115, +-142,149, +-157,-6, +-155,73, +93,96, +-34,21, +-165,150, +-120,14, +-205,88, +-30,-57, +158,-140, +12,58, +-96,-57, +-92,257, +-259,96, +65,-11, +236,121, +-9,111, +30,154, +252,-45, +-18,-180, +69,-92, +78,89, +25,93, +-42,-164, +35,-53, +48,-43, +247,-145, +-283,-121, +-279,189, +132,190, +50,-14, +87,27, +-67,123, +94,135, +-54,-275, +80,-162, +27,10, +-88,6, +56,171, +42,-153, +234,48, +30,21, +240,-53, +222,48, +-148,68, +114,-49, +76,-124, +-79,101, +-24,-61, +-3,-60, +132,-4, +18,-93, +50,114, +-62,131, +-39,-222, +-116,-36, +47,3, +-52,255, +-109,114, +106,85, +29,-50, +108,-126, +-153,110, +279,140, +-52,20, +107,-48, +-288,-186, +6,146, +78,-265, +150,41, +31,13, +32,-77, +239,-137, +-202,-144, +114,-65, +-6,-104, +-153,20, +62,22, +154,189, +-155,145, +11,145, +53,-242, +193,27, +-59,-1, +-26,-141, +35,108, +-49,174, +13,33, +32,157, +114,95, +18,114, +127,285, +28,-62, +213,46, +-251,-92, +-131,-90, +-36,7, +-165,6, +83,149, +92,-67, +97,-35, +9,227, +75,-161, +-7,-7, +147,-49, +-258,63, +24,-103, +234,-129, +-26,-42, +-79,-75, +-43,8, +-178,-209, +23,120, +-47,97, +196,-120, +-18,-85, +-27,-151, +64,-185, +212,63, +-29,106, +-19,-61, +111,49, +-222,-104, +65,-9, +-111,107, +-26,-160, +-231,140, +44,177, +-79,160, +-124,-126, +139,-37, +68,21, +-83,-159, +-115,-125, +-29,-102, +161,-117, +-123,-1, +-16,21, +-87,-127, +-239,-65, +101,46, +40,-85, +-294,-73, +163,177, +85,32, +330,-67, +-154,-20, +92,-94, +-51,-53, +5,61, +-73,90, +-132,-23, +-195,-66, +66,-50, +-190,222, +-59,-16, +-91,-66, +48,8, +37,187, +-21,259, +-149,211, +-31,-170, +-7,-80, +-78,25, +-9,14, +-95,-81, +-13,-79, +-212,36, +-8,-26, +-13,236, +124,105, +42,-98, +17,30, +123,-61, +141,-182, +-190,-100, +101,29, +73,-168, +-102,44, +-24,79, +53,159, +-145,69, +-74,-196, +-93,15, +72,12, +-20,41, +38,-115, +70,50, +-89,220, +-160,114, +117,-91, +124,3, +68,150, +-21,94, +89,144, +50,83, +381,9, +-42,-12, +-99,96, +83,-138, +-204,91, +-208,110, +89,-104, +157,-38, +13,-45, +4,272, +-89,-49, +163,92, +-116,11, +-50,-154, +216,41, +-130,-149, +-146,-22, +-13,84, +123,-113, +-108,-67, +-128,-171, +122,35, +94,35, +-93,-113, +125,62, +251,61, +-79,20, +111,-5, +-65,38, +-30,-6, +-62,4, +38,138, +-27,51, +144,5, +122,-102, +125,97, +111,-139, +-145,155, +218,136, +-70,203, +35,1, +6,-82, +76,-158, +59,161, +19,-21, +21,41, +90,116, +78,66, +31,-236, +-168,156, +-153,11, +89,142, +112,69, +260,-61, +-41,-159, +16,-17, +-88,85, +117,21, +233,93, +-110,-35, +-55,19, +-44,155, +-238,-17, +169,-55, +-161,126, +100,-76, +-80,30, +111,11, +-70,51, +129,80, +-13,127, +-78,-79, +25,-237, +-145,-94, +-151,124, +-63,-39, +30,-10, +-82,-99, +0,-86, +-62,85, +-109,2, +92,160, +-180,-102, +-193,96, +97,-92, +114,115, +-32,65, +35,110, +144,223, +111,0, +77,89, +-43,65, +-94,85, +-89,195, +70,-25, +-156,105, +-35,210, +-45,136, +-141,-104, +-36,-61, +-56,-2, +-51,51, +-78,49, +-63,105, +13,-94, +7,-39, +-31,90, +117,52, +-39,114, +146,-163, +-90,22, +-25,108, +194,56, +109,-60, +-80,9, +-135,132, +-188,-94, +-154,48, +34,45, +-29,-194, +-148,-101, +53,48, +7,-110, +-80,162, +34,189, +-28,31, +76,78, +6,-216, +44,-69, +123,66, +44,16, +159,223, +-123,-15, +-180,-195, +180,22, +-29,7, +-39,-31, +114,-64, +-4,5, +-120,216, +110,-124, +-81,86, +11,-38, +51,35, +13,184, +-21,-33, +52,14, +49,110, +-15,-95, +-116,107, +-33,-94, +79,89, +-58,-134, +40,-49, +-70,-46, +-79,187, +12,113, +-141,-144, +3,40, +-105,17, +-17,157, +-15,-172, +57,-76, +5,93, +-16,84, +30,-59, +110,-6, +32,26, +-36,246, +-38,-62, +58,32, +-9,72, +-279,61, +-212,-61, +-113,-90, +-90,-102, +-51,30, +165,-70, +-23,-15, +89,70, +47,-220, +-94,101, +-44,47, +22,55, +-21,153, +-106,161, +24,-51, +-88,122, +-165,-77, +107,-58, +-199,-19, +18,14, +87,-72, +37,-41, +115,48, +54,-37, +143,-13, +-41,-156, +12,55, +59,30, +172,-110, +28,-85, +3,-93, +30,19, +211,39, +-2,77, +40,-171, +-139,37, +185,49, +-80,86, +106,5, +102,-63, +49,40, +1,-24, +17,-68, +84,56, +-43,91, +-59,-72, +32,67, +4,163, +-76,-34, +106,114, +133,-41, +-137,96, +19,-174, +-47,162, +79,106, +14,73, +-59,-25, +-159,75, +-21,88, +7,138, +-28,-48, +8,2, +-168,78, +52,158, +39,-37, +-70,149, +-51,81, +29,-130, +-30,60, +-100,-136, +59,-22, +-65,-81, +102,-56, +83,-15, +121,-61, +79,32, +86,-53, +-63,-60, +27,35, +-135,31, +69,92, +-6,9, +-112,58, +37,-117, +-126,-110, +-85,-179, +103,-212, +72,-71, +-74,104, +116,-38, +37,-77, +147,88, +-62,59, +-43,25, +77,5, +88,0, +-104,22, +-66,40, +7,-80, +176,-12, +-133,-91, +0,-6, +60,-97, +101,-5, +70,-38, +-153,-64, +-11,83, +-35,-37, +80,1, +-122,-50, +131,-87, +-34,90, +-5,45, +104,-60, +1,48, +84,58, +53,-80, +-122,71, +117,-38, +4,-28, +93,2, +-72,50, +-52,-19, +73,37, +-74,20, +-76,-21, +-15,-137, +76,52, +170,182, +-72,-48, +-61,89, +-10,64, +-158,-77, +169,111, +154,-42, +-25,-71, +89,62, +-47,-16, +-111,-85, +-52,-17, +-18,11, +-6,-106, +40,-136, +-9,-100, +56,-66, +-37,96, +10,126, +110,-24, +-29,-18, +-34,10, +-38,105, +154,-55, +5,78, +-53,-24, +15,-31, +-6,24, +74,-94, +33,-61, +0,42, +-68,-112, +-29,-57, +58,-3, +160,-101, +54,-20, +36,-21, +40,-11, +149,-107, +18,12, +-11,25, +137,73, +24,122, +117,1, +99,-30, +-42,117, +70,24, +-56,-132, +52,-53, +-29,-39, +138,6, +-45,-56, +-29,-42, +-16,9, +-89,-24, +43,-23, +48,-114, +-51,-51, +-161,-44, +-28,-8, +62,6, +50,2, +39,75, +28,-57, +-57,77, +68,-85, +-24,88, +2,-110, +29,39, +26,-117, +45,-65, +12,50, +-20,21, +77,116, +35,3, +-32,-117, +-72,116, +-37,47, +40,128, +40,23, +123,-76, +-72,-102, +11,5, +-44,75, +83,17, +24,35, +28,13, +-4,13, +26,59, +-131,24, +31,-58, +109,94, +113,-42, +-10,72, +65,-37, +-85,92, +34,112, +-33,6, +35,47, +65,-10, +26,-21, +-27,-48, +26,42, +15,-57, +-20,77, +64,59, +4,77, +-29,-9, +-11,1, +24,85, +-48,-50, +-127,-88, +49,75, +-25,29, +-26,-157, +17,32, +-106,32, +13,-1, +-7,-14, +-22,-18, +94,71, +10,-82, +86,28, +-98,112, +-10,2, +54,-101, +2,-47, +7,-38, +-33,-9, +49,26, +-12,60, +33,172, +75,-57, +63,14, +38,55, +29,48, +-42,22, +27,-10, +137,-92, +9,30, +-57,60, +13,-37, +49,0, +-78,52, +4,-142, +-27,-8, +64,38, +104,-63, +-67,-15, +-14,64, +-8,-40, +-48,8, +-86,7, +0,64, +-27,22, +-16,16, +54,27, +63,46, +44,-63, +-33,-34, +-5,-63, +-47,18, +3,-55, +30,-6, +-71,4, +-22,-44, +42,-31, +136,-23, +76,14, +-3,15, +-37,-3, +36,-95, +24,11, +44,-52, +-61,-30, +-11,-75, +55,-20, +16,-17, +-37,23, +-7,-39, +-30,47, +-30,-5, +40,182, +37,-68, +-8,-31, +-35,-2, +9,-2, +-18,-29, +-49,-73, +4,-20, +2,18, +-44,-25, +-38,55, +-53,-63, +-47,-56, +-6,72, +-7,12, +-37,-34, +28,-10, +120,-27, +-24,-26, +19,-79, +-15,42, +6,-68, +1,10, +-45,-25, +30,17, +25,9, +-3,29, +-31,66, +-62,-36, +-54,8, +-3,42, +18,40, +9,-75, +0,18, +-75,-49, +26,-51, +-28,51, +-55,34, +-14,-8, +-1,-5, +17,-57, +-60,77, +27,-1, +-5,-11, +34,42, +-17,54, +0,-36, +63,13, +-42,-37, +-22,-72, +7,-3, +-50,-18, +53,74, +29,-1, +60,27, +40,17, +10,27, +46,-12, +40,-2, +12,2, +-8,-6, +-17,-6, +-15,23, +-8,70, +-32,-60, +97,1, +29,33, +8,-3, +5,-20, +-14,6, +-46,-23, +-11,30, +-52,-17, +-27,57, +31,2, +-38,15, +-2,58, +-41,-40, +26,-23, +-61,-43, +15,75, +58,-21, +-5,39, +-10,-28, +-12,42, +4,4, +52,-13, +38,-16, +34,-2, +-54,0, +-6,-41, +1,9, +25,1, +9,11, +-36,16, +-4,27, +11,-37, +-21,-2, +7,30, +-20,-14, +5,15, +19,17, +-5,53, +-6,41, +2,-1, +9,58, +-28,-18, +57,-13, +-15,17, +-61,-1, +-10,7, +-11,0, +38,14, +12,-20, +-10,53, +35,-5, +46,-52, +-26,-28, +-41,0, +13,55, +-27,-16, +-25,-12, +18,19, +20,13, +-28,-10, +-23,35, +-7,14, +10,13, +48,14, +0,23, +1,14, +34,-24, +14,-48, +24,3, +-19,8, +-4,5, +-16,11, +4,-28, +28,-46, +-7,-2, +27,-8, +11,-9, +-4,11, +25,-49, +-3,-21, +4,26, +-9,9, +25,8, +-12,19, +-7,0, +0,-41, +-2,-10, +15,7, +-15,15, +-3,34, +-23,-9, +-11,20, +-21,4, +-11,-13, +-9,34, +17,7, +22,15, +14,6, +29,18, +6,-17, +-15,-2, +21,-17, +23,-11, +12,4, +2,6, +38,-3, +-17,4, +-1,-5, +5,17, +-17,6, +-10,-19, +30,0, +-17,5, +-3,-8, +-8,9, +12,-12, +-15,1, +19,-11, +19,12, +8,2, +2,-9, +7,-6, +-26,8, +1,-6, +-19,-9, +0,4, +31,20, +-2,14, +-13,7, +-13,-2, +-18,2, +-7,0, +-7,19, +4,-5, +-14,6, +5,5, +2,-6, +0,-4, +-7,-1, +6,-9, +-13,1, +20,10, +-11,7, +-3,3, +12,-8, +-6,1, +-1,12, +7,4, +-3,6, +-6,-8, +19,-6, +-5,3, +-1,0, +6,8, +-10,-2, +-6,8, +5,-2, +-3,2, +-2,5, +9,2, +-8,0, +-1,-2, +2,-1, +3,-1, +-1,-7, +3,1, +0,-3, +-1,-3, +6,-4, +-2,0, +-2,2, +5,1, +-4,0, +-5,-3, +5,0, +-3,-2, +-2,-1, +6,0, +-3,1, +-3,0, +6,0, +-3,0, +-3,-1, +6,0, +-2,1, +-3,2, +5,0, +-5,3, +-4,0, +5,-1, +-2,-2, +-2,0, +6,4, +-1,3, +0,3, +3,-1, +-1,7, +3,1, +2,1, +-1,2, +-8,0, +9,-2, +-2,-5, +-3,-2, +5,2, +-6,-8, +-10,2, +6,-8, +-1,0, +-5,-3, +19,6, +-6,8, +-3,-6, +7,-4, +-1,-12, +-6,-1, +12,8, +-3,-3, +-11,-7, +20,-10, +-13,-1, +6,9, +-7,1, +0,4, +2,6, +5,-5, +-14,-6, +4,5, +-7,-19, +-7,0, +-18,-2, +-13,2, +-13,-7, +-2,-14, +31,-20, +0,-4, +-19,9, +1,6, +-26,-8, +7,6, +2,9, +8,-2, +19,-12, +19,11, +-15,-1, +12,12, +-8,-9, +-3,8, +-17,-5, +30,0, +-10,19, +-17,-6, +5,-17, +-1,5, +-17,-4, +38,3, +2,-6, +12,-4, +23,11, +21,17, +-15,2, +6,17, +29,-18, +14,-6, +22,-15, +17,-7, +-9,-34, +-11,13, +-21,-4, +-11,-20, +-23,9, +-3,-34, +-15,-15, +15,-7, +-2,10, +0,41, +-7,0, +-12,-19, +25,-8, +-9,-9, +4,-26, +-3,21, +25,49, +-4,-11, +11,9, +27,8, +-7,2, +28,46, +4,28, +-16,-11, +-4,-5, +-19,-8, +24,-3, +14,48, +34,24, +1,-14, +0,-23, +48,-14, +10,-13, +-7,-14, +-23,-35, +-28,10, +20,-13, +18,-19, +-25,12, +-27,16, +13,-55, +-41,0, +-26,28, +46,52, +35,5, +-10,-53, +12,20, +38,-14, +-11,0, +-10,-7, +-61,1, +-15,-17, +57,13, +-28,18, +9,-58, +2,1, +-6,-41, +-5,-53, +19,-17, +5,-15, +-20,14, +7,-30, +-21,2, +11,37, +-4,-27, +-36,-16, +9,-11, +25,-1, +1,-9, +-6,41, +-54,0, +34,2, +38,16, +52,13, +4,-4, +-12,-42, +-10,28, +-5,-39, +58,21, +15,-75, +-61,43, +26,23, +-41,40, +-2,-58, +-38,-15, +31,-2, +-27,-57, +-52,17, +-11,-30, +-46,23, +-14,-6, +5,20, +8,3, +29,-33, +97,-1, +-32,60, +-8,-70, +-15,-23, +-17,6, +-8,6, +12,-2, +40,2, +46,12, +10,-27, +40,-17, +60,-27, +29,1, +53,-74, +-50,18, +7,3, +-22,72, +-42,37, +63,-13, +0,36, +-17,-54, +34,-42, +-5,11, +27,1, +-60,-77, +17,57, +-1,5, +-14,8, +-55,-34, +-28,-51, +26,51, +-75,49, +0,-18, +9,75, +18,-40, +-3,-42, +-54,-8, +-62,36, +-31,-66, +-3,-29, +25,-9, +30,-17, +-45,25, +1,-10, +6,68, +-15,-42, +19,79, +-24,26, +120,27, +28,10, +-37,34, +-7,-12, +-6,-72, +-47,56, +-53,63, +-38,-55, +-44,25, +2,-18, +4,20, +-49,73, +-18,29, +9,2, +-35,2, +-8,31, +37,68, +40,-182, +-30,5, +-30,-47, +-7,39, +-37,-23, +16,17, +55,20, +-11,75, +-61,30, +44,52, +24,-11, +36,95, +-37,3, +-3,-15, +76,-14, +136,23, +42,31, +-22,44, +-71,-4, +30,6, +3,55, +-47,-18, +-5,63, +-33,34, +44,63, +63,-46, +54,-27, +-16,-16, +-27,-22, +0,-64, +-86,-7, +-48,-8, +-8,40, +-14,-64, +-67,15, +104,63, +64,-38, +-27,8, +4,142, +-78,-52, +49,0, +13,37, +-57,-60, +9,-30, +137,92, +27,10, +-42,-22, +29,-48, +38,-55, +63,-14, +75,57, +33,-172, +-12,-60, +49,-26, +-33,9, +7,38, +2,47, +54,101, +-10,-2, +-98,-112, +86,-28, +10,82, +94,-71, +-22,18, +-7,14, +13,1, +-106,-32, +17,-32, +-26,157, +-25,-29, +49,-75, +-127,88, +-48,50, +24,-85, +-11,-1, +-29,9, +4,-77, +64,-59, +-20,-77, +15,57, +26,-42, +-27,48, +26,21, +65,10, +35,-47, +-33,-6, +34,-112, +-85,-92, +65,37, +-10,-72, +113,42, +109,-94, +31,58, +-131,-24, +26,-59, +-4,-13, +28,-13, +24,-35, +83,-17, +-44,-75, +11,-5, +-72,102, +123,76, +40,-23, +40,-128, +-37,-47, +-72,-116, +-32,117, +35,-3, +77,-116, +-20,-21, +12,-50, +45,65, +26,117, +29,-39, +2,110, +-24,-88, +68,85, +-57,-77, +28,57, +39,-75, +50,-2, +62,-6, +-28,8, +-161,44, +-51,51, +48,114, +43,23, +-89,24, +-16,-9, +-29,42, +-45,56, +138,-6, +-29,39, +52,53, +-56,132, +70,-24, +-42,-117, +99,30, +117,-1, +24,-122, +137,-73, +-11,-25, +18,-12, +149,107, +40,11, +36,21, +54,20, +160,101, +58,3, +-29,57, +-68,112, +0,-42, +33,61, +74,94, +-6,-24, +15,31, +-53,24, +5,-78, +154,55, +-38,-105, +-34,-10, +-29,18, +110,24, +10,-126, +-37,-96, +56,66, +-9,100, +40,136, +-6,106, +-18,-11, +-52,17, +-111,85, +-47,16, +89,-62, +-25,71, +154,42, +169,-111, +-158,77, +-10,-64, +-61,-89, +-72,48, +170,-182, +76,-52, +-15,137, +-76,21, +-74,-20, +73,-37, +-52,19, +-72,-50, +93,-2, +4,28, +117,38, +-122,-71, +53,80, +84,-58, +1,-48, +104,60, +-5,-45, +-34,-90, +131,87, +-122,50, +80,-1, +-35,37, +-11,-83, +-153,64, +70,38, +101,5, +60,97, +0,6, +-133,91, +176,12, +7,80, +-66,-40, +-104,-22, +88,0, +77,-5, +-43,-25, +-62,-59, +147,-88, +37,77, +116,38, +-74,-104, +72,71, +103,212, +-85,179, +-126,110, +37,117, +-112,-58, +-6,-9, +69,-92, +-135,-31, +27,-35, +-63,60, +86,53, +79,-32, +121,61, +83,15, +102,56, +-65,81, +59,22, +-100,136, +-30,-60, +29,130, +-51,-81, +-70,-149, +39,37, +52,-158, +-168,-78, +8,-2, +-28,48, +7,-138, +-21,-88, +-159,-75, +-59,25, +14,-73, +79,-106, +-47,-162, +19,174, +-137,-96, +133,41, +106,-114, +-76,34, +4,-163, +32,-67, +-59,72, +-43,-91, +84,-56, +17,68, +1,24, +49,-40, +102,63, +106,-5, +-80,-86, +185,-49, +-139,-37, +40,171, +-2,-77, +211,-39, +30,-19, +3,93, +28,85, +172,110, +59,-30, +12,-55, +-41,156, +143,13, +54,37, +115,-48, +37,41, +87,72, +18,-14, +-199,19, +107,58, +-165,77, +-88,-122, +24,51, +-106,-161, +-21,-153, +22,-55, +-44,-47, +-94,-101, +47,220, +89,-70, +-23,15, +165,70, +-51,-30, +-90,102, +-113,90, +-212,61, +-279,-61, +-9,-72, +58,-32, +-38,62, +-36,-246, +32,-26, +110,6, +30,59, +-16,-84, +5,-93, +57,76, +-15,172, +-17,-157, +-105,-17, +3,-40, +-141,144, +12,-113, +-79,-187, +-70,46, +40,49, +-58,134, +79,-89, +-33,94, +-116,-107, +-15,95, +49,-110, +52,-14, +-21,33, +13,-184, +51,-35, +11,38, +-81,-86, +110,124, +-120,-216, +-4,-5, +114,64, +-39,31, +-29,-7, +180,-22, +-180,195, +-123,15, +159,-223, +44,-16, +123,-66, +44,69, +6,216, +76,-78, +-28,-31, +34,-189, +-80,-162, +7,110, +53,-48, +-148,101, +-29,194, +34,-45, +-154,-48, +-188,94, +-135,-132, +-80,-9, +109,60, +194,-56, +-25,-108, +-90,-22, +146,163, +-39,-114, +117,-52, +-31,-90, +7,39, +13,94, +-63,-105, +-78,-49, +-51,-51, +-56,2, +-36,61, +-141,104, +-45,-136, +-35,-210, +-156,-105, +70,25, +-89,-195, +-94,-85, +-43,-65, +77,-89, +111,0, +144,-223, +35,-110, +-32,-65, +114,-115, +97,92, +-193,-96, +-180,102, +92,-160, +-109,-2, +-62,-85, +0,86, +-82,99, +30,10, +-63,39, +-151,-124, +-145,94, +25,237, +-78,79, +-13,-127, +129,-80, +-70,-51, +111,-11, +-80,-30, +100,76, +-161,-126, +169,55, +-238,17, +-44,-155, +-55,-19, +-110,35, +233,-93, +117,-21, +-88,-85, +16,17, +-41,159, +260,61, +112,-69, +89,-142, +-153,-11, +-168,-156, +31,236, +78,-66, +90,-116, +21,-41, +19,21, +59,-161, +76,158, +6,82, +35,-1, +-70,-203, +218,-136, +-145,-155, +111,139, +125,-97, +122,102, +144,-5, +-27,-51, +38,-138, +-62,-4, +-30,6, +-65,-38, +111,5, +-79,-20, +251,-61, +125,-62, +-93,113, +94,-35, +122,-35, +-128,171, +-108,67, +123,113, +-13,-84, +-146,22, +-130,149, +216,-41, +-50,154, +-116,-11, +163,-92, +-89,49, +4,-272, +13,45, +157,38, +89,104, +-208,-110, +-204,-91, +83,138, +-99,-96, +-42,12, +381,-9, +50,-83, +89,-144, +-21,-94, +68,-150, +124,-3, +117,91, +-160,-114, +-89,-220, +70,-50, +38,115, +-20,-41, +72,-12, +-93,-15, +-74,196, +-145,-69, +53,-159, +-24,-79, +-102,-44, +73,168, +101,-29, +-190,100, +141,182, +123,61, +17,-30, +42,98, +124,-105, +-13,-236, +-8,26, +-212,-36, +-13,79, +-95,81, +-9,-14, +-78,-25, +-7,80, +-31,170, +-149,-211, +-21,-259, +37,-187, +48,-8, +-91,66, +-59,16, +-190,-222, +66,50, +-195,66, +-132,23, +-73,-90, +5,-61, +-51,53, +92,94, +-154,20, +330,67, +85,-32, +163,-177, +-294,73, +40,85, +101,-46, +-239,65, +-87,127, +-16,-21, +-123,1, +161,117, +-29,102, +-115,125, +-83,159, +68,-21, +139,37, +-124,126, +-79,-160, +44,-177, +-231,-140, +-26,160, +-111,-107, +65,9, +-222,104, +111,-49, +-19,61, +-29,-106, +212,-63, +64,185, +-27,151, +-18,85, +196,120, +-47,-97, +23,-120, +-178,209, +-43,-8, +-79,75, +-26,42, +234,129, +24,103, +-258,-63, +147,49, +-7,7, +75,161, +9,-227, +97,35, +92,67, +83,-149, +-165,-6, +-36,-7, +-131,90, +-251,92, +213,-46, +28,62, +127,-285, +18,-114, +114,-95, +32,-157, +13,-33, +-49,-174, +35,-108, +-26,141, +-59,1, +193,-27, +53,242, +11,-145, +-155,-145, +154,-189, +62,-22, +-153,-20, +-6,104, +114,65, +-202,144, +239,137, +32,77, +31,-13, +150,-41, +78,265, +6,-146, +-288,186, +107,48, +-52,-20, +279,-140, +-153,-110, +108,126, +29,50, +106,-85, +-109,-114, +-52,-255, +47,-3, +-116,36, +-39,222, +-62,-131, +50,-114, +18,93, +132,4, +-3,60, +-24,61, +-79,-101, +76,124, +114,49, +-148,-68, +222,-48, +240,53, +30,-21, +234,-48, +42,153, +56,-171, +-88,-6, +27,-10, +80,162, +-54,275, +94,-135, +-67,-123, +87,-27, +50,14, +132,-190, +-279,-189, +-283,121, +247,145, +48,43, +35,53, +-42,164, +25,-93, +78,-89, +69,92, +-18,180, +252,45, +30,-154, +-9,-111, +236,-121, +65,11, +-259,-96, +-92,-257, +-96,57, +12,-58, +158,140, +-30,57, +-205,-88, +-120,-14, +-165,-150, +-34,-21, +93,-96, +-155,-73, +-157,6, +-142,-149, +72,115, +156,-68, +27,-23, +98,-69, +-12,140, +-176,20, +-228,-123, +133,89, +199,-55, +-31,115, +243,107, +-26,158, +-25,33, +136,201, +-15,7, +240,-156, +33,-94, +106,-167, +18,-223, +66,-18, +-210,90, +-40,-146, +-58,-252, +-61,52, +88,-262, +64,-65, +-149,-38, +131,79, +97,-25, +-30,151, +-33,6, +-97,-90, +12,-93, +84,297, +-133,-172, +92,111, +-153,-23, +-4,-105, +41,-212, +90,-91, +-149,-97, +-43,141, +82,-41, +-38,294, +-161,92, +109,-85, +199,-161, +174,-171, +103,239, +-11,215, +-90,125, +218,227, +8,-52, +130,134, +3,-4, +42,77, +-17,-72, +-85,4, +-60,8, +-30,233, +-69,-309, +157,170, +220,-67, +-86,-12, +-42,34, +30,-66, +105,0, +266,-18, +-63,53, +-70,-121, +-107,-13, +-48,-217, +192,76, +-36,68, +203,15, +-18,201, +101,31, +-27,-80, +122,25, +161,22, +-101,-123, +-42,317, +30,-150, +-188,-118, +-81,-27, +-143,-31, +1,-21, +-231,-136, +-169,-80, +0,-31, +104,-55, +133,-7, +-155,170, +-65,65, +-260,114, +-113,7, +-335,9, +-2,-129, +225,38, +73,54, +11,0, +7,153, +27,3, +96,4, +-18,121, +-180,86, +-36,-160, +-105,-110, +-112,-34, +234,-220, +-11,308, +26,-145, +270,-161, +-47,337, +-43,-94, +-96,-311, +39,136, +68,169, +-18,116, +261,71, +65,91, +54,-31, +-128,187, +-127,-61, +154,-7, +129,-94, +-112,132, +174,27, +277,140, +151,-103, +-5,47, +-56,-57, +83,42, +28,-23, +-27,-174, +137,166, +-3,94, +-50,53, +131,-22, +108,-375, +135,-68, +74,56, +-74,207, +-40,-40, +-81,264, +336,-164, +-72,-280, +-186,-199, +-133,178, +116,1, +-136,-146, +114,45, +-175,83, +-124,-15, +3,-13, +92,-48, +149,-68, +-160,-10, +-136,-17, +23,-121, +161,32, +192,-49, +-24,169, +-106,-205, +279,-44, +119,-15, +188,248, +178,23, +69,-108, +-22,-28, +83,201, +20,-35, +80,47, +49,-99, +76,-165, +-117,71, +129,-103, +268,-71, +-17,-42, +-99,36, +49,-187, +-84,-104, +-29,153, +122,31, +-164,-47, +-44,-57, +184,150, +84,143, +192,-76, +-29,-87, +68,-9, +85,-104, +-14,15, +33,48, +-32,-145, +95,61, +34,151, +-356,-95, +-38,-242, +-40,207, +-46,-52, +19,-230, +109,23, +117,73, +1,-25, +-82,-45, +54,90, +222,81, +-25,-26, +134,-53, +-31,367, +-175,-61, +-65,-159, +-33,-12, +210,54, +-94,81, +93,237, +-35,34, +124,-266, +-80,-293, +22,-245, +101,-258, +-91,-123, +-5,-144, +-283,-16, +100,-85, +-108,0, +128,-46, +-174,163, +40,177, +17,15, +-135,-45, +-31,-196, +53,87, +-39,91, +71,5, +-228,117, +193,-110, +-17,-76, +-248,67, +-162,223, +-63,-185, +24,38, +115,-18, +12,17, +-163,-16, +-106,-101, +-67,93, +150,-77, +269,90, +109,-203, +-107,-166, +-38,-110, +202,169, +-112,147, +232,107, +120,137, +-64,38, +-175,60, +-70,10, +-5,180, +113,132, +-33,-3, +-63,-25, +107,-41, +78,25, +-268,56, +101,5, +-66,-80, +5,55, +82,-238, +-122,82, +-262,-40, +18,16, +-60,-114, +22,-211, +-350,-59, +137,137, +102,-99, +-23,-32, +146,14, +-153,67, +149,95, +-99,211, +-226,-22, +137,216, +59,61, +-83,-136, +88,-99, +205,-67, +-131,44, +25,-42, +-195,-101, +-2,59, +10,85, +72,-94, +72,82, +45,-110, +-161,-9, +-154,-152, +-42,-36, +-78,-113, +30,-3, +-44,-119, +77,-38, +-109,0, +20,252, +96,-249, +-187,-6, +-11,88, +235,-55, +-36,-131, +77,-72, +159,77, +88,-40, +157,15, +-185,95, +-135,42, +38,-27, +-59,266, +-92,37, +146,116, +-67,-117, +77,38, +0,78, +-3,88, +57,-17, +106,-23, +-77,-42, +-86,91, +159,-29, +10,144, +-128,-7, +113,-184, +-49,79, +168,103, +-56,-61, +-38,79, +-35,-59, +101,167, +149,5, +200,-41, +135,24, +-118,-228, +94,-97, +79,5, +26,67, +94,118, +-15,-72, +-120,156, +199,96, +136,-55, +75,-127, +75,35, +-52,-77, +16,12, +86,116, +-18,-94, +-73,-52, +15,43, +73,17, +137,-55, +-97,159, +111,-159, +-148,28, +264,-115, +2,-118, +-85,-84, +3,18, +-160,-58, +11,-57, +-20,-190, +-35,-202, +199,85, +20,147, +-2,-83, +44,-315, +-34,-253, +-21,-89, +101,-114, +-6,-6, +-48,165, +131,-258, +-39,-129, +34,-66, +167,7, +109,226, +48,-27, +40,130, +-121,135, +-41,191, +2,150, +-214,70, +102,134, +-132,172, +133,-68, +221,82, +54,-59, +-103,-21, +-8,33, +-184,47, +-15,205, +137,-32, +-40,-2, +17,169, +33,66, +-62,-143, +-133,173, +32,-143, +-36,107, +47,116, +-116,-35, +-20,-23, +63,64, +-122,47, +146,-184, +-207,-7, +121,54, +-13,-43, +-38,-1, +27,180, +72,111, +-16,-75, +-207,-45, +145,16, +-103,-70, +200,60, +124,117, +-68,-31, +86,9, +62,120, +-19,40, +-44,120, +92,-186, +3,-24, +-99,-131, +105,-134, +-13,-105, +73,-53, +13,-31, +162,253, +-153,-11, +-102,168, +19,70, +-164,208, +-152,71, +-128,145, +-40,-185, +-65,47, +14,157, +158,100, +-18,-98, +-25,1, +13,191, +-36,-42, +215,8, +22,-73, +134,71, +-115,39, +27,104, +94,-68, +-4,40, +215,9, +-19,162, +-67,124, +-2,-144, +-58,-131, +5,102, +-102,23, +-9,-2, +15,-160, +-135,-89, +17,13, +105,-139, +-193,-148, +-8,-108, +-138,167, +-32,16, +25,40, +-172,-64, +-44,-25, +-11,86, +-130,55, +36,-51, +41,-70, +155,3, +-89,30, +-65,265, +-14,-34, +54,-9, +15,-43, +-162,-29, +158,-155, +-45,-56, +3,-117, +31,12, +-3,74, +-69,-145, +15,242, +-111,-121, +-16,-54, +-49,174, +-58,82, +-73,227, +-189,6, +110,105, +-100,136, +-9,-58, +106,-59, +5,-27, +13,-97, +123,-201, +-65,78, +-98,142, +-115,-203, +-120,53, +61,99, +54,-5, +-137,1, +60,-4, +-102,201, +173,168, +-60,-18, +18,-4, +-20,-177, +35,-2, +52,-218, +-151,18, +6,99, +-77,57, +130,56, +144,-69, +63,-39, +-89,-149, +-6,-106, +-58,61, +178,-240, +-215,53, +81,-67, +67,-165, +86,48, +-102,-32, +-31,153, +59,-149, +148,131, +23,-232, +55,-38, +95,100, +61,102, +-88,206, +-158,25, +-118,184, +66,-6, +96,-212, +81,-9, +-47,-16, +231,-16, +94,27, +12,75, +-74,-7, +-33,-155, +-80,-39, +-28,135, +-97,161, +23,44, +-14,238, +121,150, +13,-50, +60,49, +-116,-99, +101,-116, +-92,104, +127,-59, +-130,142, +159,-67, +60,21, +-37,-159, +64,36, +-25,-151, +45,124, +-139,37, +126,-27, +41,-39, +-97,77, +-26,11, +73,90, +12,110, +-116,-83, +-151,30, +-26,15, +11,79, +-2,-28, +-19,44, +22,-157, +62,-38, +172,-176, +38,72, +-131,100, +-114,-75, +-80,25, +-175,86, +-233,116, +-3,32, +-71,-159, +63,-77, +100,-72, +-57,114, +-77,-111, +-13,-97, +-60,24, +-67,-143, +169,-164, +6,107, +-131,60, +-94,-8, +-55,-60, +-64,-31, +-48,-84, +-26,-15, +85,65, +-194,38, +-90,24, +5,-130, +117,-123, +104,-211, +-37,-86, +14,-84, +34,-137, +43,35, +-28,156, +-246,89, +50,-25, +-77,17, +13,-10, +52,-1, +84,-22, +-101,-116, +57,-147, +35,36, +54,79, +96,-65, +-2,-58, +-14,60, +-20,19, +72,25, +-16,-127, +66,121, +-179,-35, +21,-5, +-95,99, +56,18, +-40,78, +158,-124, +-94,155, +-23,-108, +-30,36, +-96,-38, +77,83, +106,28, +127,79, +160,-74, +51,-5, +135,-76, +-5,-40, +-155,-46, +-24,-35, +114,-41, +-18,161, +-26,89, +64,72, +-118,-27, +-91,142, +-18,29, +73,-95, +169,-130, +7,-64, +196,31, +68,100, +-129,23, +-1,44, +-128,86, +117,92, +-89,-71, +149,-41, +-86,23, +-77,132, +-15,-76, +-92,35, +4,-92, +-138,151, +25,-113, +-113,-54, +-125,79, +70,107, +-45,37, +62,69, +123,-140, +-72,-5, +-61,-13, +-122,31, +-1,11, +-135,-42, +82,57, +103,-34, +92,131, +107,-151, +-97,20, +24,22, +135,-16, +-81,-14, +-29,-109, +35,-118, +59,37, +-103,22, +-122,21, +17,41, +-65,34, +-20,-12, +74,9, +77,-61, +60,17, +34,-161, +224,-9, +-5,12, +-29,-107, +58,20, +-77,-52, +143,-35, +-86,16, +0,14, +29,-40, +-158,74, +-46,-37, +-18,28, +-36,-76, +-58,54, +104,27, +24,-103, +133,1, +-29,41, +-78,103, +2,-66, +42,-5, +15,-41, +19,-67, +-24,-21, +-53,-73, +116,1, +21,-12, +-18,-159, +-128,35, +-50,-27, +-41,9, +-26,-14, +-81,-70, +-79,20, +113,-16, +0,-94, +-83,57, +-42,-44, +33,-69, +96,72, +68,26, +-65,90, +35,10, +16,3, +57,7, +-3,-45, +28,160, +-83,-1, +54,64, +62,-20, +25,-39, +-63,40, +45,43, +135,40, +-47,-43, +-9,-44, +-20,-36, +130,-139, +51,-46, +112,-22, +0,-59, +120,-44, +15,7, +76,115, +-64,-61, +-76,69, +-54,16, +-54,-35, +-96,-10, +22,61, +-59,-24, +106,-35, +43,88, +-18,-20, +20,10, +43,76, +24,28, +-6,82, +-26,-76, +-7,14, +-34,-79, +39,56, +113,31, +1,-53, +-45,46, +59,-24, +-28,27, +-80,-92, +6,96, +68,-64, +-60,-7, +19,18, +71,-86, +-28,68, +67,-15, +-62,-82, +33,-13, +1,32, +63,-46, +27,46, +-4,35, +39,-30, +106,-25, +-39,-74, +-16,-16, +39,34, +-57,92, +54,40, +34,30, +71,-97, +56,39, +44,-77, +100,-28, +90,9, +-5,-47, +82,40, +10,84, +64,35, +-30,20, +-125,34, +-16,-19, +-22,34, +52,-2, +-51,1, +-80,35, +-71,-18, +-159,-17, +-56,31, +107,28, +1,11, +-79,77, +-64,-48, +-59,-46, +2,45, +0,-103, +-40,-14, +-59,81, +-6,-32, +-73,86, +38,-62, +-26,25, +31,12, +-8,71, +14,-22, +-26,-32, +-14,23, +15,3, +22,6, +-17,22, +-27,-25, +-7,51, +-51,96, +52,-2, +46,20, +10,-18, +-12,-4, +81,57, +-14,31, +-76,-21, +-12,35, +-66,1, +16,75, +32,94, +-15,8, +72,-10, +-44,-10, +11,9, +46,-22, +-3,99, +-35,-52, +-16,-18, +34,35, +38,9, +-28,-9, +35,-13, +-31,10, +-10,31, +44,9, +30,-1, +-18,-13, +20,59, +-35,-34, +87,9, +34,-1, +31,-34, +-8,-28, +40,-22, +7,-32, +-15,104, +16,40, +3,-25, +-81,64, +6,30, +41,-9, +-58,-17, +6,-13, +-8,19, +66,-8, +-47,-26, +-23,40, +-17,-33, +-9,3, +-50,-23, +-5,-56, +-47,-31, +13,-5, +-27,30, +20,26, +-4,5, +18,-31, +-7,8, +-37,-79, +13,31, +12,33, +-75,16, +-14,-7, +36,26, +4,-1, +64,-20, +12,-36, +41,-10, +27,54, +2,-57, +-31,45, +14,43, +-1,-31, +-1,-3, +-48,-83, +-48,49, +1,-30, +29,-64, +-49,-20, +16,8, +-46,-5, +8,22, +0,-39, +5,-2, +11,-22, +-3,34, +-22,-1, +11,-19, +34,19, +30,23, +26,-39, +-9,-38, +27,-13, +24,40, +28,16, +40,38, +28,-16, +-6,28, +-68,-27, +-12,6, +-19,80, +24,30, +-20,-18, +12,-27, +-24,-24, +0,-11, +26,29, +-41,14, +11,-22, +10,-39, +35,-41, +-26,-6, +-10,11, +2,18, +27,-62, +8,44, +3,5, +-3,-38, +-49,9, +25,-5, +41,-23, +9,21, +15,-34, +-14,28, +-9,-24, +-15,-7, +-6,-53, +-49,27, +-33,-1, +-44,-6, +-67,17, +-39,-14, +12,24, +26,-9, +28,13, +10,-3, +-12,36, +-25,-40, +11,-25, +17,14, +39,-9, +-32,25, +10,20, +35,14, +-21,-12, +-13,-2, +38,18, +-18,20, +-37,1, +16,-9, +-1,4, +-14,-27, +-20,-24, +20,-23, +6,28, +-8,3, +-8,-20, +6,24, +-5,1, +-17,-3, +-3,26, +-5,-7, +7,32, +27,22, +0,-17, +-24,-6, +21,5, +12,0, +-17,-8, +-14,1, +-3,-7, +0,-4, +-17,31, +4,17, +-12,-13, +-4,1, +-11,20, +-10,-8, +18,15, +3,5, +6,-7, +-12,13, +4,20, +17,7, +14,31, +-25,9, +2,1, +-5,-5, +14,15, +-11,19, +-2,0, +-4,-14, +-3,-8, +-3,3, +-4,19, +-4,-6, +2,-13, +6,1, +1,-14, +-7,11, +-1,-5, +9,-5, +-5,-16, +-33,3, +2,7, +5,15, +10,-18, +1,0, +16,9, +-15,1, +-13,11, +-8,7, +5,-4, +8,1, +1,7, +1,1, +-9,-2, +4,7, +4,-1, +-9,-6, +7,12, +-1,12, +4,0, +3,5, +1,0, +-8,3, +7,3, +0,-9, +1,-1, +3,11, +2,-2, +0,4, +9,3, +-1,-3, +-7,-1, +1,0, +2,-1, +-1,2, +-1,6, +0,-3, +2,0, +-4,5, +0,-6, +-1,-1, +-1,4, +1,-5, +0,0, +0,5, +0,-5, +0,0, +0,5, +0,-5, +0,0, +1,5, +-1,-4, +-1,1, +0,6, +-4,-5, +2,0, +0,3, +-1,-6, +-1,-2, +2,1, +1,0, +-7,1, +-1,3, +9,-3, +0,-4, +2,2, +3,-11, +1,1, +0,9, +7,-3, +-8,-3, +1,0, +3,-5, +4,0, +-1,-12, +7,-12, +-9,6, +4,1, +4,-7, +-9,2, +1,-1, +1,-7, +8,-1, +5,4, +-8,-7, +-13,-11, +-15,-1, +16,-9, +1,0, +10,18, +5,-15, +2,-7, +-33,-3, +-5,16, +9,5, +-1,5, +-7,-11, +1,14, +6,-1, +2,13, +-4,6, +-4,-19, +-3,-3, +-3,8, +-4,14, +-2,0, +-11,-19, +14,-15, +-5,5, +2,-1, +-25,-9, +14,-31, +17,-7, +4,-20, +-12,-13, +6,7, +3,-5, +18,-15, +-10,8, +-11,-20, +-4,-1, +-12,13, +4,-17, +-17,-31, +0,4, +-3,7, +-14,-1, +-17,8, +12,0, +21,-5, +-24,6, +0,17, +27,-22, +7,-32, +-5,7, +-3,-26, +-17,3, +-5,-1, +6,-24, +-8,20, +-8,-3, +6,-28, +20,23, +-20,24, +-14,27, +-1,-4, +16,9, +-37,-1, +-18,-20, +38,-18, +-13,2, +-21,12, +35,-14, +10,-20, +-32,-25, +39,9, +17,-14, +11,25, +-25,40, +-12,-36, +10,3, +28,-13, +26,9, +12,-24, +-39,14, +-67,-17, +-44,6, +-33,1, +-49,-27, +-6,53, +-15,7, +-9,24, +-14,-28, +15,34, +9,-21, +41,23, +25,5, +-49,-9, +-3,38, +3,-5, +8,-44, +27,62, +2,-18, +-10,-11, +-26,6, +35,41, +10,39, +11,22, +-41,-14, +26,-29, +0,11, +-24,24, +12,27, +-20,18, +24,-30, +-19,-80, +-12,-6, +-68,27, +-6,-28, +28,16, +40,-38, +28,-16, +24,-40, +27,13, +-9,38, +26,39, +30,-23, +34,-19, +11,19, +-22,1, +-3,-34, +11,22, +5,2, +0,39, +8,-22, +-46,5, +16,-8, +-49,20, +29,64, +1,30, +-48,-49, +-48,83, +-1,3, +-1,31, +14,-43, +-31,-45, +2,57, +27,-54, +41,10, +12,36, +64,20, +4,1, +36,-26, +-14,7, +-75,-16, +12,-33, +13,-31, +-37,79, +-7,-8, +18,31, +-4,-5, +20,-26, +-27,-30, +13,5, +-47,31, +-5,56, +-50,23, +-9,-3, +-17,33, +-23,-40, +-47,26, +66,8, +-8,-19, +6,13, +-58,17, +41,9, +6,-30, +-81,-64, +3,25, +16,-40, +-15,-104, +7,32, +40,22, +-8,28, +31,34, +34,1, +87,-9, +-35,34, +20,-59, +-18,13, +30,1, +44,-9, +-10,-31, +-31,-10, +35,13, +-28,9, +38,-9, +34,-35, +-16,18, +-35,52, +-3,-99, +46,22, +11,-9, +-44,10, +72,10, +-15,-8, +32,-94, +16,-75, +-66,-1, +-12,-35, +-76,21, +-14,-31, +81,-57, +-12,4, +10,18, +46,-20, +52,2, +-51,-96, +-7,-51, +-27,25, +-17,-22, +22,-6, +15,-3, +-14,-23, +-26,32, +14,22, +-8,-71, +31,-12, +-26,-25, +38,62, +-73,-86, +-6,32, +-59,-81, +-40,14, +0,103, +2,-45, +-59,46, +-64,48, +-79,-77, +1,-11, +107,-28, +-56,-31, +-159,17, +-71,18, +-80,-35, +-51,-1, +52,2, +-22,-34, +-16,19, +-125,-34, +-30,-20, +64,-35, +10,-84, +82,-40, +-5,47, +90,-9, +100,28, +44,77, +56,-39, +71,97, +34,-30, +54,-40, +-57,-92, +39,-34, +-16,16, +-39,74, +106,25, +39,30, +-4,-35, +27,-46, +63,46, +1,-32, +33,13, +-62,82, +67,15, +-28,-68, +71,86, +19,-18, +-60,7, +68,64, +6,-96, +-80,92, +-28,-27, +59,24, +-45,-46, +1,53, +113,-31, +39,-56, +-34,79, +-7,-14, +-26,76, +-6,-82, +24,-28, +43,-76, +20,-10, +-18,20, +43,-88, +106,35, +-59,24, +22,-61, +-96,10, +-54,35, +-54,-16, +-76,-69, +-64,61, +76,-115, +15,-7, +120,44, +0,59, +112,22, +51,46, +130,139, +-20,36, +-9,44, +-47,43, +135,-40, +45,-43, +-63,-40, +25,39, +62,20, +54,-64, +-83,1, +28,-160, +-3,45, +57,-7, +16,-3, +35,-10, +-65,-90, +68,-26, +96,-72, +33,69, +-42,44, +-83,-57, +0,94, +113,16, +-79,-20, +-81,70, +-26,14, +-41,-9, +-50,27, +-128,-35, +-18,159, +21,12, +116,-1, +-53,73, +-24,21, +19,67, +15,41, +42,5, +2,66, +-78,-103, +-29,-41, +133,-1, +24,103, +104,-27, +-58,-54, +-36,76, +-18,-28, +-46,37, +-158,-74, +29,40, +0,-14, +-86,-16, +143,35, +-77,52, +58,-20, +-29,107, +-5,-12, +224,9, +34,161, +60,-17, +77,61, +74,-9, +-20,12, +-65,-34, +17,-41, +-122,-21, +-103,-22, +59,-37, +35,118, +-29,109, +-81,14, +135,16, +24,-22, +-97,-20, +107,151, +92,-131, +103,34, +82,-57, +-135,42, +-1,-11, +-122,-31, +-61,13, +-72,5, +123,140, +62,-69, +-45,-37, +70,-107, +-125,-79, +-113,54, +25,113, +-138,-151, +4,92, +-92,-35, +-15,76, +-77,-132, +-86,-23, +149,41, +-89,71, +117,-92, +-128,-86, +-1,-44, +-129,-23, +68,-100, +196,-31, +7,64, +169,130, +73,95, +-18,-29, +-91,-142, +-118,27, +64,-72, +-26,-89, +-18,-161, +114,41, +-24,35, +-155,46, +-5,40, +135,76, +51,5, +160,74, +127,-79, +106,-28, +77,-83, +-96,38, +-30,-36, +-23,108, +-94,-155, +158,124, +-40,-78, +56,-18, +-95,-99, +21,5, +-179,35, +66,-121, +-16,127, +72,-25, +-20,-19, +-14,-60, +-2,58, +96,65, +54,-79, +35,-36, +57,147, +-101,116, +84,22, +52,1, +13,10, +-77,-17, +50,25, +-246,-89, +-28,-156, +43,-35, +34,137, +14,84, +-37,86, +104,211, +117,123, +5,130, +-90,-24, +-194,-38, +85,-65, +-26,15, +-48,84, +-64,31, +-55,60, +-94,8, +-131,-60, +6,-107, +169,164, +-67,143, +-60,-24, +-13,97, +-77,111, +-57,-114, +100,72, +63,77, +-71,159, +-3,-32, +-233,-116, +-175,-86, +-80,-25, +-114,75, +-131,-100, +38,-72, +172,176, +62,38, +22,157, +-19,-44, +-2,28, +11,-79, +-26,-15, +-151,-30, +-116,83, +12,-110, +73,-90, +-26,-11, +-97,-77, +41,39, +126,27, +-139,-37, +45,-124, +-25,151, +64,-36, +-37,159, +60,-21, +159,67, +-130,-142, +127,59, +-92,-104, +101,116, +-116,99, +60,-49, +13,50, +121,-150, +-14,-238, +23,-44, +-97,-161, +-28,-135, +-80,39, +-33,155, +-74,7, +12,-75, +94,-27, +231,16, +-47,16, +81,9, +96,212, +66,6, +-118,-184, +-158,-25, +-88,-206, +61,-102, +95,-100, +55,38, +23,232, +148,-131, +59,149, +-31,-153, +-102,32, +86,-48, +67,165, +81,67, +-215,-53, +178,240, +-58,-61, +-6,106, +-89,149, +63,39, +144,69, +130,-56, +-77,-57, +6,-99, +-151,-18, +52,218, +35,2, +-20,177, +18,4, +-60,18, +173,-168, +-102,-201, +60,4, +-137,-1, +54,5, +61,-99, +-120,-53, +-115,203, +-98,-142, +-65,-78, +123,201, +13,97, +5,27, +106,59, +-9,58, +-100,-136, +110,-105, +-189,-6, +-73,-227, +-58,-82, +-49,-174, +-16,54, +-111,121, +15,-242, +-69,145, +-3,-74, +31,-12, +3,117, +-45,56, +158,155, +-162,29, +15,43, +54,9, +-14,34, +-65,-265, +-89,-30, +155,-3, +41,70, +36,51, +-130,-55, +-11,-86, +-44,25, +-172,64, +25,-40, +-32,-16, +-138,-167, +-8,108, +-193,148, +105,139, +17,-13, +-135,89, +15,160, +-9,2, +-102,-23, +5,-102, +-58,131, +-2,144, +-67,-124, +-19,-162, +215,-9, +-4,-40, +94,68, +27,-104, +-115,-39, +134,-71, +22,73, +215,-8, +-36,42, +13,-191, +-25,-1, +-18,98, +158,-100, +14,-157, +-65,-47, +-40,185, +-128,-145, +-152,-71, +-164,-208, +19,-70, +-102,-168, +-153,11, +162,-253, +13,31, +73,53, +-13,105, +105,134, +-99,131, +3,24, +92,186, +-44,-120, +-19,-40, +62,-120, +86,-9, +-68,31, +124,-117, +200,-60, +-103,70, +145,-16, +-207,45, +-16,75, +72,-111, +27,-180, +-38,1, +-13,43, +121,-54, +-207,7, +146,184, +-122,-47, +63,-64, +-20,23, +-116,35, +47,-116, +-36,-107, +32,143, +-133,-173, +-62,143, +33,-66, +17,-169, +-40,2, +137,32, +-15,-205, +-184,-47, +-8,-33, +-103,21, +54,59, +221,-82, +133,68, +-132,-172, +102,-134, +-214,-70, +2,-150, +-41,-191, +-121,-135, +40,-130, +48,27, +109,-226, +167,-7, +34,66, +-39,129, +131,258, +-48,-165, +-6,6, +101,114, +-21,89, +-34,253, +44,315, +-2,83, +20,-147, +199,-85, +-35,202, +-20,190, +11,57, +-160,58, +3,-18, +-85,84, +2,118, +264,115, +-148,-28, +111,159, +-97,-159, +137,55, +73,-17, +15,-43, +-73,52, +-18,94, +86,-116, +16,-12, +-52,77, +75,-35, +75,127, +136,55, +199,-96, +-120,-156, +-15,72, +94,-118, +26,-67, +79,-5, +94,97, +-118,228, +135,-24, +200,41, +149,-5, +101,-167, +-35,59, +-38,-79, +-56,61, +168,-103, +-49,-79, +113,184, +-128,7, +10,-144, +159,29, +-86,-91, +-77,42, +106,23, +57,17, +-3,-88, +0,-78, +77,-38, +-67,117, +146,-116, +-92,-37, +-59,-266, +38,27, +-135,-42, +-185,-95, +157,-15, +88,40, +159,-77, +77,72, +-36,131, +235,55, +-11,-88, +-187,6, +96,249, +20,-252, +-109,0, +77,38, +-44,119, +30,3, +-78,113, +-42,36, +-154,152, +-161,9, +45,110, +72,-82, +72,94, +10,-85, +-2,-59, +-195,101, +25,42, +-131,-44, +205,67, +88,99, +-83,136, +59,-61, +137,-216, +-226,22, +-99,-211, +149,-95, +-153,-67, +146,-14, +-23,32, +102,99, +137,-137, +-350,59, +22,211, +-60,114, +18,-16, +-262,40, +-122,-82, +82,238, +5,-55, +-66,80, +101,-5, +-268,-56, +78,-25, +107,41, +-63,25, +-33,3, +113,-132, +-5,-180, +-70,-10, +-175,-60, +-64,-38, +120,-137, +232,-107, +-112,-147, +202,-169, +-38,110, +-107,166, +109,203, +269,-90, +150,77, +-67,-93, +-106,101, +-163,16, +12,-17, +115,18, +24,-38, +-63,185, +-162,-223, +-248,-67, +-17,76, +193,110, +-228,-117, +71,-5, +-39,-91, +53,-87, +-31,196, +-135,45, +17,-15, +40,-177, +-174,-163, +128,46, +-108,0, +100,85, +-283,16, +-5,144, +-91,123, +101,258, +22,245, +-80,293, +124,266, +-35,-34, +93,-237, +-94,-81, +210,-54, +-33,12, +-65,159, +-175,61, +-31,-367, +134,53, +-25,26, +222,-81, +54,-90, +-82,45, +1,25, +117,-73, +109,-23, +19,230, +-46,52, +-40,-207, +-38,242, +-356,95, +34,-151, +95,-61, +-32,145, +33,-48, +-14,-15, +85,104, +68,9, +-29,87, +192,76, +84,-143, +184,-150, +-44,57, +-164,47, +122,-31, +-29,-153, +-84,104, +49,187, +-99,-36, +-17,42, +268,71, +129,103, +-117,-71, +76,165, +49,99, +80,-47, +20,35, +83,-201, +-22,28, +69,108, +178,-23, +188,-248, +119,15, +279,44, +-106,205, +-24,-169, +192,49, +161,-32, +23,121, +-136,17, +-160,10, +149,68, +92,48, +3,13, +-124,15, +-175,-83, +114,-45, +-136,146, +116,-1, +-133,-178, +-186,199, +-72,280, +336,164, +-81,-264, +-40,40, +-74,-207, +74,-56, +135,68, +108,375, +131,22, +-50,-53, +-3,-94, +137,-166, +-27,174, +28,23, +83,-42, +-56,57, +-5,-47, +151,103, +277,-140, +174,-27, +-112,-132, +129,94, +154,7, +-127,61, +-128,-187, +54,31, +65,-91, +261,-71, +-18,-116, +68,-169, +39,-136, +-96,311, +-43,94, +-47,-337, +270,161, +26,145, +-11,-308, +234,220, +-112,34, +-105,110, +-36,160, +-180,-86, +-18,-121, +96,-4, +27,-3, +7,-153, +0,0, +-43,292, +245,-55, +-193,65, +-42,132, +-115,-188, +-79,-102, +-30,71, +-106,-265, +-41,-272, +-77,120, +36,92, +-37,-22, +-6,58, +-124,56, +231,-3, +37,148, +-17,117, +41,-183, +46,40, +81,-94, +-31,-40, +102,-130, +-230,197, +126,-199, +84,-83, +-11,-177, +35,-85, +61,49, +-150,-88, +74,-84, +-119,112, +41,-5, +-253,186, +-38,13, +90,25, +-49,-95, +65,53, +84,160, +-217,54, +75,18, +231,187, +98,-57, +-140,69, +-27,-81, +190,86, +-126,57, +-84,-164, +70,-44, +21,180, +153,86, +-62,-116, +18,75, +192,-79, +287,-43, +-60,144, +60,-71, +-24,-171, +-35,-42, +199,-17, +93,-41, +121,98, +99,-246, +-160,-82, +56,88, +111,32, +26,179, +108,-48, +68,69, +-133,111, +-85,-15, +143,-100, +90,-149, +248,-57, +-163,-79, +-213,-105, +27,-194, +-87,193, +-118,-50, +35,-131, +-83,172, +16,-19, +-97,-69, +-134,-48, +117,-4, +103,-17, +-41,32, +-25,-272, +140,44, +-150,-95, +-6,23, +77,-119, +-122,-204, +24,-60, +-108,-133, +141,31, +-142,-71, +-123,184, +29,-112, +-3,186, +-146,107, +-218,160, +-41,31, +97,16, +-75,-22, +40,169, +-64,-21, +4,155, +-103,215, +97,-244, +-256,101, +145,28, +-149,48, +60,-31, +-74,5, +-131,181, +171,-160, +-158,37, +90,118, +12,-9, +-96,36, +-154,-28, +-50,-225, +39,-60, +65,-56, +-162,132, +-234,57, +-124,-105, +-92,95, +20,87, +119,-189, +-26,39, +-144,9, +86,-83, +-290,120, +181,-234, +-95,-269, +210,-146, +-34,37, +-38,-106, +-91,26, +-218,-144, +-281,10, +-117,-21, +-169,-273, +119,-92, +-62,199, +-69,150, +258,-146, +-41,117, +59,39, +92,83, +-23,-20, +70,-197, +-267,127, +99,75, +-60,70, +67,-148, +-217,201, +-63,3, +273,83, +145,-141, +82,-1, +-32,-19, +-21,-137, +-174,11, +-45,73, +17,91, +251,-104, +55,213, +136,197, +146,-30, +-72,-3, +-150,35, +-72,-1, +147,-69, +-110,-38, +-165,67, +65,-256, +-46,86, +-188,22, +-9,-39, +-45,1, +-190,18, +232,-18, +157,-274, +57,-37, +-145,117, +-76,-95, +3,-155, +230,-82, +219,3, +-165,-213, +142,-73, +-112,-239, +-16,-48, +5,0, +-62,44, +51,-123, +-195,12, +178,-143, +36,65, +-64,131, +138,-121, +154,-211, +52,29, +-19,-124, +-97,112, +292,-60, +231,-51, +248,-3, +112,10, +-164,51, +182,-12, +108,97, +127,159, +-63,-93, +-7,-204, +98,86, +-153,-37, +-154,11, +91,-109, +200,82, +54,-188, +-60,32, +-56,-8, +-52,68, +57,-221, +-77,-10, +32,-75, +-121,-203, +106,18, +120,-152, +203,1, +25,68, +95,44, +-146,-30, +-129,-155, +-30,-49, +-45,34, +-191,258, +-108,61, +7,72, +-105,249, +-173,-65, +-9,-150, +171,-17, +226,129, +133,-44, +58,-136, +-7,53, +132,-59, +-125,30, +44,275, +-135,173, +199,54, +110,-110, +-35,-199, +-9,-23, +179,-11, +-142,-60, +181,-6, +20,24, +143,-89, +-67,176, +-133,-136, +-152,-61, +-59,-135, +-89,157, +197,8, +-164,96, +-80,-221, +2,-157, +-64,-49, +-28,-135, +-107,-93, +229,-129, +68,-109, +-204,-215, +184,-172, +12,116, +-149,80, +-20,149, +100,103, +18,-16, +115,83, +24,-308, +-182,-152, +-43,-131, +99,107, +131,-85, +-259,115, +69,-50, +98,127, +40,-150, +79,-237, +-206,90, +-45,15, +132,13, +171,-121, +91,63, +-40,-87, +190,-11, +-181,255, +-196,-98, +29,-43, +-94,-78, +116,90, +-184,72, +36,-9, +-108,-142, +-60,97, +-3,-115, +4,121, +-15,132, +-183,-110, +-47,-131, +146,135, +-81,65, +260,-5, +26,-137, +-157,59, +128,119, +30,57, +-258,-10, +-54,266, +50,-74, +10,-45, +-111,-43, +221,84, +-91,104, +5,-131, +-43,135, +43,178, +147,-75, +2,-14, +-16,-28, +-87,1, +132,194, +-110,58, +-177,108, +-216,-12, +-159,8, +34,140, +24,51, +-26,-133, +-112,-257, +-192,1, +118,37, +72,-165, +4,-119, +147,-141, +73,-136, +167,-133, +194,-172, +27,17, +-82,37, +-30,191, +-63,-74, +-204,70, +14,-75, +-71,1, +-20,-7, +7,9, +-176,101, +-31,63, +-84,42, +53,27, +100,77, +125,-28, +33,-150, +-64,21, +-108,-66, +-16,88, +74,43, +179,-99, +16,-101, +-104,-128, +-36,-131, +161,-110, +40,-139, +62,-81, +5,-20, +89,131, +-104,84, +-97,-127, +-20,-49, +28,-191, +4,-71, +-75,201, +24,152, +-104,93, +-139,14, +-83,19, +-158,40, +189,-8, +87,41, +-39,9, +45,-181, +-206,225, +-68,132, +-79,61, +62,160, +37,-53, +175,-47, +-122,13, +42,46, +113,-30, +-61,-202, +-47,-106, +58,87, +-157,-151, +-20,161, +197,75, +12,-78, +89,99, +33,-136, +-29,-40, +-59,50, +32,31, +-255,172, +-52,96, +128,19, +-129,110, +83,-111, +62,197, +-35,40, +-4,-75, +3,-107, +-25,-34, +161,55, +28,-29, +-34,28, +-171,-18, +133,81, +-87,-110, +-18,107, +-286,-44, +191,23, +-34,-24, +-16,24, +194,-44, +85,-50, +-126,92, +-79,-67, +-148,-7, +51,50, +68,-74, +-190,68, +-50,11, +53,101, +66,-66, +-16,3, +18,14, +-94,15, +111,169, +-179,-112, +139,136, +-202,-45, +-146,-91, +33,0, +52,8, +-178,36, +94,-119, +0,137, +49,-45, +-27,51, +-56,118, +-174,-7, +120,58, +-83,-64, +-71,9, +-110,57, +25,-112, +118,-119, +-121,-86, +-48,97, +-19,-38, +170,-29, +6,121, +23,-24, +-88,70, +-93,117, +49,-5, +-87,-116, +47,-140, +-12,-235, +104,1, +159,-56, +-16,32, +-29,133, +-172,71, +-13,-26, +-40,33, +157,201, +16,113, +81,23, +-10,-117, +-26,13, +-9,44, +19,37, +-67,25, +-78,76, +-105,-18, +-138,2, +85,-19, +71,110, +-87,-28, +11,-102, +64,85, +-44,39, +47,5, +-67,56, +39,-108, +94,63, +-9,51, +-34,-53, +-32,-15, +51,56, +72,26, +-90,-48, +53,-159, +35,-80, +33,-18, +42,-28, +49,9, +-30,-23, +-33,6, +-69,13, +173,130, +168,10, +24,93, +-25,-122, +98,-65, +82,-119, +33,72, +24,86, +-142,105, +-70,48, +-210,-76, +-115,66, +51,-80, +78,-23, +17,-61, +85,-66, +5,123, +17,43, +1,69, +3,-117, +14,-27, +-180,12, +-43,94, +12,-98, +11,-163, +-3,108, +-57,-87, +115,-20, +34,-97, +12,-16, +89,1, +-54,120, +53,-93, +-77,2, +70,-27, +-32,24, +-83,-120, +30,-82, +-34,-101, +110,150, +-53,-187, +129,91, +0,-25, +-68,-48, +45,79, +-11,86, +94,-145, +-32,-44, +30,-1, +-23,10, +-4,-20, +15,-176, +-32,-39, +45,82, +-58,92, +-22,29, +57,29, +-65,-36, +51,54, +-20,-299, +44,136, +-73,6, +95,-92, +-35,-88, +-8,141, +36,-18, +0,71, +-122,16, +-47,-93, +94,44, +3,83, +108,-88, +-85,84, +97,-3, +95,-77, +32,-57, +128,-108, +-9,14, +-79,-15, +32,23, +-88,2, +54,127, +54,45, +0,-5, +77,-33, +-106,-60, +2,9, +-115,-6, +-116,21, +113,28, +5,15, +-114,-37, +83,165, +19,-23, +62,-38, +162,-87, +31,-36, +10,-121, +-93,82, +63,70, +23,-1, +-34,68, +64,-177, +8,-87, +8,8, +188,-80, +74,2, +-46,1, +-66,0, +-126,-6, +-8,-63, +25,-54, +75,4, +19,91, +-86,-47, +-67,83, +-91,85, +-76,-17, +-74,-85, +-98,44, +-25,80, +14,71, +18,-18, +48,-65, +-91,-53, +-24,39, +-32,68, +19,66, +56,22, +5,-7, +45,-110, +54,0, +29,-73, +-25,-12, +-14,34, +27,-104, +-76,-40, +83,-64, +15,-39, +88,-25, +-36,20, +-59,91, +-121,109, +-67,83, +-56,10, +-130,71, +-42,38, +4,-4, +-27,-2, +-99,-148, +-123,-7, +53,75, +71,-60, +10,-51, +-2,-104, +26,-165, +109,8, +17,19, +66,-1, +-13,-69, +-78,75, +47,18, +56,42, +38,26, +27,-103, +-46,73, +93,16, +12,15, +-125,-55, +82,86, +38,-83, +64,-114, +-2,36, +73,15, +25,-40, +-48,27, +-55,49, +102,92, +16,-43, +-53,29, +-35,-70, +43,-80, +44,69, +30,-23, +-84,-63, +44,18, +-54,-80, +19,20, +77,-65, +-18,71, +-122,-69, +93,-81, +14,-34, +28,-14, +1,95, +-48,-31, +11,99, +-45,104, +59,-90, +-21,-31, +-56,-14, +-83,44, +-6,58, +104,-19, +-82,-35, +56,-43, +3,137, +-26,-66, +-141,-92, +-30,49, +-85,17, +73,18, +40,64, +20,-28, +100,-80, +11,61, +-64,-2, +-98,-14, +-54,-3, +-43,74, +-78,31, +-9,-106, +-59,38, +-79,-10, +-32,-85, +-55,22, +94,-22, +6,50, +-11,-74, +-91,-57, +39,-47, +-38,-23, +49,11, +-21,110, +-21,-55, +4,63, +-6,-5, +-45,22, +-38,-9, +-65,47, +0,40, +118,34, +74,-96, +17,53, +4,-14, +-20,25, +-22,19, +-32,54, +46,83, +15,79, +-95,-10, +19,-71, +58,-34, +45,-1, +40,-44, +57,-67, +63,-23, +-56,-6, +-38,-61, +-23,-29, +25,-7, +26,60, +-23,28, +-2,85, +-67,3, +-14,-3, +-43,-41, +-43,29, +-4,-27, +-56,6, +60,-22, +-35,-31, +-22,26, +-30,74, +33,25, +-66,-55, +41,-36, +-3,5, +-54,23, +-38,-23, +53,9, +40,103, +-10,-18, +11,14, +26,0, +-30,77, +-8,121, +14,31, +-40,31, +50,-45, +-55,23, +-53,72, +-15,12, +16,-1, +14,24, +1,5, +-60,20, +12,-71, +-9,43, +7,-13, +-33,-45, +-30,46, +-84,-48, +-8,22, +-32,30, +-15,73, +-48,16, +-20,-42, +20,-22, +-6,-11, +-61,86, +-46,19, +49,-14, +-23,-33, +-22,-7, +48,-36, +-32,-25, +-16,14, +-28,-32, +22,-39, +-35,29, +-4,13, +31,-80, +-27,6, +7,39, +61,13, +25,51, +13,29, +-10,35, +39,-34, +-9,-27, +-24,-23, +-15,12, +-2,-2, +-8,61, +-34,48, +68,-7, +-9,-41, +3,-22, +-10,47, +48,-50, +-12,10, +-1,-44, +-32,32, +10,16, +52,-11, +-26,39, +3,6, +24,19, +41,-13, +-22,-10, +-45,17, +-24,-73, +3,-43, +-2,-39, +-43,-39, +19,-3, +-10,18, +-33,-14, +-59,61, +-23,-49, +-23,17, +26,-39, +-8,1, +-23,-11, +11,14, +-15,16, +13,-21, +13,-33, +-20,-33, +25,-36, +25,2, +-60,27, +-12,-23, +-4,-30, +-17,-8, +21,1, +20,-9, +-15,25, +6,-32, +-2,20, +25,-16, +-14,-28, +-1,38, +34,-41, +-29,9, +10,-20, +-1,9, +32,-22, +21,11, +-11,-12, +28,2, +-8,6, +0,0, +27,-36, +33,-26, +-9,9, +31,-5, +-14,-18, +16,-7, +-11,-10, +-5,23, +-26,-33, +-13,5, +-22,7, +-10,-13, +18,-1, +-33,1, +-2,8, +-17,-9, +4,15, +2,11, +-8,-11, +-15,-16, +13,-4, +2,6, +-3,-15, +-4,-3, +3,-5, +6,-14, +-37,-11, +1,-14, +-2,3, +-25,43, +-10,-7, +9,-9, +-1,1, +9,-6, +12,9, +-11,18, +28,-1, +3,1, +-23,7, +2,-15, +-11,18, +2,24, +4,-8, +-10,13, +-17,4, +4,-17, +3,17, +-2,15, +2,12, +-6,5, +0,2, +4,-6, +12,19, +-3,-1, +-9,-14, +0,5, +5,3, +2,0, +-9,-6, +11,4, +1,16, +6,2, +3,-5, +7,-5, +5,9, +-4,1, +-3,-5, +9,4, +-1,-7, +9,-15, +-1,15, +-3,-10, +-1,-4, +-2,7, +-2,-1, +-4,-4, +-10,11, +1,-2, +-2,-4, +3,0, +-8,5, +2,-5, +-3,7, +-2,1, +1,-6, +5,8, +0,2, +1,-3, +2,1, +-2,1, +2,-5, +2,4, +-4,-1, +-3,-5, +1,3, +-1,0, +-1,-5, +1,3, +0,0, +0,-5, +0,5, +0,0, +0,-5, +0,5, +0,0, +1,-3, +-1,5, +-1,0, +1,-3, +-3,5, +-4,1, +2,-4, +2,5, +-2,-1, +2,-1, +1,3, +0,-2, +5,-8, +1,6, +-2,-1, +-3,-7, +2,5, +-8,-5, +3,0, +-2,4, +1,2, +-10,-11, +-4,4, +-2,1, +-2,-7, +-1,4, +-3,10, +-1,-15, +9,15, +-1,7, +9,-4, +-3,5, +-4,-1, +5,-9, +7,5, +3,5, +6,-2, +1,-16, +11,-4, +-9,6, +2,0, +5,-3, +0,-5, +-9,14, +-3,1, +12,-19, +4,6, +0,-2, +-6,-5, +2,-12, +-2,-15, +3,-17, +4,17, +-17,-4, +-10,-13, +4,8, +2,-24, +-11,-18, +2,15, +-23,-7, +3,-1, +28,1, +-11,-18, +12,-9, +9,6, +-1,-1, +9,9, +-10,7, +-25,-43, +-2,-3, +1,14, +-37,11, +6,14, +3,5, +-4,3, +-3,15, +2,-6, +13,4, +-15,16, +-8,11, +2,-11, +4,-15, +-17,9, +-2,-8, +-33,-1, +18,1, +-10,13, +-22,-7, +-13,-5, +-26,33, +-5,-23, +-11,10, +16,7, +-14,18, +31,5, +-9,-9, +33,26, +27,36, +0,0, +-8,-6, +28,-2, +-11,12, +21,-11, +32,22, +-1,-9, +10,20, +-29,-9, +34,41, +-1,-38, +-14,28, +25,16, +-2,-20, +6,32, +-15,-25, +20,9, +21,-1, +-17,8, +-4,30, +-12,23, +-60,-27, +25,-2, +25,36, +-20,33, +13,33, +13,21, +-15,-16, +11,-14, +-23,11, +-8,-1, +26,39, +-23,-17, +-23,49, +-59,-61, +-33,14, +-10,-18, +19,3, +-43,39, +-2,39, +3,43, +-24,73, +-45,-17, +-22,10, +41,13, +24,-19, +3,-6, +-26,-39, +52,11, +10,-16, +-32,-32, +-1,44, +-12,-10, +48,50, +-10,-47, +3,22, +-9,41, +68,7, +-34,-48, +-8,-61, +-2,2, +-15,-12, +-24,23, +-9,27, +39,34, +-10,-35, +13,-29, +25,-51, +61,-13, +7,-39, +-27,-6, +31,80, +-4,-13, +-35,-29, +22,39, +-28,32, +-16,-14, +-32,25, +48,36, +-22,7, +-23,33, +49,14, +-46,-19, +-61,-86, +-6,11, +20,22, +-20,42, +-48,-16, +-15,-73, +-32,-30, +-8,-22, +-84,48, +-30,-46, +-33,45, +7,13, +-9,-43, +12,71, +-60,-20, +1,-5, +14,-24, +16,1, +-15,-12, +-53,-72, +-55,-23, +50,45, +-40,-31, +14,-31, +-8,-121, +-30,-77, +26,0, +11,-14, +-10,18, +40,-103, +53,-9, +-38,23, +-54,-23, +-3,-5, +41,36, +-66,55, +33,-25, +-30,-74, +-22,-26, +-35,31, +60,22, +-56,-6, +-4,27, +-43,-29, +-43,41, +-14,3, +-67,-3, +-2,-85, +-23,-28, +26,-60, +25,7, +-23,29, +-38,61, +-56,6, +63,23, +57,67, +40,44, +45,1, +58,34, +19,71, +-95,10, +15,-79, +46,-83, +-32,-54, +-22,-19, +-20,-25, +4,14, +17,-53, +74,96, +118,-34, +0,-40, +-65,-47, +-38,9, +-45,-22, +-6,5, +4,-63, +-21,55, +-21,-110, +49,-11, +-38,23, +39,47, +-91,57, +-11,74, +6,-50, +94,22, +-55,-22, +-32,85, +-79,10, +-59,-38, +-9,106, +-78,-31, +-43,-74, +-54,3, +-98,14, +-64,2, +11,-61, +100,80, +20,28, +40,-64, +73,-18, +-85,-17, +-30,-49, +-141,92, +-26,66, +3,-137, +56,43, +-82,35, +104,19, +-6,-58, +-83,-44, +-56,14, +-21,31, +59,90, +-45,-104, +11,-99, +-48,31, +1,-95, +28,14, +14,34, +93,81, +-122,69, +-18,-71, +77,65, +19,-20, +-54,80, +44,-18, +-84,63, +30,23, +44,-69, +43,80, +-35,70, +-53,-29, +16,43, +102,-92, +-55,-49, +-48,-27, +25,40, +73,-15, +-2,-36, +64,114, +38,83, +82,-86, +-125,55, +12,-15, +93,-16, +-46,-73, +27,103, +38,-26, +56,-42, +47,-18, +-78,-75, +-13,69, +66,1, +17,-19, +109,-8, +26,165, +-2,104, +10,51, +71,60, +53,-75, +-123,7, +-99,148, +-27,2, +4,4, +-42,-38, +-130,-71, +-56,-10, +-67,-83, +-121,-109, +-59,-91, +-36,-20, +88,25, +15,39, +83,64, +-76,40, +27,104, +-14,-34, +-25,12, +29,73, +54,0, +45,110, +5,7, +56,-22, +19,-66, +-32,-68, +-24,-39, +-91,53, +48,65, +18,18, +14,-71, +-25,-80, +-98,-44, +-74,85, +-76,17, +-91,-85, +-67,-83, +-86,47, +19,-91, +75,-4, +25,54, +-8,63, +-126,6, +-66,0, +-46,-1, +74,-2, +188,80, +8,-8, +8,87, +64,177, +-34,-68, +23,1, +63,-70, +-93,-82, +10,121, +31,36, +162,87, +62,38, +19,23, +83,-165, +-114,37, +5,-15, +113,-28, +-116,-21, +-115,6, +2,-9, +-106,60, +77,33, +0,5, +54,-45, +54,-127, +-88,-2, +32,-23, +-79,15, +-9,-14, +128,108, +32,57, +95,77, +97,3, +-85,-84, +108,88, +3,-83, +94,-44, +-47,93, +-122,-16, +0,-71, +36,18, +-8,-141, +-35,88, +95,92, +-73,-6, +44,-136, +-20,299, +51,-54, +-65,36, +57,-29, +-22,-29, +-58,-92, +45,-82, +-32,39, +15,176, +-4,20, +-23,-10, +30,1, +-32,44, +94,145, +-11,-86, +45,-79, +-68,48, +0,25, +129,-91, +-53,187, +110,-150, +-34,101, +30,82, +-83,120, +-32,-24, +70,27, +-77,-2, +53,93, +-54,-120, +89,-1, +12,16, +34,97, +115,20, +-57,87, +-3,-108, +11,163, +12,98, +-43,-94, +-180,-12, +14,27, +3,117, +1,-69, +17,-43, +5,-123, +85,66, +17,61, +78,23, +51,80, +-115,-66, +-210,76, +-70,-48, +-142,-105, +24,-86, +33,-72, +82,119, +98,65, +-25,122, +24,-93, +168,-10, +173,-130, +-69,-13, +-33,-6, +-30,23, +49,-9, +42,28, +33,18, +35,80, +53,159, +-90,48, +72,-26, +51,-56, +-32,15, +-34,53, +-9,-51, +94,-63, +39,108, +-67,-56, +47,-5, +-44,-39, +64,-85, +11,102, +-87,28, +71,-110, +85,19, +-138,-2, +-105,18, +-78,-76, +-67,-25, +19,-37, +-9,-44, +-26,-13, +-10,117, +81,-23, +16,-113, +157,-201, +-40,-33, +-13,26, +-172,-71, +-29,-133, +-16,-32, +159,56, +104,-1, +-12,235, +47,140, +-87,116, +49,5, +-93,-117, +-88,-70, +23,24, +6,-121, +170,29, +-19,38, +-48,-97, +-121,86, +118,119, +25,112, +-110,-57, +-71,-9, +-83,64, +120,-58, +-174,7, +-56,-118, +-27,-51, +49,45, +0,-137, +94,119, +-178,-36, +52,-8, +33,0, +-146,91, +-202,45, +139,-136, +-179,112, +111,-169, +-94,-15, +18,-14, +-16,-3, +66,66, +53,-101, +-50,-11, +-190,-68, +68,74, +51,-50, +-148,7, +-79,67, +-126,-92, +85,50, +194,44, +-16,-24, +-34,24, +191,-23, +-286,44, +-18,-107, +-87,110, +133,-81, +-171,18, +-34,-28, +28,29, +161,-55, +-25,34, +3,107, +-4,75, +-35,-40, +62,-197, +83,111, +-129,-110, +128,-19, +-52,-96, +-255,-172, +32,-31, +-59,-50, +-29,40, +33,136, +89,-99, +12,78, +197,-75, +-20,-161, +-157,151, +58,-87, +-47,106, +-61,202, +113,30, +42,-46, +-122,-13, +175,47, +37,53, +62,-160, +-79,-61, +-68,-132, +-206,-225, +45,181, +-39,-9, +87,-41, +189,8, +-158,-40, +-83,-19, +-139,-14, +-104,-93, +24,-152, +-75,-201, +4,71, +28,191, +-20,49, +-97,127, +-104,-84, +89,-131, +5,20, +62,81, +40,139, +161,110, +-36,131, +-104,128, +16,101, +179,99, +74,-43, +-16,-88, +-108,66, +-64,-21, +33,150, +125,28, +100,-77, +53,-27, +-84,-42, +-31,-63, +-176,-101, +7,-9, +-20,7, +-71,-1, +14,75, +-204,-70, +-63,74, +-30,-191, +-82,-37, +27,-17, +194,172, +167,133, +73,136, +147,141, +4,119, +72,165, +118,-37, +-192,-1, +-112,257, +-26,133, +24,-51, +34,-140, +-159,-8, +-216,12, +-177,-108, +-110,-58, +132,-194, +-87,-1, +-16,28, +2,14, +147,75, +43,-178, +-43,-135, +5,131, +-91,-104, +221,-84, +-111,43, +10,45, +50,74, +-54,-266, +-258,10, +30,-57, +128,-119, +-157,-59, +26,137, +260,5, +-81,-65, +146,-135, +-47,131, +-183,110, +-15,-132, +4,-121, +-3,115, +-60,-97, +-108,142, +36,9, +-184,-72, +116,-90, +-94,78, +29,43, +-196,98, +-181,-255, +190,11, +-40,87, +91,-63, +171,121, +132,-13, +-45,-15, +-206,-90, +79,237, +40,150, +98,-127, +69,50, +-259,-115, +131,85, +99,-107, +-43,131, +-182,152, +24,308, +115,-83, +18,16, +100,-103, +-20,-149, +-149,-80, +12,-116, +184,172, +-204,215, +68,109, +229,129, +-107,93, +-28,135, +-64,49, +2,157, +-80,221, +-164,-96, +197,-8, +-89,-157, +-59,135, +-152,61, +-133,136, +-67,-176, +143,89, +20,-24, +181,6, +-142,60, +179,11, +-9,23, +-35,199, +110,110, +199,-54, +-135,-173, +44,-275, +-125,-30, +132,59, +-7,-53, +58,136, +133,44, +226,-129, +171,17, +-9,150, +-173,65, +-105,-249, +7,-72, +-108,-61, +-191,-258, +-45,-34, +-30,49, +-129,155, +-146,30, +95,-44, +25,-68, +203,-1, +120,152, +106,-18, +-121,203, +32,75, +-77,10, +57,221, +-52,-68, +-56,8, +-60,-32, +54,188, +200,-82, +91,109, +-154,-11, +-153,37, +98,-86, +-7,204, +-63,93, +127,-159, +108,-97, +182,12, +-164,-51, +112,-10, +248,3, +231,51, +292,60, +-97,-112, +-19,124, +52,-29, +154,211, +138,121, +-64,-131, +36,-65, +178,143, +-195,-12, +51,123, +-62,-44, +5,0, +-16,48, +-112,239, +142,73, +-165,213, +219,-3, +230,82, +3,155, +-76,95, +-145,-117, +57,37, +157,274, +232,18, +-190,-18, +-45,-1, +-9,39, +-188,-22, +-46,-86, +65,256, +-165,-67, +-110,38, +147,69, +-72,1, +-150,-35, +-72,3, +146,30, +136,-197, +55,-213, +251,104, +17,-91, +-45,-73, +-174,-11, +-21,137, +-32,19, +82,1, +145,141, +273,-83, +-63,-3, +-217,-201, +67,148, +-60,-70, +99,-75, +-267,-127, +70,197, +-23,20, +92,-83, +59,-39, +-41,-117, +258,146, +-69,-150, +-62,-199, +119,92, +-169,273, +-117,21, +-281,-10, +-218,144, +-91,-26, +-38,106, +-34,-37, +210,146, +-95,269, +181,234, +-290,-120, +86,83, +-144,-9, +-26,-39, +119,189, +20,-87, +-92,-95, +-124,105, +-234,-57, +-162,-132, +65,56, +39,60, +-50,225, +-154,28, +-96,-36, +12,9, +90,-118, +-158,-37, +171,160, +-131,-181, +-74,-5, +60,31, +-149,-48, +145,-28, +-256,-101, +97,244, +-103,-215, +4,-155, +-64,21, +40,-169, +-75,22, +97,-16, +-41,-31, +-218,-160, +-146,-107, +-3,-186, +29,112, +-123,-184, +-142,71, +141,-31, +-108,133, +24,60, +-122,204, +77,119, +-6,-23, +-150,95, +140,-44, +-25,272, +-41,-32, +103,17, +117,4, +-134,48, +-97,69, +16,19, +-83,-172, +35,131, +-118,50, +-87,-193, +27,194, +-213,105, +-163,79, +248,57, +90,149, +143,100, +-85,15, +-133,-111, +68,-69, +108,48, +26,-179, +111,-32, +56,-88, +-160,82, +99,246, +121,-98, +93,41, +199,17, +-35,42, +-24,171, +60,71, +-60,-144, +287,43, +192,79, +18,-75, +-62,116, +153,-86, +21,-180, +70,44, +-84,164, +-126,-57, +190,-86, +-27,81, +-140,-69, +98,57, +231,-187, +75,-18, +-217,-54, +84,-160, +65,-53, +-49,95, +90,-25, +-38,-13, +-253,-186, +41,5, +-119,-112, +74,84, +-150,88, +61,-49, +35,85, +-11,177, +84,83, +126,199, +-230,-197, +102,130, +-31,40, +81,94, +46,-40, +41,183, +-17,-117, +37,-148, +231,3, +-124,-56, +-6,-58, +-37,22, +36,-92, +-77,-120, +-41,272, +-106,265, +-30,-71, +-79,102, +-115,188, +-42,-132, +-193,-65, +245,55, +-43,-292, +11,0, +101,307, +68,-35, +150,75, +59,-65, +27,153, +156,-286, +269,-50, +-82,47, +-302,-148, +-98,2, +-180,-274, +-81,-38, +121,-115, +-1,-83, +-77,-2, +220,33, +101,-213, +-70,1, +84,-1, +-46,25, +-112,-210, +-49,-192, +65,-13, +65,-116, +19,28, +179,177, +-48,-72, +-152,37, +-50,-201, +66,160, +-20,-192, +-282,-189, +60,-76, +-107,-246, +-176,89, +200,-11, +268,132, +107,-76, +-1,-69, +82,70, +-105,-67, +-84,208, +141,-38, +112,9, +169,-27, +-97,-45, +-78,138, +-86,-269, +133,-66, +76,206, +-138,99, +233,-116, +39,86, +13,-67, +49,71, +-34,88, +310,81, +-6,-43, +-44,-35, +69,148, +137,-101, +148,6, +76,-184, +75,-205, +-88,-167, +130,-61, +-294,-83, +-61,257, +111,17, +112,-103, +236,118, +-7,-128, +-61,-13, +-13,-42, +228,-92, +89,143, +-105,-95, +289,-81, +-79,96, +-36,104, +-82,77, +75,106, +-94,-39, +238,188, +28,-20, +-92,42, +44,-108, +39,7, +-148,-74, +-9,-95, +-116,221, +-131,-14, +-108,-52, +202,-283, +-244,-37, +-57,-175, +-52,-154, +217,73, +72,21, +-32,47, +-204,71, +307,-74, +39,62, +94,248, +-223,45, +-16,24, +15,59, +119,-9, +93,-187, +17,69, +69,252, +-47,14, +56,5, +199,-168, +-53,-160, +-135,187, +183,192, +-141,47, +218,-232, +-42,126, +-234,44, +-1,118, +11,69, +-23,-86, +-50,-229, +-213,-45, +45,104, +32,-86, +207,86, +-125,24, +-39,-102, +50,101, +-95,-60, +165,-87, +61,-20, +-59,204, +169,13, +-34,70, +-100,-78, +104,95, +-57,152, +-35,19, +114,-149, +-94,-117, +151,12, +-133,-120, +-8,60, +-52,88, +-74,-38, +72,93, +-36,-8, +-161,-247, +-150,14, +174,83, +66,229, +210,-42, +-108,32, +20,170, +-123,180, +53,-138, +-128,-10, +-82,173, +-162,41, +-12,210, +-88,-29, +76,-20, +70,-113, +176,-64, +-33,34, +-57,131, +6,48, +-31,33, +-76,-120, +-113,-28, +-239,51, +-118,58, +60,-19, +-154,-165, +-40,170, +-253,44, +-167,-168, +195,46, +46,-42, +-23,131, +-52,-103, +-11,-218, +-119,106, +66,-20, +-160,-123, +2,24, +-17,-137, +-108,-3, +58,-16, +90,72, +-37,-104, +253,-64, +-204,-119, +14,-181, +75,-18, +108,-196, +141,-62, +-175,-56, +236,39, +187,57, +-63,131, +-89,-124, +-122,80, +-179,-99, +-83,-92, +-184,143, +-87,44, +194,-110, +-6,-157, +-148,33, +186,136, +64,-61, +-228,-28, +80,187, +-99,-11, +-91,-143, +6,54, +169,122, +118,143, +-175,-76, +22,-99, +-41,43, +190,25, +43,-88, +180,128, +-227,57, +-145,87, +-261,58, +35,-13, +2,5, +-87,-229, +-55,-207, +-18,-114, +-112,-171, +11,-51, +78,102, +-171,-145, +-10,-53, +73,12, +-22,215, +128,9, +-127,5, +-100,51, +-147,-37, +16,110, +-93,109, +-4,85, +48,-77, +-4,0, +-71,14, +-49,135, +-41,73, +-104,24, +-46,112, +-223,179, +-32,87, +-142,-112, +-206,118, +129,39, +-11,294, +-25,-25, +156,-125, +82,-126, +31,-205, +170,-246, +-34,54, +-90,-220, +-35,-105, +-13,78, +-99,23, +39,-59, +181,-186, +48,86, +-19,150, +-27,-132, +-27,-49, +-94,172, +-170,-6, +94,-35, +89,77, +19,-176, +-12,51, +125,91, +49,102, +-276,-113, +-54,52, +166,196, +133,37, +45,-62, +162,-43, +154,-25, +29,-81, +-43,7, +112,-132, +-277,-68, +31,180, +-279,27, +-53,-180, +-93,185, +182,-61, +0,55, +-107,-79, +-168,48, +9,29, +-68,-221, +-105,90, +135,-26, +57,247, +-204,-157, +35,-187, +-39,-48, +-103,-19, +-14,-18, +109,-120, +11,-11, +45,247, +29,-108, +14,163, +-91,-214, +-1,79, +-69,116, +-21,229, +163,-97, +136,219, +186,-121, +53,-277, +104,29, +-79,-217, +30,-64, +-54,-32, +-37,-10, +-16,53, +-53,-124, +-49,-83, +250,18, +-90,230, +-74,59, +63,30, +31,-283, +46,-46, +14,15, +93,96, +-146,-4, +150,0, +76,-158, +211,63, +62,64, +68,91, +-126,18, +22,72, +82,164, +9,-8, +-60,-89, +26,-40, +-57,-134, +-81,30, +162,38, +-19,285, +157,145, +-76,-60, +6,44, +33,81, +151,149, +42,12, +-98,218, +44,-116, +-20,-132, +-159,-249, +-23,-121, +-10,-18, +76,-108, +-154,-1, +41,157, +27,-160, +-79,-179, +-19,21, +-9,-99, +183,-195, +105,-207, +24,12, +18,-6, +-179,80, +-91,-1, +176,-97, +-235,-61, +-117,-2, +-74,-88, +-238,48, +-39,-132, +-74,-22, +-23,66, +-76,-14, +54,-214, +-89,48, +47,216, +-2,15, +102,-76, +-91,-266, +22,74, +16,-39, +85,-88, +-85,33, +-12,-30, +-105,142, +-250,59, +-96,-63, +21,11, +-42,107, +115,30, +-2,59, +-87,122, +129,1, +39,253, +26,-83, +-290,42, +-46,46, +127,-151, +-131,-70, +-7,-15, +77,-173, +34,-77, +-97,18, +-256,-29, +82,-188, +-9,125, +-55,-153, +77,87, +-121,128, +-5,-100, +-63,136, +-144,-125, +59,57, +-15,-51, +-73,-27, +52,180, +46,-90, +-115,19, +134,120, +8,-24, +55,93, +74,78, +102,56, +-15,-1, +70,-107, +-79,-53, +119,127, +-26,162, +97,-8, +-28,-56, +-14,84, +-107,98, +-207,-41, +12,84, +-134,-70, +138,50, +214,14, +90,23, +-63,-26, +-36,-48, +-80,60, +91,102, +-32,-88, +19,26, +116,-76, +-59,43, +-22,72, +70,-90, +-96,-23, +-30,-107, +121,-54, +95,-145, +-109,95, +-59,37, +-128,90, +-99,78, +-21,-138, +15,-37, +4,143, +-75,-25, +-21,-35, +-100,-20, +234,30, +-184,106, +87,26, +-48,-67, +116,-71, +-77,-79, +-8,14, +-180,45, +115,55, +-88,150, +-62,-121, +-66,91, +32,-61, +80,-64, +-184,-141, +38,-99, +69,-98, +-43,-16, +-30,96, +28,-27, +42,-25, +-36,-7, +-36,-28, +-23,-138, +198,-74, +16,93, +118,-84, +-66,209, +4,56, +-131,52, +-86,-62, +61,-26, +-72,23, +-4,60, +81,-65, +4,-26, +-120,93, +-85,-40, +-106,-58, +-147,-54, +79,127, +-80,-82, +54,-144, +-3,93, +151,-111, +6,32, +-13,-152, +-6,24, +-138,8, +-32,122, +56,-178, +27,146, +86,-81, +-13,118, +-112,-120, +89,-44, +56,-1, +-40,32, +-50,-42, +-11,-95, +102,-64, +100,-132, +-42,-33, +6,59, +-151,108, +-24,-40, +-85,-35, +-6,-3, +1,11, +46,-11, +7,10, +-117,86, +70,-5, +-1,-46, +56,92, +14,-137, +-79,-50, +24,137, +76,151, +-68,45, +62,59, +-30,-187, +35,-44, +43,-110, +85,-77, +-40,70, +-27,-8, +154,72, +100,-28, +-62,94, +-54,-91, +-30,73, +46,77, +105,35, +-2,23, +67,117, +41,-61, +3,50, +21,-11, +-3,-3, +112,7, +-79,-14, +-64,-41, +142,6, +-178,-108, +129,-66, +57,65, +-60,-105, +103,31, +-112,49, +-19,-87, +-65,-35, +24,-176, +-88,40, +-79,117, +-50,-98, +-69,-10, +-47,39, +-23,-33, +7,-148, +76,-112, +-25,189, +198,-35, +-10,-12, +30,38, +99,-13, +17,61, +6,-20, +3,-99, +9,-123, +66,-110, +89,-34, +-104,19, +1,-38, +21,91, +-97,-35, +-6,-21, +-192,6, +62,100, +175,-85, +-18,36, +-112,-17, +-22,-29, +57,-48, +-55,26, +-12,-147, +-64,-49, +20,-92, +-40,-149, +-41,-4, +-52,-46, +0,32, +27,-107, +42,-74, +-45,101, +-84,53, +-184,55, +-14,104, +-18,-104, +-124,-22, +-56,54, +34,-51, +48,-10, +-69,-36, +-56,69, +-34,-77, +-151,-64, +-172,-15, +71,-4, +-11,-13, +116,-10, +36,97, +81,62, +-5,-74, +0,54, +71,-18, +146,107, +111,-5, +-96,19, +11,-54, +-64,-11, +-68,11, +34,-34, +66,66, +55,10, +19,-59, +31,-12, +79,127, +-25,17, +-15,150, +-76,-1, +48,-7, +34,-25, +28,90, +-78,-44, +-64,57, +-112,44, +147,-96, +74,32, +16,53, +-44,46, +-38,-74, +-48,4, +74,-17, +-33,-29, +-123,-12, +41,20, +-141,-30, +-86,116, +-11,41, +-26,104, +110,83, +2,-11, +140,-40, +-30,-5, +2,-24, +-89,-42, +141,73, +-27,-16, +63,12, +-39,75, +-86,-18, +60,-78, +-45,42, +-141,-59, +11,-50, +10,16, +115,48, +-81,-23, +-1,-48, +-60,-13, +38,-45, +21,-102, +-96,46, +118,41, +-33,23, +-20,-129, +5,-1, +61,-144, +-6,18, +-66,-68, +-26,50, +5,-4, +-49,59, +-4,100, +-28,19, +10,42, +95,117, +30,-61, +-51,-107, +20,9, +106,71, +-66,-15, +7,4, +-23,72, +-6,-11, +28,-20, +37,-77, +-4,-17, +-42,19, +29,-39, +63,30, +-62,93, +-93,5, +86,-49, +1,11, +-85,-19, +0,-70, +-84,44, +-42,19, +-95,30, +-84,65, +-39,23, +28,3, +32,37, +132,-24, +-44,-20, +2,-72, +26,-64, +72,-12, +45,-89, +17,-11, +30,-17, +39,-31, +37,-25, +-33,1, +-6,21, +15,-17, +66,-11, +14,-25, +20,-22, +-5,-88, +4,15, +29,-21, +38,45, +61,15, +-76,-34, +-9,-14, +7,-12, +-8,15, +-55,-25, +-65,-33, +-65,-7, +-73,-31, +-39,0, +45,-8, +-7,-43, +18,-134, +73,8, +-16,-20, +11,88, +3,10, +-4,37, +-17,-44, +-22,-10, +18,-6, +87,90, +-12,6, +-45,-76, +16,39, +37,-48, +9,-33, +-19,20, +28,32, +35,-17, +-63,-10, +-52,44, +51,0, +8,-71, +-13,-49, +-10,-24, +-34,-61, +35,-40, +-16,8, +43,47, +14,42, +-19,26, +-45,-52, +-8,98, +-68,29, +-17,-72, +-39,52, +-49,-31, +4,55, +-4,16, +14,-10, +-28,3, +5,-16, +-46,-27, +-5,11, +6,-46, +-20,12, +-7,-21, +-50,-15, +-1,-13, +69,42, +-66,12, +-10,-15, +30,-66, +-5,-61, +7,27, +-34,-36, +18,-21, +27,-41, +-22,-65, +-20,-6, +-7,4, +34,-22, +15,-6, +18,9, +-13,8, +-34,58, +-18,-7, +34,-7, +-6,-19, +65,-15, +19,-56, +-15,5, +-1,-19, +13,0, +56,-33, +7,25, +-3,-8, +27,71, +70,5, +-49,-20, +-28,-42, +-1,-4, +-2,3, +16,2, +13,-22, +-1,-16, +-1,16, +-21,-34, +-14,47, +-36,-17, +2,-6, +39,20, +9,-19, +5,-2, +-15,10, +35,-7, +18,25, +12,8, +-31,1, +5,30, +-4,-23, +2,-12, +-3,12, +4,-8, +11,48, +-8,-19, +6,-20, +-40,-29, +-33,7, +30,9, +11,-27, +20,-16, +3,-9, +-10,-3, +-31,50, +67,-38, +19,9, +-33,3, +-14,0, +-15,32, +14,1, +37,-19, +15,30, +-32,12, +-7,2, +23,26, +-14,-20, +23,-22, +34,-12, +5,55, +-1,-11, +4,16, +5,-26, +13,11, +-1,32, +-17,14, +-21,-53, +-22,14, +-15,-6, +-39,0, +29,-25, +6,-5, +1,-20, +-11,-3, +-9,1, +1,-2, +-13,-4, +18,10, +1,6, +19,20, +-5,-16, +16,4, +20,-17, +-1,13, +-4,2, +0,20, +-9,-6, +15,21, +-14,18, +-17,-26, +17,10, +-16,21, +-1,18, +14,5, +3,-8, +13,-12, +-15,-20, +-18,25, +-19,-11, +-11,6, +-15,25, +9,8, +-1,-1, +4,5, +-5,3, +5,3, +13,30, +-3,-18, +7,-2, +-6,28, +-1,-10, +6,5, +14,7, +-6,1, +-11,0, +-6,-7, +13,-4, +-10,2, +-5,22, +13,-2, +-5,-5, +10,3, +-2,-5, +-4,3, +0,10, +1,13, +9,7, +-8,-1, +0,-10, +-13,-4, +-8,2, +-1,-16, +-7,7, +7,5, +-11,-17, +4,2, +5,10, +0,-4, +-2,1, +-3,10, +-4,-8, +-7,-5, +-1,8, +5,-7, +-5,0, +-1,9, +-1,-3, +0,1, +-1,5, +-1,-4, +-4,0, +0,3, +-4,-9, +1,-2, +0,3, +-2,-3, +-1,3, +-1,5, +1,-5, +-1,1, +0,5, +0,-5, +0,0, +0,5, +0,-5, +-1,-1, +1,5, +-1,-5, +-1,-3, +-2,3, +0,-3, +1,2, +-4,9, +0,-3, +-4,0, +-1,4, +-1,-5, +0,-1, +-1,3, +-1,-9, +-5,0, +5,7, +-1,-8, +-7,5, +-4,8, +-3,-10, +-2,-1, +0,4, +5,-10, +4,-2, +-11,17, +7,-5, +-7,-7, +-1,16, +-8,-2, +-13,4, +0,10, +-8,1, +9,-7, +1,-13, +0,-10, +-4,-3, +-2,5, +10,-3, +-5,5, +13,2, +-5,-22, +-10,-2, +13,4, +-6,7, +-11,0, +-6,-1, +14,-7, +6,-5, +-1,10, +-6,-28, +7,2, +-3,18, +13,-30, +5,-3, +-5,-3, +4,-5, +-1,1, +9,-8, +-15,-25, +-11,-6, +-19,11, +-18,-25, +-15,20, +13,12, +3,8, +14,-5, +-1,-18, +-16,-21, +17,-10, +-17,26, +-14,-18, +15,-21, +-9,6, +0,-20, +-4,-2, +-1,-13, +20,17, +16,-4, +-5,16, +19,-20, +1,-6, +18,-10, +-13,4, +1,2, +-9,-1, +-11,3, +1,20, +6,5, +29,25, +-39,0, +-15,6, +-22,-14, +-21,53, +-17,-14, +-1,-32, +13,-11, +5,26, +4,-16, +-1,11, +5,-55, +34,12, +23,22, +-14,20, +23,-26, +-7,-2, +-32,-12, +15,-30, +37,19, +14,-1, +-15,-32, +-14,0, +-33,-3, +19,-9, +67,38, +-31,-50, +-10,3, +3,9, +20,16, +11,27, +30,-9, +-33,-7, +-40,29, +6,20, +-8,19, +11,-48, +4,8, +-3,-12, +2,12, +-4,23, +5,-30, +-31,-1, +12,-8, +18,-25, +35,7, +-15,-10, +5,2, +9,19, +39,-20, +2,6, +-36,17, +-14,-47, +-21,34, +-1,-16, +-1,16, +13,22, +16,-2, +-2,-3, +-1,4, +-28,42, +-49,20, +70,-5, +27,-71, +-3,8, +7,-25, +56,33, +13,0, +-1,19, +-15,-5, +19,56, +65,15, +-6,19, +34,7, +-18,7, +-34,-58, +-13,-8, +18,-9, +15,6, +34,22, +-7,-4, +-20,6, +-22,65, +27,41, +18,21, +-34,36, +7,-27, +-5,61, +30,66, +-10,15, +-66,-12, +69,-42, +-1,13, +-50,15, +-7,21, +-20,-12, +6,46, +-5,-11, +-46,27, +5,16, +-28,-3, +14,10, +-4,-16, +4,-55, +-49,31, +-39,-52, +-17,72, +-68,-29, +-8,-98, +-45,52, +-19,-26, +14,-42, +43,-47, +-16,-8, +35,40, +-34,61, +-10,24, +-13,49, +8,71, +51,0, +-52,-44, +-63,10, +35,17, +28,-32, +-19,-20, +9,33, +37,48, +16,-39, +-45,76, +-12,-6, +87,-90, +18,6, +-22,10, +-17,44, +-4,-37, +3,-10, +11,-88, +-16,20, +73,-8, +18,134, +-7,43, +45,8, +-39,0, +-73,31, +-65,7, +-65,33, +-55,25, +-8,-15, +7,12, +-9,14, +-76,34, +61,-15, +38,-45, +29,21, +4,-15, +-5,88, +20,22, +14,25, +66,11, +15,17, +-6,-21, +-33,-1, +37,25, +39,31, +30,17, +17,11, +45,89, +72,12, +26,64, +2,72, +-44,20, +132,24, +32,-37, +28,-3, +-39,-23, +-84,-65, +-95,-30, +-42,-19, +-84,-44, +0,70, +-85,19, +1,-11, +86,49, +-93,-5, +-62,-93, +63,-30, +29,39, +-42,-19, +-4,17, +37,77, +28,20, +-6,11, +-23,-72, +7,-4, +-66,15, +106,-71, +20,-9, +-51,107, +30,61, +95,-117, +10,-42, +-28,-19, +-4,-100, +-49,-59, +5,4, +-26,-50, +-66,68, +-6,-18, +61,144, +5,1, +-20,129, +-33,-23, +118,-41, +-96,-46, +21,102, +38,45, +-60,13, +-1,48, +-81,23, +115,-48, +10,-16, +11,50, +-141,59, +-45,-42, +60,78, +-86,18, +-39,-75, +63,-12, +-27,16, +141,-73, +-89,42, +2,24, +-30,5, +140,40, +2,11, +110,-83, +-26,-104, +-11,-41, +-86,-116, +-141,30, +41,-20, +-123,12, +-33,29, +74,17, +-48,-4, +-38,74, +-44,-46, +16,-53, +74,-32, +147,96, +-112,-44, +-64,-57, +-78,44, +28,-90, +34,25, +48,7, +-76,1, +-15,-150, +-25,-17, +79,-127, +31,12, +19,59, +55,-10, +66,-66, +34,34, +-68,-11, +-64,11, +11,54, +-96,-19, +111,5, +146,-107, +71,18, +0,-54, +-5,74, +81,-62, +36,-97, +116,10, +-11,13, +71,4, +-172,15, +-151,64, +-34,77, +-56,-69, +-69,36, +48,10, +34,51, +-56,-54, +-124,22, +-18,104, +-14,-104, +-184,-55, +-84,-53, +-45,-101, +42,74, +27,107, +0,-32, +-52,46, +-41,4, +-40,149, +20,92, +-64,49, +-12,147, +-55,-26, +57,48, +-22,29, +-112,17, +-18,-36, +175,85, +62,-100, +-192,-6, +-6,21, +-97,35, +21,-91, +1,38, +-104,-19, +89,34, +66,110, +9,123, +3,99, +6,20, +17,-61, +99,13, +30,-38, +-10,12, +198,35, +-25,-189, +76,112, +7,148, +-23,33, +-47,-39, +-69,10, +-50,98, +-79,-117, +-88,-40, +24,176, +-65,35, +-19,87, +-112,-49, +103,-31, +-60,105, +57,-65, +129,66, +-178,108, +142,-6, +-64,41, +-79,14, +112,-7, +-3,3, +21,11, +3,-50, +41,61, +67,-117, +-2,-23, +105,-35, +46,-77, +-30,-73, +-54,91, +-62,-94, +100,28, +154,-72, +-27,8, +-40,-70, +85,77, +43,110, +35,44, +-30,187, +62,-59, +-68,-45, +76,-151, +24,-137, +-79,50, +14,137, +56,-92, +-1,46, +70,5, +-117,-86, +7,-10, +46,11, +1,-11, +-6,3, +-85,35, +-24,40, +-151,-108, +6,-59, +-42,33, +100,132, +102,64, +-11,95, +-50,42, +-40,-32, +56,1, +89,44, +-112,120, +-13,-118, +86,81, +27,-146, +56,178, +-32,-122, +-138,-8, +-6,-24, +-13,152, +6,-32, +151,111, +-3,-93, +54,144, +-80,82, +79,-127, +-147,54, +-106,58, +-85,40, +-120,-93, +4,26, +81,65, +-4,-60, +-72,-23, +61,26, +-86,62, +-131,-52, +4,-56, +-66,-209, +118,84, +16,-93, +198,74, +-23,138, +-36,28, +-36,7, +42,25, +28,27, +-30,-96, +-43,16, +69,98, +38,99, +-184,141, +80,64, +32,61, +-66,-91, +-62,121, +-88,-150, +115,-55, +-180,-45, +-8,-14, +-77,79, +116,71, +-48,67, +87,-26, +-184,-106, +234,-30, +-100,20, +-21,35, +-75,25, +4,-143, +15,37, +-21,138, +-99,-78, +-128,-90, +-59,-37, +-109,-95, +95,145, +121,54, +-30,107, +-96,23, +70,90, +-22,-72, +-59,-43, +116,76, +19,-26, +-32,88, +91,-102, +-80,-60, +-36,48, +-63,26, +90,-23, +214,-14, +138,-50, +-134,70, +12,-84, +-207,41, +-107,-98, +-14,-84, +-28,56, +97,8, +-26,-162, +119,-127, +-79,53, +70,107, +-15,1, +102,-56, +74,-78, +55,-93, +8,24, +134,-120, +-115,-19, +46,90, +52,-180, +-73,27, +-15,51, +59,-57, +-144,125, +-63,-136, +-5,100, +-121,-128, +77,-87, +-55,153, +-9,-125, +82,188, +-256,29, +-97,-18, +34,77, +77,173, +-7,15, +-131,70, +127,151, +-46,-46, +-290,-42, +26,83, +39,-253, +129,-1, +-87,-122, +-2,-59, +115,-30, +-42,-107, +21,-11, +-96,63, +-250,-59, +-105,-142, +-12,30, +-85,-33, +85,88, +16,39, +22,-74, +-91,266, +102,76, +-2,-15, +47,-216, +-89,-48, +54,214, +-76,14, +-23,-66, +-74,22, +-39,132, +-238,-48, +-74,88, +-117,2, +-235,61, +176,97, +-91,1, +-179,-80, +18,6, +24,-12, +105,207, +183,195, +-9,99, +-19,-21, +-79,179, +27,160, +41,-157, +-154,1, +76,108, +-10,18, +-23,121, +-159,249, +-20,132, +44,116, +-98,-218, +42,-12, +151,-149, +33,-81, +6,-44, +-76,60, +157,-145, +-19,-285, +162,-38, +-81,-30, +-57,134, +26,40, +-60,89, +9,8, +82,-164, +22,-72, +-126,-18, +68,-91, +62,-64, +211,-63, +76,158, +150,0, +-146,4, +93,-96, +14,-15, +46,46, +31,283, +63,-30, +-74,-59, +-90,-230, +250,-18, +-49,83, +-53,124, +-16,-53, +-37,10, +-54,32, +30,64, +-79,217, +104,-29, +53,277, +186,121, +136,-219, +163,97, +-21,-229, +-69,-116, +-1,-79, +-91,214, +14,-163, +29,108, +45,-247, +11,11, +109,120, +-14,18, +-103,19, +-39,48, +35,187, +-204,157, +57,-247, +135,26, +-105,-90, +-68,221, +9,-29, +-168,-48, +-107,79, +0,-55, +182,61, +-93,-185, +-53,180, +-279,-27, +31,-180, +-277,68, +112,132, +-43,-7, +29,81, +154,25, +162,43, +45,62, +133,-37, +166,-196, +-54,-52, +-276,113, +49,-102, +125,-91, +-12,-51, +19,176, +89,-77, +94,35, +-170,6, +-94,-172, +-27,49, +-27,132, +-19,-150, +48,-86, +181,186, +39,59, +-99,-23, +-13,-78, +-35,105, +-90,220, +-34,-54, +170,246, +31,205, +82,126, +156,125, +-25,25, +-11,-294, +129,-39, +-206,-118, +-142,112, +-32,-87, +-223,-179, +-46,-112, +-104,-24, +-41,-73, +-49,-135, +-71,-14, +-4,0, +48,77, +-4,-85, +-93,-109, +16,-110, +-147,37, +-100,-51, +-127,-5, +128,-9, +-22,-215, +73,-12, +-10,53, +-171,145, +78,-102, +11,51, +-112,171, +-18,114, +-55,207, +-87,229, +2,-5, +35,13, +-261,-58, +-145,-87, +-227,-57, +180,-128, +43,88, +190,-25, +-41,-43, +22,99, +-175,76, +118,-143, +169,-122, +6,-54, +-91,143, +-99,11, +80,-187, +-228,28, +64,61, +186,-136, +-148,-33, +-6,157, +194,110, +-87,-44, +-184,-143, +-83,92, +-179,99, +-122,-80, +-89,124, +-63,-131, +187,-57, +236,-39, +-175,56, +141,62, +108,196, +75,18, +14,181, +-204,119, +253,64, +-37,104, +90,-72, +58,16, +-108,3, +-17,137, +2,-24, +-160,123, +66,20, +-119,-106, +-11,218, +-52,103, +-23,-131, +46,42, +195,-46, +-167,168, +-253,-44, +-40,-170, +-154,165, +60,19, +-118,-58, +-239,-51, +-113,28, +-76,120, +-31,-33, +6,-48, +-57,-131, +-33,-34, +176,64, +70,113, +76,20, +-88,29, +-12,-210, +-162,-41, +-82,-173, +-128,10, +53,138, +-123,-180, +20,-170, +-108,-32, +210,42, +66,-229, +174,-83, +-150,-14, +-161,247, +-36,8, +72,-93, +-74,38, +-52,-88, +-8,-60, +-133,120, +151,-12, +-94,117, +114,149, +-35,-19, +-57,-152, +104,-95, +-100,78, +-34,-70, +169,-13, +-59,-204, +61,20, +165,87, +-95,60, +50,-101, +-39,102, +-125,-24, +207,-86, +32,86, +45,-104, +-213,45, +-50,229, +-23,86, +11,-69, +-1,-118, +-234,-44, +-42,-126, +218,232, +-141,-47, +183,-192, +-135,-187, +-53,160, +199,168, +56,-5, +-47,-14, +69,-252, +17,-69, +93,187, +119,9, +15,-59, +-16,-24, +-223,-45, +94,-248, +39,-62, +307,74, +-204,-71, +-32,-47, +72,-21, +217,-73, +-52,154, +-57,175, +-244,37, +202,283, +-108,52, +-131,14, +-116,-221, +-9,95, +-148,74, +39,-7, +44,108, +-92,-42, +28,20, +238,-188, +-94,39, +75,-106, +-82,-77, +-36,-104, +-79,-96, +289,81, +-105,95, +89,-143, +228,92, +-13,42, +-61,13, +-7,128, +236,-118, +112,103, +111,-17, +-61,-257, +-294,83, +130,61, +-88,167, +75,205, +76,184, +148,-6, +137,101, +69,-148, +-44,35, +-6,43, +310,-81, +-34,-88, +49,-71, +13,67, +39,-86, +233,116, +-138,-99, +76,-206, +133,66, +-86,269, +-78,-138, +-97,45, +169,27, +112,-9, +141,38, +-84,-208, +-105,67, +82,-70, +-1,69, +107,76, +268,-132, +200,11, +-176,-89, +-107,246, +60,76, +-282,189, +-20,192, +66,-160, +-50,201, +-152,-37, +-48,72, +179,-177, +19,-28, +65,116, +65,13, +-49,192, +-112,210, +-46,-25, +84,1, +-70,-1, +101,213, +220,-33, +-77,2, +-1,83, +121,115, +-81,38, +-180,274, +-98,-2, +-302,148, +-82,-47, +269,50, +156,286, +27,-153, +59,65, +150,-75, +68,35, +101,-307, +11,0, +-84,-326, +215,55, +188,50, +-13,86, +-119,113, +53,98, +-142,155, +1,73, +-44,16, +-160,269, +-79,-11, +-19,-41, +-258,36, +-180,66, +-169,29, +2,-150, +-35,-112, +-6,-101, +227,128, +-126,-195, +-102,2, +7,34, +1,-197, +-60,-134, +112,-48, +-136,32, +195,-47, +-34,119, +270,45, +128,-150, +184,42, +278,167, +62,-64, +42,-186, +136,-40, +-167,115, +140,-43, +-71,-21, +-84,-11, +-10,147, +-330,92, +36,-132, +-111,-67, +-17,-78, +-164,-162, +49,-34, +-12,-33, +344,-15, +-124,-144, +69,119, +42,-10, +-269,-105, +-266,76, +-30,-121, +-118,-30, +-92,33, +140,-152, +5,-27, +173,-40, +73,-195, +-290,-164, +-153,-56, +-164,42, +-19,-63, +-247,-121, +101,-61, +105,207, +-19,-109, +-119,-183, +-138,-50, +38,-34, +151,-7, +148,-33, +50,112, +75,135, +-148,-53, +83,-123, +-278,-63, +-6,-214, +103,32, +-95,-78, +145,-44, +92,96, +-188,-2, +-153,-78, +-85,-84, +194,-123, +-15,27, +-34,-150, +-121,160, +-66,-107, +-223,1, +-14,-125, +-190,-21, +74,-174, +1,-178, +73,159, +-270,138, +50,38, +4,-102, +-37,-144, +147,8, +-239,41, +267,-47, +104,-256, +-211,-27, +104,122, +-36,-27, +-177,-192, +-157,-36, +176,-31, +176,-18, +-222,85, +-21,-131, +22,-175, +73,-10, +-87,230, +82,-97, +-111,55, +40,-111, +136,119, +54,-49, +219,26, +-80,87, +-83,-117, +85,111, +164,-20, +-57,57, +-125,-171, +214,74, +28,46, +92,107, +-165,130, +100,244, +80,107, +45,-57, +-89,-41, +159,-47, +-68,2, +61,-186, +36,1, +142,37, +56,54, +93,27, +107,-45, +57,-8, +95,-43, +-211,77, +-120,-98, +65,-68, +-132,30, +-43,45, +129,73, +-82,132, +-113,-144, +-6,-41, +34,-268, +-36,-41, +-40,-89, +-75,-101, +-215,-197, +-69,-132, +27,175, +-91,28, +-74,-7, +-127,-250, +-136,151, +178,-35, +-87,98, +156,-97, +-85,74, +-146,282, +-18,-168, +-66,8, +-115,-85, +-17,75, +-75,-121, +-161,-213, +-37,66, +90,234, +116,-72, +-150,180, +3,-151, +129,23, +-132,157, +153,-68, +-118,-196, +-63,-145, +-12,82, +-61,36, +208,91, +201,239, +-22,139, +-112,94, +-240,-191, +-100,-160, +38,-134, +54,-155, +-234,-134, +-217,-206, +-60,200, +-119,-168, +-5,-26, +85,80, +-118,209, +-38,130, +262,100, +-67,17, +-49,-215, +33,82, +13,301, +-10,-91, +11,-63, +-291,103, +77,-131, +78,49, +238,-130, +81,-85, +45,67, +-29,208, +-58,227, +229,-92, +51,-55, +151,213, +52,60, +-211,5, +-17,-99, +-89,-43, +-52,-78, +99,-126, +-195,27, +97,132, +21,101, +-48,207, +120,155, +9,156, +-70,-48, +61,83, +-178,230, +49,107, +83,-72, +-29,-149, +29,161, +-37,203, +75,-18, +-72,-184, +-49,-59, +-67,-116, +-102,21, +46,31, +197,-222, +-25,117, +5,-65, +-104,-9, +78,87, +-79,-37, +-53,122, +100,53, +-120,-180, +102,-154, +-116,-120, +-102,-145, +-160,162, +-69,251, +140,5, +-171,151, +-92,-59, +275,-118, +-143,63, +22,274, +22,-20, +69,-141, +-154,-61, +22,153, +76,63, +-6,-67, +226,-9, +128,-136, +54,108, +-107,-83, +157,136, +-2,8, +55,19, +-140,-195, +14,-148, +-74,-59, +97,-16, +-279,-117, +-86,-85, +-28,-44, +90,-219, +-107,45, +23,-22, +-118,-31, +28,-58, +-80,-24, +-84,-37, +260,-12, +-88,170, +109,110, +79,51, +69,-136, +-130,18, +-33,103, +37,11, +27,-67, +75,0, +40,-42, +-22,-109, +-141,25, +-55,-20, +-137,65, +-113,-138, +111,125, +82,96, +110,-21, +60,31, +60,-36, +165,33, +-23,31, +-21,192, +-28,25, +-6,35, +-2,-59, +-61,-117, +97,22, +51,23, +-142,-76, +-54,-157, +74,-371, +-175,169, +-86,-51, +50,-71, +101,42, +-92,-8, +156,115, +-51,-40, +66,-44, +-112,26, +-141,-7, +-8,-32, +225,-107, +-98,45, +62,-131, +14,85, +-156,131, +-104,-23, +73,166, +-15,32, +-47,94, +192,-91, +-194,187, +47,-78, +86,-120, +49,32, +82,-71, +-78,-35, +-170,-6, +11,212, +-203,26, +-21,273, +53,20, +103,124, +20,26, +35,-184, +-237,51, +168,-42, +34,246, +41,-21, +83,69, +19,38, +-213,-191, +231,60, +77,8, +-1,-106, +-223,-3, +187,-101, +-144,114, +-39,-91, +39,-228, +179,187, +-154,19, +-54,82, +-5,51, +60,-77, +54,42, +80,-96, +133,120, +-54,19, +-101,71, +136,92, +-113,232, +135,-67, +-116,-24, +-159,38, +-161,-44, +233,-142, +0,173, +-23,92, +138,10, +-1,-112, +-47,151, +120,-20, +-197,0, +-1,195, +73,45, +-51,-96, +-75,-95, +-34,58, +-147,-7, +-22,-92, +-116,99, +-69,-16, +80,-94, +-21,4, +-69,57, +-126,-30, +-81,73, +-54,-184, +-47,140, +-4,-109, +-104,-46, +44,-58, +-58,217, +230,114, +-71,106, +145,7, +-104,-191, +-1,110, +85,-2, +-133,-66, +-15,-138, +125,-107, +-90,-39, +-41,148, +-32,163, +11,166, +-46,-86, +41,-120, +33,-36, +-29,140, +103,100, +69,191, +125,83, +74,-12, +244,32, +-13,-121, +59,38, +120,91, +-202,-113, +59,-35, +-15,8, +-81,27, +-56,-76, +69,-99, +-16,-167, +109,105, +35,31, +9,-123, +174,76, +-100,1, +-153,-8, +-3,30, +15,147, +-80,110, +82,-1, +126,33, +-8,-111, +-135,2, +-68,-29, +142,63, +-3,-239, +100,-62, +-2,-61, +-18,-115, +-2,-23, +-49,-66, +63,13, +-105,164, +38,19, +-67,-108, +70,-66, +132,-118, +-58,-160, +-39,63, +-145,105, +-11,75, +156,-129, +-100,-103, +20,-15, +-123,-113, +99,-103, +99,-175, +74,-53, +-78,160, +-49,-163, +-1,-18, +19,145, +107,13, +-23,26, +2,-49, +85,94, +-70,84, +103,90, +-4,-126, +57,7, +148,-30, +48,20, +-77,-30, +-19,143, +87,42, +39,208, +235,14, +1,-43, +34,-20, +-12,35, +33,98, +-111,103, +16,33, +-17,-48, +130,134, +65,-67, +14,22, +-95,75, +147,-27, +72,92, +-75,12, +10,-110, +-35,-21, +64,50, +-161,111, +-195,21, +13,38, +-88,-189, +-96,104, +-59,21, +-19,14, +180,-72, +1,-145, +-124,57, +-101,49, +-79,66, +-91,18, +37,-110, +109,73, +41,-83, +-49,35, +-77,-18, +-36,-40, +-76,43, +-120,24, +-63,91, +-128,8, +133,46, +-97,-165, +-52,-40, +1,196, +38,-4, +43,-57, +165,57, +34,-46, +-76,-155, +110,21, +-42,11, +-45,92, +36,47, +19,-7, +-45,95, +-165,4, +-19,-51, +6,-61, +24,46, +-74,-96, +-22,17, +13,-41, +37,78, +-29,76, +-90,45, +87,212, +51,-2, +80,104, +199,68, +20,-13, +0,8, +-80,53, +-70,-40, +75,-26, +233,50, +21,-133, +1,19, +-47,55, +-155,-35, +-67,-30, +109,-8, +-84,16, +1,0, +-54,-64, +43,177, +177,-55, +75,139, +28,-81, +-117,-24, +50,-24, +-86,-22, +75,-59, +-116,-43, +62,-91, +41,-91, +-32,57, +-51,-14, +17,-23, +7,-39, +2,-122, +-44,2, +37,-75, +-26,-81, +-129,26, +89,32, +105,-76, +0,16, +25,-73, +31,43, +20,30, +-97,13, +157,31, +52,48, +-55,32, +-56,38, +49,-225, +-52,1, +12,0, +82,63, +145,-76, +-23,61, +70,-64, +21,15, +20,162, +-86,-18, +64,1, +-27,99, +14,-135, +156,-45, +-65,86, +-8,85, +-84,-146, +-26,72, +100,-44, +-142,-14, +-22,-108, +61,169, +-75,3, +-15,5, +-28,-74, +22,63, +78,49, +12,49, +144,-22, +-131,52, +-3,-158, +-10,88, +8,95, +150,-20, +14,-38, +145,11, +42,-173, +58,7, +-79,-24, +16,-71, +-24,132, +-70,70, +6,-122, +13,86, +66,-34, +-65,15, +129,22, +5,10, +53,-69, +54,-60, +17,9, +4,-34, +-72,64, +19,18, +-62,52, +8,-87, +15,-59, +-29,-19, +-3,89, +13,-52, +77,57, +-52,3, +-26,43, +56,-65, +-74,-55, +-18,-14, +-218,6, +-9,-75, +62,-1, +-61,72, +-25,-14, +-14,-53, +-39,47, +76,-24, +57,-56, +48,65, +-18,18, +30,63, +-37,46, +21,16, +62,88, +7,26, +17,-44, +-60,-69, +64,-46, +-31,-40, +-41,-53, +-17,57, +-12,21, +-25,8, +3,38, +53,-35, +-1,-55, +-39,20, +-22,85, +106,-41, +45,91, +11,-8, +-19,47, +-16,-48, +-24,-49, +-28,41, +26,-78, +-45,7, +-23,5, +-87,29, +-17,-109, +-34,-37, +-50,-59, +5,59, +-79,-67, +-90,-4, +-13,-34, +67,65, +-38,2, +72,20, +-43,-38, +2,112, +-47,58, +1,29, +11,20, +59,4, +12,-41, +-118,-18, +35,81, +107,-85, +19,44, +-54,26, +17,11, +-15,-62, +84,-5, +70,50, +46,-111, +-4,-71, +-91,44, +-75,-77, +-28,51, +-15,-11, +33,-18, +56,-3, +-41,-15, +16,14, +41,-60, +-79,49, +30,39, +-45,30, +-11,-26, +16,-48, +-80,-16, +-52,-1, +0,-22, +72,43, +50,-35, +-23,12, +-66,38, +64,-18, +88,-5, +14,-49, +8,25, +28,0, +92,-1, +44,43, +64,-13, +40,-20, +1,47, +-28,-85, +-43,34, +-18,9, +-13,-108, +-35,15, +62,-3, +43,0, +-3,105, +-25,14, +49,5, +115,-7, +-6,10, +-37,31, +8,61, +-67,90, +34,-74, +-5,0, +-33,-51, +15,-6, +56,36, +42,-2, +-50,-51, +-35,47, +65,25, +35,7, +48,-18, +65,-2, +-60,6, +8,-17, +-7,-47, +8,-60, +-103,-57, +-18,-11, +-35,32, +-85,-40, +-14,-64, +-7,-57, +62,22, +65,49, +31,40, +10,31, +19,-45, +-24,-22, +-90,25, +13,-48, +32,46, +-15,-4, +17,-6, +-33,-7, +59,-7, +17,52, +26,-20, +-38,-48, +-56,-10, +13,-18, +27,-25, +-81,-11, +41,-24, +16,-25, +34,-9, +4,-13, +-32,61, +58,-35, +-24,11, +-8,-33, +-51,-49, +49,6, +14,-1, +-17,-31, +-53,-35, +-33,-30, +-4,-9, +-41,-7, +-21,9, +-64,-1, +16,-38, +-2,1, +26,11, +21,-8, +-6,-11, +-16,-13, +-4,-15, +-11,-32, +17,-16, +-18,49, +-4,10, +5,11, +12,35, +13,12, +-15,23, +-14,-7, +-30,20, +14,-11, +-18,22, +-16,-14, +31,26, +45,10, +31,-4, +14,-33, +27,62, +-13,3, +0,-11, +-23,-7, +29,25, +-11,20, +10,-20, +-9,1, +14,10, +7,46, +-17,4, +30,1, +-37,10, +16,-24, +22,15, +11,-5, +-43,16, +-10,-19, +4,-17, +1,7, +-2,45, +-13,-25, +-25,-50, +-10,27, +25,-18, +-10,-12, +-34,19, +-17,10, +16,18, +-8,-35, +-16,30, +-18,2, +1,-27, +33,8, +8,-30, +-14,24, +-28,-2, +-13,-11, +3,-30, +-27,2, +15,-36, +-8,-6, +9,-4, +-23,0, +3,10, +-19,18, +-15,-49, +12,-11, +2,21, +-4,-6, +1,12, +-16,4, +-4,-13, +-24,-5, +-8,-25, +-3,13, +8,-11, +18,13, +-1,18, +-11,13, +9,4, +-13,-10, +-23,-20, +3,2, +3,16, +8,-4, +-17,-5, +-9,-22, +7,2, +-3,-29, +-24,-16, +-10,1, +-4,12, +-12,13, +0,-3, +-6,2, +-5,-9, +3,-12, +-9,-14, +1,-21, +1,-3, +-1,6, +2,4, +-12,-3, +4,30, +-6,-17, +-10,-6, +-6,1, +-6,-3, +-5,-16, +2,7, +10,-22, +2,-2, +-7,11, +4,-15, +2,8, +-1,2, +-10,-1, +-4,8, +8,13, +2,7, +-6,9, +1,8, +6,7, +-1,-6, +-2,11, +3,-8, +-9,0, +-4,5, +1,-5, +-3,-5, +-1,5, +-2,-3, +2,4, +-6,2, +-2,-6, +0,0, +2,-3, +0,-7, +-1,-1, +1,3, +2,-6, +3,-1, +0,4, +1,-4, +2,-1, +0,5, +1,-5, +1,1, +-1,5, +0,-5, +0,0, +0,5, +-1,-5, +1,-1, +1,5, +0,-5, +2,1, +1,4, +0,-4, +3,1, +2,6, +1,-3, +-1,1, +0,7, +2,3, +0,0, +-2,6, +-6,-2, +2,-4, +-2,3, +-1,-5, +-3,5, +1,5, +-4,-5, +-9,0, +3,8, +-2,-11, +-1,6, +6,-7, +1,-8, +-6,-9, +2,-7, +8,-13, +-4,-8, +-10,1, +-1,-2, +2,-8, +4,15, +-7,-11, +2,2, +10,22, +2,-7, +-5,16, +-6,3, +-6,-1, +-10,6, +-6,17, +4,-30, +-12,3, +2,-4, +-1,-6, +1,3, +1,21, +-9,14, +3,12, +-5,9, +-6,-2, +0,3, +-12,-13, +-4,-12, +-10,-1, +-24,16, +-3,29, +7,-2, +-9,22, +-17,5, +8,4, +3,-16, +3,-2, +-23,20, +-13,10, +9,-4, +-11,-13, +-1,-18, +18,-13, +8,11, +-3,-13, +-8,25, +-24,5, +-4,13, +-16,-4, +1,-12, +-4,6, +2,-21, +12,11, +-15,49, +-19,-18, +3,-10, +-23,0, +9,4, +-8,6, +15,36, +-27,-2, +3,30, +-13,11, +-28,2, +-14,-24, +8,30, +33,-8, +1,27, +-18,-2, +-16,-30, +-8,35, +16,-18, +-17,-10, +-34,-19, +-10,12, +25,18, +-10,-27, +-25,50, +-13,25, +-2,-45, +1,-7, +4,17, +-10,19, +-43,-16, +11,5, +22,-15, +16,24, +-37,-10, +30,-1, +-17,-4, +7,-46, +14,-10, +-9,-1, +10,20, +-11,-20, +29,-25, +-23,7, +0,11, +-13,-3, +27,-62, +14,33, +31,4, +45,-10, +31,-26, +-16,14, +-18,-22, +14,11, +-30,-20, +-14,7, +-15,-23, +13,-12, +12,-35, +5,-11, +-4,-10, +-18,-49, +17,16, +-11,32, +-4,15, +-16,13, +-6,11, +21,8, +26,-11, +-2,-1, +16,38, +-64,1, +-21,-9, +-41,7, +-4,9, +-33,30, +-53,35, +-17,31, +14,1, +49,-6, +-51,49, +-8,33, +-24,-11, +58,35, +-32,-61, +4,13, +34,9, +16,25, +41,24, +-81,11, +27,25, +13,18, +-56,10, +-38,48, +26,20, +17,-52, +59,7, +-33,7, +17,6, +-15,4, +32,-46, +13,48, +-90,-25, +-24,22, +19,45, +10,-31, +31,-40, +65,-49, +62,-22, +-7,57, +-14,64, +-85,40, +-35,-32, +-18,11, +-103,57, +8,60, +-7,47, +8,17, +-60,-6, +65,2, +48,18, +35,-7, +65,-25, +-35,-47, +-50,51, +42,2, +56,-36, +15,6, +-33,51, +-5,0, +34,74, +-67,-90, +8,-61, +-37,-31, +-6,-10, +115,7, +49,-5, +-25,-14, +-3,-105, +43,0, +62,3, +-35,-15, +-13,108, +-18,-9, +-43,-34, +-28,85, +1,-47, +40,20, +64,13, +44,-43, +92,1, +28,0, +8,-25, +14,49, +88,5, +64,18, +-66,-38, +-23,-12, +50,35, +72,-43, +0,22, +-52,1, +-80,16, +16,48, +-11,26, +-45,-30, +30,-39, +-79,-49, +41,60, +16,-14, +-41,15, +56,3, +33,18, +-15,11, +-28,-51, +-75,77, +-91,-44, +-4,71, +46,111, +70,-50, +84,5, +-15,62, +17,-11, +-54,-26, +19,-44, +107,85, +35,-81, +-118,18, +12,41, +59,-4, +11,-20, +1,-29, +-47,-58, +2,-112, +-43,38, +72,-20, +-38,-2, +67,-65, +-13,34, +-90,4, +-79,67, +5,-59, +-50,59, +-34,37, +-17,109, +-87,-29, +-23,-5, +-45,-7, +26,78, +-28,-41, +-24,49, +-16,48, +-19,-47, +11,8, +45,-91, +106,41, +-22,-85, +-39,-20, +-1,55, +53,35, +3,-38, +-25,-8, +-12,-21, +-17,-57, +-41,53, +-31,40, +64,46, +-60,69, +17,44, +7,-26, +62,-88, +21,-16, +-37,-46, +30,-63, +-18,-18, +48,-65, +57,56, +76,24, +-39,-47, +-14,53, +-25,14, +-61,-72, +62,1, +-9,75, +-218,-6, +-18,14, +-74,55, +56,65, +-26,-43, +-52,-3, +77,-57, +13,52, +-3,-89, +-29,19, +15,59, +8,87, +-62,-52, +19,-18, +-72,-64, +4,34, +17,-9, +54,60, +53,69, +5,-10, +129,-22, +-65,-15, +66,34, +13,-86, +6,122, +-70,-70, +-24,-132, +16,71, +-79,24, +58,-7, +42,173, +145,-11, +14,38, +150,20, +8,-95, +-10,-88, +-3,158, +-131,-52, +144,22, +12,-49, +78,-49, +22,-63, +-28,74, +-15,-5, +-75,-3, +61,-169, +-22,108, +-142,14, +100,44, +-26,-72, +-84,146, +-8,-85, +-65,-86, +156,45, +14,135, +-27,-99, +64,-1, +-86,18, +20,-162, +21,-15, +70,64, +-23,-61, +145,76, +82,-63, +12,0, +-52,-1, +49,225, +-56,-38, +-55,-32, +52,-48, +157,-31, +-97,-13, +20,-30, +31,-43, +25,73, +0,-16, +105,76, +89,-32, +-129,-26, +-26,81, +37,75, +-44,-2, +2,122, +7,39, +17,23, +-51,14, +-32,-57, +41,91, +62,91, +-116,43, +75,59, +-86,22, +50,24, +-117,24, +28,81, +75,-139, +177,55, +43,-177, +-54,64, +1,0, +-84,-16, +109,8, +-67,30, +-155,35, +-47,-55, +1,-19, +21,133, +233,-50, +75,26, +-70,40, +-80,-53, +0,-8, +20,13, +199,-68, +80,-104, +51,2, +87,-212, +-90,-45, +-29,-76, +37,-78, +13,41, +-22,-17, +-74,96, +24,-46, +6,61, +-19,51, +-165,-4, +-45,-95, +19,7, +36,-47, +-45,-92, +-42,-11, +110,-21, +-76,155, +34,46, +165,-57, +43,57, +38,4, +1,-196, +-52,40, +-97,165, +133,-46, +-128,-8, +-63,-91, +-120,-24, +-76,-43, +-36,40, +-77,18, +-49,-35, +41,83, +109,-73, +37,110, +-91,-18, +-79,-66, +-101,-49, +-124,-57, +1,145, +180,72, +-19,-14, +-59,-21, +-96,-104, +-88,189, +13,-38, +-195,-21, +-161,-111, +64,-50, +-35,21, +10,110, +-75,-12, +72,-92, +147,27, +-95,-75, +14,-22, +65,67, +130,-134, +-17,48, +16,-33, +-111,-103, +33,-98, +-12,-35, +34,20, +1,43, +235,-14, +39,-208, +87,-42, +-19,-143, +-77,30, +48,-20, +148,30, +57,-7, +-4,126, +103,-90, +-70,-84, +85,-94, +2,49, +-23,-26, +107,-13, +19,-145, +-1,18, +-49,163, +-78,-160, +74,53, +99,175, +99,103, +-123,113, +20,15, +-100,103, +156,129, +-11,-75, +-145,-105, +-39,-63, +-58,160, +132,118, +70,66, +-67,108, +38,-19, +-105,-164, +63,-13, +-49,66, +-2,23, +-18,115, +-2,61, +100,62, +-3,239, +142,-63, +-68,29, +-135,-2, +-8,111, +126,-33, +82,1, +-80,-110, +15,-147, +-3,-30, +-153,8, +-100,-1, +174,-76, +9,123, +35,-31, +109,-105, +-16,167, +69,99, +-56,76, +-81,-27, +-15,-8, +59,35, +-202,113, +120,-91, +59,-38, +-13,121, +244,-32, +74,12, +125,-83, +69,-191, +103,-100, +-29,-140, +33,36, +41,120, +-46,86, +11,-166, +-32,-163, +-41,-148, +-90,39, +125,107, +-15,138, +-133,66, +85,2, +-1,-110, +-104,191, +145,-7, +-71,-106, +230,-114, +-58,-217, +44,58, +-104,46, +-4,109, +-47,-140, +-54,184, +-81,-73, +-126,30, +-69,-57, +-21,-4, +80,94, +-69,16, +-116,-99, +-22,92, +-147,7, +-34,-58, +-75,95, +-51,96, +73,-45, +-1,-195, +-197,0, +120,20, +-47,-151, +-1,112, +138,-10, +-23,-92, +0,-173, +233,142, +-161,44, +-159,-38, +-116,24, +135,67, +-113,-232, +136,-92, +-101,-71, +-54,-19, +133,-120, +80,96, +54,-42, +60,77, +-5,-51, +-54,-82, +-154,-19, +179,-187, +39,228, +-39,91, +-144,-114, +187,101, +-223,3, +-1,106, +77,-8, +231,-60, +-213,191, +19,-38, +83,-69, +41,21, +34,-246, +168,42, +-237,-51, +35,184, +20,-26, +103,-124, +53,-20, +-21,-273, +-203,-26, +11,-212, +-170,6, +-78,35, +82,71, +49,-32, +86,120, +47,78, +-194,-187, +192,91, +-47,-94, +-15,-32, +73,-166, +-104,23, +-156,-131, +14,-85, +62,131, +-98,-45, +225,107, +-8,32, +-141,7, +-112,-26, +66,44, +-51,40, +156,-115, +-92,8, +101,-42, +50,71, +-86,51, +-175,-169, +74,371, +-54,157, +-142,76, +51,-23, +97,-22, +-61,117, +-2,59, +-6,-35, +-28,-25, +-21,-192, +-23,-31, +165,-33, +60,36, +60,-31, +110,21, +82,-96, +111,-125, +-113,138, +-137,-65, +-55,20, +-141,-25, +-22,109, +40,42, +75,0, +27,67, +37,-11, +-33,-103, +-130,-18, +69,136, +79,-51, +109,-110, +-88,-170, +260,12, +-84,37, +-80,24, +28,58, +-118,31, +23,22, +-107,-45, +90,219, +-28,44, +-86,85, +-279,117, +97,16, +-74,59, +14,148, +-140,195, +55,-19, +-2,-8, +157,-136, +-107,83, +54,-108, +128,136, +226,9, +-6,67, +76,-63, +22,-153, +-154,61, +69,141, +22,20, +22,-274, +-143,-63, +275,118, +-92,59, +-171,-151, +140,-5, +-69,-251, +-160,-162, +-102,145, +-116,120, +102,154, +-120,180, +100,-53, +-53,-122, +-79,37, +78,-87, +-104,9, +5,65, +-25,-117, +197,222, +46,-31, +-102,-21, +-67,116, +-49,59, +-72,184, +75,18, +-37,-203, +29,-161, +-29,149, +83,72, +49,-107, +-178,-230, +61,-83, +-70,48, +9,-156, +120,-155, +-48,-207, +21,-101, +97,-132, +-195,-27, +99,126, +-52,78, +-89,43, +-17,99, +-211,-5, +52,-60, +151,-213, +51,55, +229,92, +-58,-227, +-29,-208, +45,-67, +81,85, +238,130, +78,-49, +77,131, +-291,-103, +11,63, +-10,91, +13,-301, +33,-82, +-49,215, +-67,-17, +262,-100, +-38,-130, +-118,-209, +85,-80, +-5,26, +-119,168, +-60,-200, +-217,206, +-234,134, +54,155, +38,134, +-100,160, +-240,191, +-112,-94, +-22,-139, +201,-239, +208,-91, +-61,-36, +-12,-82, +-63,145, +-118,196, +153,68, +-132,-157, +129,-23, +3,151, +-150,-180, +116,72, +90,-234, +-37,-66, +-161,213, +-75,121, +-17,-75, +-115,85, +-66,-8, +-18,168, +-146,-282, +-85,-74, +156,97, +-87,-98, +178,35, +-136,-151, +-127,250, +-74,7, +-91,-28, +27,-175, +-69,132, +-215,197, +-75,101, +-40,89, +-36,41, +34,268, +-6,41, +-113,144, +-82,-132, +129,-73, +-43,-45, +-132,-30, +65,68, +-120,98, +-211,-77, +95,43, +57,8, +107,45, +93,-27, +56,-54, +142,-37, +36,-1, +61,186, +-68,-2, +159,47, +-89,41, +45,57, +80,-107, +100,-244, +-165,-130, +92,-107, +28,-46, +214,-74, +-125,171, +-57,-57, +164,20, +85,-111, +-83,117, +-80,-87, +219,-26, +54,49, +136,-119, +40,111, +-111,-55, +82,97, +-87,-230, +73,10, +22,175, +-21,131, +-222,-85, +176,18, +176,31, +-157,36, +-177,192, +-36,27, +104,-122, +-211,27, +104,256, +267,47, +-239,-41, +147,-8, +-37,144, +4,102, +50,-38, +-270,-138, +73,-159, +1,178, +74,174, +-190,21, +-14,125, +-223,-1, +-66,107, +-121,-160, +-34,150, +-15,-27, +194,123, +-85,84, +-153,78, +-188,2, +92,-96, +145,44, +-95,78, +103,-32, +-6,214, +-278,63, +83,123, +-148,53, +75,-135, +50,-112, +148,33, +151,7, +38,34, +-138,50, +-119,183, +-19,109, +105,-207, +101,61, +-247,121, +-19,63, +-164,-42, +-153,56, +-290,164, +73,195, +173,40, +5,27, +140,152, +-92,-33, +-118,30, +-30,121, +-266,-76, +-269,105, +42,10, +69,-119, +-124,144, +344,15, +-12,33, +49,34, +-164,162, +-17,78, +-111,67, +36,132, +-330,-92, +-10,-147, +-84,11, +-71,21, +140,43, +-167,-115, +136,40, +42,186, +62,64, +278,-167, +184,-42, +128,150, +270,-45, +-34,-119, +195,47, +-136,-32, +112,48, +-60,134, +1,197, +7,-34, +-102,-2, +-126,195, +227,-128, +-6,101, +-35,112, +2,150, +-169,-29, +-180,-66, +-258,-36, +-19,41, +-79,11, +-160,-269, +-44,-16, +1,-73, +-142,-155, +53,-98, +-119,-113, +-13,-86, +188,-50, +215,-55, +-84,326, +6,0, +20,153, +69,54, +-190,109, +267,130, +166,-124, +-99,97, +118,-114, +-233,-90, +4,-14, +-186,53, +38,-337, +99,-173, +29,-193, +-101,-46, +-116,144, +-140,18, +130,134, +-112,-107, +-96,-129, +-144,-180, +-137,180, +37,-67, +51,28, +-107,59, +-20,74, +-7,-156, +-87,99, +55,-43, +63,-127, +57,68, +124,66, +270,89, +194,91, +44,-140, +-70,-243, +203,-187, +96,217, +39,-199, +-212,-47, +-51,142, +165,-102, +-98,-30, +-147,-53, +76,-35, +72,-84, +-30,-6, +-221,-67, +23,21, +22,221, +-12,79, +-207,-192, +-53,-41, +-60,-193, +64,20, +-107,-4, +-132,-57, +220,-27, +-108,34, +49,74, +207,-94, +261,22, +71,9, +317,-30, +146,-52, +168,-100, +-24,-16, +3,-115, +42,-120, +-103,36, +-295,235, +-27,18, +149,124, +-136,76, +120,76, +188,94, +27,55, +13,107, +-9,87, +192,-24, +14,-134, +65,240, +-199,70, +-24,79, +-36,36, +107,-114, +-191,99, +72,-51, +-75,132, +-306,-68, +57,98, +168,-104, +-89,-275, +-227,-180, +-113,141, +99,-145, +214,-84, +38,-215, +142,69, +-148,41, +7,-115, +-64,-204, +203,194, +-143,-165, +-154,82, +-44,146, +151,-80, +-13,59, +-57,81, +171,43, +132,-243, +-48,48, +-40,48, +-57,50, +-137,59, +177,-138, +-90,-137, +-172,-24, +-26,-182, +50,35, +-20,-135, +361,-24, +-121,-32, +-23,-56, +147,54, +-163,-205, +31,-6, +-51,-97, +3,37, +-50,-146, +48,142, +186,159, +-178,-229, +24,-187, +-25,208, +-139,-121, +-67,0, +25,115, +21,70, +-169,-17, +68,-71, +-188,-205, +-62,-56, +10,-149, +-52,87, +110,1, +150,137, +-178,36, +-99,-5, +70,-85, +-64,-69, +-62,-120, +-145,52, +-135,120, +-233,112, +98,-143, +-203,-7, +77,215, +-35,-18, +6,-132, +77,-64, +-216,-240, +-118,108, +117,78, +-51,-263, +34,-45, +124,75, +131,-75, +-1,80, +56,-212, +-185,139, +108,-219, +-89,-110, +-146,37, +-95,-186, +91,120, +-2,-69, +-93,46, +-69,-192, +-78,62, +136,-141, +63,-44, +-71,-5, +47,198, +117,67, +154,-22, +17,-44, +211,76, +168,26, +276,252, +81,209, +144,-271, +66,-4, +117,204, +-44,236, +-8,113, +23,158, +44,143, +-196,-13, +-113,-100, +77,-124, +-32,-89, +22,-30, +39,-27, +38,116, +105,55, +-90,56, +203,171, +-73,-40, +18,238, +-15,-129, +135,-154, +180,92, +31,-13, +-206,-163, +-60,81, +242,-106, +219,34, +38,-190, +55,42, +130,100, +-103,-25, +98,136, +-29,238, +-52,90, +56,-88, +-229,87, +-159,22, +98,92, +118,37, +158,-148, +144,-55, +-21,-42, +110,-74, +123,-11, +52,79, +181,-57, +191,-80, +-14,0, +19,68, +-91,-82, +2,-104, +141,-7, +-43,-13, +-117,-84, +242,54, +-119,13, +-45,264, +138,177, +79,38, +-4,82, +32,-168, +7,-175, +-228,82, +-164,-245, +172,-219, +116,8, +120,-1, +58,60, +-47,146, +6,-50, +-178,8, +-76,-105, +87,232, +-20,-127, +179,-53, +78,-31, +155,79, +9,101, +56,61, +4,-82, +98,-11, +-1,86, +317,-12, +-117,-205, +150,21, +3,146, +-240,78, +-17,-1, +-26,-20, +61,142, +56,-101, +-32,-257, +20,205, +-156,129, +-61,65, +-61,-33, +165,-152, +148,104, +149,26, +-71,-37, +58,113, +248,62, +-250,46, +146,16, +75,47, +-112,81, +-78,-163, +-111,155, +-63,-19, +3,214, +32,-51, +-56,90, +-125,-122, +-56,159, +91,92, +294,-95, +-76,3, +-164,-100, +30,-150, +18,224, +199,-143, +-58,-67, +-79,86, +-149,33, +80,73, +-47,-140, +58,-41, +-177,71, +-41,-137, +133,-51, +-22,0, +73,-36, +33,75, +46,27, +46,34, +-223,77, +-5,57, +41,-36, +31,-236, +42,-121, +60,104, +-102,16, +110,-150, +9,19, +130,10, +69,-32, +-101,-234, +82,22, +-16,163, +5,-11, +-226,-28, +10,84, +161,-97, +25,-67, +27,61, +25,258, +-203,2, +164,-115, +62,-213, +13,160, +-179,-228, +92,30, +33,63, +-118,-131, +-27,23, +-126,118, +95,-91, +73,-151, +99,-88, +31,27, +-116,-159, +-63,41, +-154,-49, +-30,150, +-32,72, +266,49, +127,124, +167,-194, +-87,-62, +12,-21, +19,-36, +41,-60, +87,194, +-51,-109, +-6,52, +-168,36, +51,-32, +73,23, +-28,96, +-108,4, +76,-96, +23,-197, +222,-79, +190,-30, +-82,-149, +-56,78, +4,45, +-67,22, +-242,16, +-180,49, +106,248, +-33,-87, +28,225, +221,-99, +-112,-32, +164,-33, +-10,19, +-134,6, +-52,-55, +143,-98, +-30,68, +142,-6, +72,-48, +16,-197, +133,-59, +91,14, +-49,246, +-79,20, +31,111, +-43,31, +-52,-92, +17,-40, +95,-220, +-4,123, +-31,-83, +14,113, +36,-10, +65,-72, +138,52, +27,-121, +-65,-12, +-50,-41, +26,-24, +-11,-81, +23,22, +142,13, +-73,42, +-59,64, +-56,28, +26,85, +-119,-162, +-24,207, +-115,-210, +118,90, +92,-11, +-163,4, +18,15, +-272,-57, +10,-142, +210,-158, +42,31, +55,45, +86,-6, +-8,106, +-34,-44, +37,-2, +268,-9, +4,-3, +-96,32, +-66,-280, +89,-78, +64,-116, +-25,118, +46,108, +107,-149, +-9,10, +61,-196, +103,110, +-187,-14, +29,-123, +-2,60, +-41,-45, +-135,69, +67,102, +54,65, +0,200, +74,26, +-49,11, +-25,-42, +-137,-68, +35,-11, +96,23, +-15,98, +71,-21, +-127,150, +-105,48, +162,-84, +77,102, +-103,176, +52,61, +-128,-42, +59,-22, +187,65, +109,-108, +23,36, +0,45, +82,272, +78,-159, +-21,148, +50,-219, +-38,-42, +-68,-153, +69,142, +70,49, +28,-78, +-55,-20, +22,-110, +66,-89, +-15,-62, +136,-91, +-45,-83, +-11,-106, +147,27, +-43,-108, +59,-77, +-127,-94, +-87,42, +-79,-64, +-47,-60, +-132,-86, +26,-19, +62,79, +-17,-15, +-80,-71, +-80,-106, +-13,-34, +-42,-127, +10,-50, +-169,-76, +-35,137, +-28,-14, +-46,48, +-149,28, +-27,-31, +-82,148, +-121,-18, +-24,1, +-104,26, +-31,-47, +72,99, +39,64, +13,-66, +-254,-40, +66,38, +-175,25, +168,0, +-18,132, +227,9, +-70,-58, +-42,195, +7,142, +45,-31, +-94,58, +67,-133, +204,4, +15,85, +-20,62, +53,-28, +56,-97, +93,-40, +-9,119, +75,1, +-28,19, +-58,-19, +-32,-162, +-14,75, +87,6, +67,-1, +169,80, +28,20, +22,-80, +91,-86, +-110,88, +0,-106, +6,-17, +-57,-17, +65,81, +-222,34, +33,22, +37,79, +50,-9, +27,11, +-228,100, +-64,-29, +-110,-155, +71,98, +-2,137, +-75,91, +69,-77, +-4,33, +39,58, +40,6, +-4,116, +-94,97, +-140,-8, +-18,-71, +-14,-221, +3,89, +59,-21, +-98,26, +96,78, +-136,-181, +132,-9, +-96,10, +76,-40, +68,-101, +-10,52, +41,2, +2,64, +-49,17, +-48,-36, +24,-5, +-88,-41, +3,0, +-53,98, +8,90, +-6,-19, +-5,22, +109,6, +-125,-37, +40,65, +-166,68, +-19,-108, +53,4, +-1,39, +117,-92, +72,-35, +105,122, +-118,17, +-88,45, +-72,103, +34,-18, +-3,97, +-11,41, +-80,-38, +8,-87, +41,49, +-40,-29, +-72,111, +79,-4, +-68,82, +174,19, +-5,-28, +115,-28, +7,-208, +-22,-65, +79,64, +-4,-106, +-33,-11, +-84,127, +-20,102, +-106,89, +-134,-24, +72,-21, +46,-41, +-31,61, +41,1, +19,-41, +-59,-99, +94,59, +-35,-4, +48,40, +-30,38, +-30,-45, +-70,16, +-17,16, +-59,185, +121,60, +58,72, +-14,-85, +113,-49, +-90,-82, +-34,-23, +-18,-23, +-13,70, +-151,88, +-6,-34, +68,30, +-37,-98, +-9,-39, +12,36, +-48,7, +18,-40, +-98,-78, +39,146, +-164,-27, +32,-8, +146,-53, +58,25, +-96,49, +15,56, +-3,8, +-10,-80, +25,-91, +59,100, +13,-50, +-84,5, +-102,22, +88,40, +-40,81, +-74,-36, +23,32, +45,-20, +-71,32, +-111,32, +-45,22, +51,-46, +31,-36, +18,-70, +32,81, +5,32, +25,-40, +-28,89, +-41,4, +-11,-24, +-43,-22, +22,-79, +-39,79, +-69,-28, +137,-39, +-8,-78, +-93,33, +73,8, +-45,110, +17,-49, +-49,-84, +-66,23, +19,65, +35,109, +23,-45, +42,-80, +-73,-8, +89,18, +-8,-17, +109,-26, +-43,-23, +24,-98, +-33,-11, +58,61, +7,-42, +-4,46, +74,-32, +7,99, +11,-8, +25,-18, +-10,161, +11,26, +-74,-16, +24,-35, +137,-36, +-15,-63, +-34,63, +-65,-13, +19,2, +61,70, +-49,-103, +38,-51, +98,15, +-30,-19, +-66,82, +-16,-2, +44,118, +-15,-33, +-23,36, +17,17, +48,12, +29,36, +8,99, +-70,-10, +22,72, +1,-6, +62,-41, +-94,-26, +48,-58, +36,20, +6,22, +42,22, +-27,87, +-104,40, +-40,-50, +-44,-99, +-22,0, +-60,27, +-21,-28, +74,60, +54,47, +64,-52, +82,31, +-50,0, +1,24, +0,-33, +-25,24, +-28,38, +-23,-36, +3,-40, +24,60, +-46,35, +-16,55, +28,66, +-2,14, +-33,24, +-5,50, +-39,-1, +-31,65, +-3,87, +31,-18, +37,-46, +-14,-34, +10,-58, +12,31, +84,8, +54,-43, +-1,52, +15,-6, +23,20, +-33,38, +-73,60, +75,75, +-64,-2, +-22,-77, +23,-4, +-18,85, +-31,29, +-3,3, +-13,-13, +91,29, +-14,-22, +35,68, +44,-35, +-2,30, +18,38, +-16,-33, +-36,17, +-33,19, +-31,-44, +-8,-51, +44,2, +56,25, +29,-29, +66,16, +90,13, +-48,35, +-30,26, +27,56, +81,35, +30,101, +-15,24, +20,24, +-23,35, +23,50, +53,-13, +18,3, +-52,18, +13,10, +-38,19, +-2,-46, +-38,-28, +40,22, +-36,5, +18,-21, +-38,-39, +-24,-5, +-11,-25, +-54,27, +51,-50, +-68,26, +25,45, +25,16, +-51,-2, +-26,30, +6,-18, +3,-16, +-10,-20, +-65,-38, +-13,36, +10,13, +20,-55, +21,40, +-29,-44, +-4,-24, +66,-44, +-11,-20, +-25,-42, +-11,14, +-18,5, +-18,-38, +34,-13, +8,15, +19,22, +-3,7, +1,-11, +-57,-23, +-6,-7, +-31,-33, +-16,7, +38,-24, +18,18, +-28,-15, +28,-35, +-8,7, +-17,-16, +-35,-7, +8,4, +37,40, +-5,-25, +-41,-9, +32,26, +-38,-48, +-18,21, +-7,1, +11,-17, +-24,26, +-6,6, +6,44, +-45,-9, +16,-10, +-27,-23, +-33,-7, +0,1, +-8,13, +6,-34, +29,-6, +-17,7, +-22,8, +-7,29, +32,3, +-16,-16, +12,25, +15,10, +-7,-53, +18,5, +-19,9, +3,12, +-30,-25, +4,11, +9,-14, +-13,34, +-47,19, +16,13, +-6,-7, +-16,-40, +-38,-13, +-14,32, +2,-5, +14,-31, +-12,-12, +24,-1, +-14,-3, +4,-16, +-3,25, +4,-27, +28,-10, +4,-3, +6,14, +-15,5, +11,21, +17,-17, +6,10, +6,30, +15,-5, +9,4, +2,6, +21,-4, +8,-25, +12,-17, +-11,6, +-15,2, +-3,0, +-1,6, +-15,33, +1,11, +6,21, +-9,18, +2,22, +1,-3, +5,6, +-3,-1, +-3,6, +0,-15, +-5,-2, +-1,11, +-21,-20, +-2,-7, +3,-3, +12,3, +8,-3, +-6,-6, +-5,-14, +1,13, +-7,4, +-1,-14, +-6,0, +1,7, +1,-3, +-1,-9, +-3,-3, +-4,12, +7,3, +-24,4, +-7,-3, +10,11, +0,15, +4,4, +5,2, +-7,6, +-2,-2, +4,-1, +-3,0, +-5,-4, +11,-1, +-5,1, +-1,0, +5,-2, +-2,-5, +-11,-5, +5,1, +-2,-1, +1,0, +5,-5, +-2,-1, +-5,1, +-2,1, +-4,0, +-5,-1, +6,-4, +-4,2, +-3,-3, +5,1, +-2,2, +-3,0, +6,0, +-2,0, +-3,0, +6,0, +-3,0, +-2,0, +6,0, +-3,0, +-2,-2, +5,-1, +-3,3, +-4,-2, +6,4, +-5,1, +-4,0, +-2,-1, +-5,-1, +-2,1, +5,5, +1,0, +-2,1, +5,-1, +-11,5, +-2,5, +5,2, +-1,0, +-5,-1, +11,1, +-5,4, +-3,0, +4,1, +-2,2, +-7,-6, +5,-2, +4,-4, +0,-15, +10,-11, +-7,3, +-24,-4, +7,-3, +-4,-12, +-3,3, +-1,9, +1,3, +1,-7, +-6,0, +-1,14, +-7,-4, +1,-13, +-5,14, +-6,6, +8,3, +12,-3, +3,3, +-2,7, +-21,20, +-1,-11, +-5,2, +0,15, +-3,-6, +-3,1, +5,-6, +1,3, +2,-22, +-9,-18, +6,-21, +1,-11, +-15,-33, +-1,-6, +-3,0, +-15,-2, +-11,-6, +12,17, +8,25, +21,4, +2,-6, +9,-4, +15,5, +6,-30, +6,-10, +17,17, +11,-21, +-15,-5, +6,-14, +4,3, +28,10, +4,27, +-3,-25, +4,16, +-14,3, +24,1, +-12,12, +14,31, +2,5, +-14,-32, +-38,13, +-16,40, +-6,7, +16,-13, +-47,-19, +-13,-34, +9,14, +4,-11, +-30,25, +3,-12, +-19,-9, +18,-5, +-7,53, +15,-10, +12,-25, +-16,16, +32,-3, +-7,-29, +-22,-8, +-17,-7, +29,6, +6,34, +-8,-13, +0,-1, +-33,7, +-27,23, +16,10, +-45,9, +6,-44, +-6,-6, +-24,-26, +11,17, +-7,-1, +-18,-21, +-38,48, +32,-26, +-41,9, +-5,25, +37,-40, +8,-4, +-35,7, +-17,16, +-8,-7, +28,35, +-28,15, +18,-18, +38,24, +-16,-7, +-31,33, +-6,7, +-57,23, +1,11, +-3,-7, +19,-22, +8,-15, +34,13, +-18,38, +-18,-5, +-11,-14, +-25,42, +-11,20, +66,44, +-4,24, +-29,44, +21,-40, +20,55, +10,-13, +-13,-36, +-65,38, +-10,20, +3,16, +6,18, +-26,-30, +-51,2, +25,-16, +25,-45, +-68,-26, +51,50, +-54,-27, +-11,25, +-24,5, +-38,39, +18,21, +-36,-5, +40,-22, +-38,28, +-2,46, +-38,-19, +13,-10, +-52,-18, +18,-3, +53,13, +23,-50, +-23,-35, +20,-24, +-15,-24, +30,-101, +81,-35, +27,-56, +-30,-26, +-48,-35, +90,-13, +66,-16, +29,29, +56,-25, +44,-2, +-8,51, +-31,44, +-33,-19, +-36,-17, +-16,33, +18,-38, +-2,-30, +44,35, +35,-68, +-14,22, +91,-29, +-13,13, +-3,-3, +-31,-29, +-18,-85, +23,4, +-22,77, +-64,2, +75,-75, +-73,-60, +-33,-38, +23,-20, +15,6, +-1,-52, +54,43, +84,-8, +12,-31, +10,58, +-14,34, +37,46, +31,18, +-3,-87, +-31,-65, +-39,1, +-5,-50, +-33,-24, +-2,-14, +28,-66, +-16,-55, +-46,-35, +24,-60, +3,40, +-23,36, +-28,-38, +-25,-24, +0,33, +1,-24, +-50,0, +82,-31, +64,52, +54,-47, +74,-60, +-21,28, +-60,-27, +-22,0, +-44,99, +-40,50, +-104,-40, +-27,-87, +42,-22, +6,-22, +36,-20, +48,58, +-94,26, +62,41, +1,6, +22,-72, +-70,10, +8,-99, +29,-36, +48,-12, +17,-17, +-23,-36, +-15,33, +44,-118, +-16,2, +-66,-82, +-30,19, +98,-15, +38,51, +-49,103, +61,-70, +19,-2, +-65,13, +-34,-63, +-15,63, +137,36, +24,35, +-74,16, +11,-26, +-10,-161, +25,18, +11,8, +7,-99, +74,32, +-4,-46, +7,42, +58,-61, +-33,11, +24,98, +-43,23, +109,26, +-8,17, +89,-18, +-73,8, +42,80, +23,45, +35,-109, +19,-65, +-66,-23, +-49,84, +17,49, +-45,-110, +73,-8, +-93,-33, +-8,78, +137,39, +-69,28, +-39,-79, +22,79, +-43,22, +-11,24, +-41,-4, +-28,-89, +25,40, +5,-32, +32,-81, +18,70, +31,36, +51,46, +-45,-22, +-111,-32, +-71,-32, +45,20, +23,-32, +-74,36, +-40,-81, +88,-40, +-102,-22, +-84,-5, +13,50, +59,-100, +25,91, +-10,80, +-3,-8, +15,-56, +-96,-49, +58,-25, +146,53, +32,8, +-164,27, +39,-146, +-98,78, +18,40, +-48,-7, +12,-36, +-9,39, +-37,98, +68,-30, +-6,34, +-151,-88, +-13,-70, +-18,23, +-34,23, +-90,82, +113,49, +-14,85, +58,-72, +121,-60, +-59,-185, +-17,-16, +-70,-16, +-30,45, +-30,-38, +48,-40, +-35,4, +94,-59, +-59,99, +19,41, +41,-1, +-31,-61, +46,41, +72,21, +-134,24, +-106,-89, +-20,-102, +-84,-127, +-33,11, +-4,106, +79,-64, +-22,65, +7,208, +115,28, +-5,28, +174,-19, +-68,-82, +79,4, +-72,-111, +-40,29, +41,-49, +8,87, +-80,38, +-11,-41, +-3,-97, +34,18, +-72,-103, +-88,-45, +-118,-17, +105,-122, +72,35, +117,92, +-1,-39, +53,-4, +-19,108, +-166,-68, +40,-65, +-125,37, +109,-6, +-5,-22, +-6,19, +8,-90, +-53,-98, +3,0, +-88,41, +24,5, +-48,36, +-49,-17, +2,-64, +41,-2, +-10,-52, +68,101, +76,40, +-96,-10, +132,9, +-136,181, +96,-78, +-98,-26, +59,21, +3,-89, +-14,221, +-18,71, +-140,8, +-94,-97, +-4,-116, +40,-6, +39,-58, +-4,-33, +69,77, +-75,-91, +-2,-137, +71,-98, +-110,155, +-64,29, +-228,-100, +27,-11, +50,9, +37,-79, +33,-22, +-222,-34, +65,-81, +-57,17, +6,17, +0,106, +-110,-88, +91,86, +22,80, +28,-20, +169,-80, +67,1, +87,-6, +-14,-75, +-32,162, +-58,19, +-28,-19, +75,-1, +-9,-119, +93,40, +56,97, +53,28, +-20,-62, +15,-85, +204,-4, +67,133, +-94,-58, +45,31, +7,-142, +-42,-195, +-70,58, +227,-9, +-18,-132, +168,0, +-175,-25, +66,-38, +-254,40, +13,66, +39,-64, +72,-99, +-31,47, +-104,-26, +-24,-1, +-121,18, +-82,-148, +-27,31, +-149,-28, +-46,-48, +-28,14, +-35,-137, +-169,76, +10,50, +-42,127, +-13,34, +-80,106, +-80,71, +-17,15, +62,-79, +26,19, +-132,86, +-47,60, +-79,64, +-87,-42, +-127,94, +59,77, +-43,108, +147,-27, +-11,106, +-45,83, +136,91, +-15,62, +66,89, +22,110, +-55,20, +28,78, +70,-49, +69,-142, +-68,153, +-38,42, +50,219, +-21,-148, +78,159, +82,-272, +0,-45, +23,-36, +109,108, +187,-65, +59,22, +-128,42, +52,-61, +-103,-176, +77,-102, +162,84, +-105,-48, +-127,-150, +71,21, +-15,-98, +96,-23, +35,11, +-137,68, +-25,42, +-49,-11, +74,-26, +0,-200, +54,-65, +67,-102, +-135,-69, +-41,45, +-2,-60, +29,123, +-187,14, +103,-110, +61,196, +-9,-10, +107,149, +46,-108, +-25,-118, +64,116, +89,78, +-66,280, +-96,-32, +4,3, +268,9, +37,2, +-34,44, +-8,-106, +86,6, +55,-45, +42,-31, +210,158, +10,142, +-272,57, +18,-15, +-163,-4, +92,11, +118,-90, +-115,210, +-24,-207, +-119,162, +26,-85, +-56,-28, +-59,-64, +-73,-42, +142,-13, +23,-22, +-11,81, +26,24, +-50,41, +-65,12, +27,121, +138,-52, +65,72, +36,10, +14,-113, +-31,83, +-4,-123, +95,220, +17,40, +-52,92, +-43,-31, +31,-111, +-79,-20, +-49,-246, +91,-14, +133,59, +16,197, +72,48, +142,6, +-30,-68, +143,98, +-52,55, +-134,-6, +-10,-19, +164,33, +-112,32, +221,99, +28,-225, +-33,87, +106,-248, +-180,-49, +-242,-16, +-67,-22, +4,-45, +-56,-78, +-82,149, +190,30, +222,79, +23,197, +76,96, +-108,-4, +-28,-96, +73,-23, +51,32, +-168,-36, +-6,-52, +-51,109, +87,-194, +41,60, +19,36, +12,21, +-87,62, +167,194, +127,-124, +266,-49, +-32,-72, +-30,-150, +-154,49, +-63,-41, +-116,159, +31,-27, +99,88, +73,151, +95,91, +-126,-118, +-27,-23, +-118,131, +33,-63, +92,-30, +-179,228, +13,-160, +62,213, +164,115, +-203,-2, +25,-258, +27,-61, +25,67, +161,97, +10,-84, +-226,28, +5,11, +-16,-163, +82,-22, +-101,234, +69,32, +130,-10, +9,-19, +110,150, +-102,-16, +60,-104, +42,121, +31,236, +41,36, +-5,-57, +-223,-77, +46,-34, +46,-27, +33,-75, +73,36, +-22,0, +133,51, +-41,137, +-177,-71, +58,41, +-47,140, +80,-73, +-149,-33, +-79,-86, +-58,67, +199,143, +18,-224, +30,150, +-164,100, +-76,-3, +294,95, +91,-92, +-56,-159, +-125,122, +-56,-90, +32,51, +3,-214, +-63,19, +-111,-155, +-78,163, +-112,-81, +75,-47, +146,-16, +-250,-46, +248,-62, +58,-113, +-71,37, +149,-26, +148,-104, +165,152, +-61,33, +-61,-65, +-156,-129, +20,-205, +-32,257, +56,101, +61,-142, +-26,20, +-17,1, +-240,-78, +3,-146, +150,-21, +-117,205, +317,12, +-1,-86, +98,11, +4,82, +56,-61, +9,-101, +155,-79, +78,31, +179,53, +-20,127, +87,-232, +-76,105, +-178,-8, +6,50, +-47,-146, +58,-60, +120,1, +116,-8, +172,219, +-164,245, +-228,-82, +7,175, +32,168, +-4,-82, +79,-38, +138,-177, +-45,-264, +-119,-13, +242,-54, +-117,84, +-43,13, +141,7, +2,104, +-91,82, +19,-68, +-14,0, +191,80, +181,57, +52,-79, +123,11, +110,74, +-21,42, +144,55, +158,148, +118,-37, +98,-92, +-159,-22, +-229,-87, +56,88, +-52,-90, +-29,-238, +98,-136, +-103,25, +130,-100, +55,-42, +38,190, +219,-34, +242,106, +-60,-81, +-206,163, +31,13, +180,-92, +135,154, +-15,129, +18,-238, +-73,40, +203,-171, +-90,-56, +105,-55, +38,-116, +39,27, +22,30, +-32,89, +77,124, +-113,100, +-196,13, +44,-143, +23,-158, +-8,-113, +-44,-236, +117,-204, +66,4, +144,271, +81,-209, +276,-252, +168,-26, +211,-76, +17,44, +154,22, +117,-67, +47,-198, +-71,5, +63,44, +136,141, +-78,-62, +-69,192, +-93,-46, +-2,69, +91,-120, +-95,186, +-146,-37, +-89,110, +108,219, +-185,-139, +56,212, +-1,-80, +131,75, +124,-75, +34,45, +-51,263, +117,-78, +-118,-108, +-216,240, +77,64, +6,132, +-35,18, +77,-215, +-203,7, +98,143, +-233,-112, +-135,-120, +-145,-52, +-62,120, +-64,69, +70,85, +-99,5, +-178,-36, +150,-137, +110,-1, +-52,-87, +10,149, +-62,56, +-188,205, +68,71, +-169,17, +21,-70, +25,-115, +-67,0, +-139,121, +-25,-208, +24,187, +-178,229, +186,-159, +48,-142, +-50,146, +3,-37, +-51,97, +31,6, +-163,205, +147,-54, +-23,56, +-121,32, +361,24, +-20,135, +50,-35, +-26,182, +-172,24, +-90,137, +177,138, +-137,-59, +-57,-50, +-40,-48, +-48,-48, +132,243, +171,-43, +-57,-81, +-13,-59, +151,80, +-44,-146, +-154,-82, +-143,165, +203,-194, +-64,204, +7,115, +-148,-41, +142,-69, +38,215, +214,84, +99,145, +-113,-141, +-227,180, +-89,275, +168,104, +57,-98, +-306,68, +-75,-132, +72,51, +-191,-99, +107,114, +-36,-36, +-24,-79, +-199,-70, +65,-240, +14,134, +192,24, +-9,-87, +13,-107, +27,-55, +188,-94, +120,-76, +-136,-76, +149,-124, +-27,-18, +-295,-235, +-103,-36, +42,120, +3,115, +-24,16, +168,100, +146,52, +317,30, +71,-9, +261,-22, +207,94, +49,-74, +-108,-34, +220,27, +-132,57, +-107,4, +64,-20, +-60,193, +-53,41, +-207,192, +-12,-79, +22,-221, +23,-21, +-221,67, +-30,6, +72,84, +76,35, +-147,53, +-98,30, +165,102, +-51,-142, +-212,47, +39,199, +96,-217, +203,187, +-70,243, +44,140, +194,-91, +270,-89, +124,-66, +57,-68, +63,127, +55,43, +-87,-99, +-7,156, +-20,-74, +-107,-59, +51,-28, +37,67, +-137,-180, +-144,180, +-96,129, +-112,107, +130,-134, +-140,-18, +-116,-144, +-101,46, +29,193, +99,173, +38,337, +-186,-53, +4,14, +-233,90, +118,114, +-99,-97, +166,124, +267,-130, +-190,-109, +69,-54, +20,-153, +6,0, +175,146, +-72,43, +-81,74, +-73,-1, +-140,-282, +42,21, +165,-87, +-44,141, +-58,80, +-126,203, +33,-15, +-145,5, +-84,115, +5,120, +143,-131, +147,293, +179,-66, +-139,-153, +40,-56, +-110,-106, +28,134, +20,84, +-69,0, +-230,-236, +91,-106, +-143,249, +-116,-33, +-62,80, +6,-33, +117,-170, +-80,-127, +58,-66, +47,119, +125,20, +125,-63, +-142,66, +-28,-126, +92,118, +99,277, +21,-104, +6,-170, +-151,158, +-87,-41, +-20,23, +-186,96, +-147,-159, +-26,-185, +162,5, +35,-292, +44,96, +-132,-9, +-290,2, +160,132, +-22,72, +-15,127, +39,-135, +-103,-120, +79,5, +83,-116, +95,-67, +76,29, +-100,-85, +-144,70, +21,-88, +-266,28, +-64,-100, +-8,-273, +-81,4, +-88,-133, +-178,-82, +100,-114, +91,-28, +66,-1, +-230,-2, +86,-8, +-54,6, +-129,-115, +30,33, +53,-6, +123,93, +34,106, +105,65, +-132,226, +-81,-173, +-41,-157, +121,265, +-58,68, +-3,58, +-83,-256, +-112,228, +-201,-84, +-78,121, +12,190, +140,63, +26,-33, +-118,-305, +158,35, +-117,98, +-177,9, +-239,136, +-235,-114, +88,110, +-18,154, +-62,-110, +-100,153, +125,-41, +-13,-343, +-129,47, +-28,113, +52,-203, +-296,-16, +77,-283, +55,256, +-35,41, +-56,-140, +124,59, +26,227, +-11,145, +-78,121, +12,96, +96,-38, +-166,-122, +195,96, +102,90, +-60,-40, +126,-86, +2,80, +20,103, +64,-85, +-58,-214, +-181,-51, +-39,255, +-233,80, +277,125, +-245,140, +137,53, +-158,-37, +40,53, +-75,160, +49,121, +40,-7, +-126,231, +-62,75, +-229,257, +-35,-46, +-124,118, +-107,-65, +-44,-58, +127,212, +-47,161, +119,76, +-91,-73, +25,59, +-27,79, +130,-19, +153,96, +117,-167, +-41,-131, +9,-104, +-20,112, +15,-22, +-4,-74, +19,134, +101,-194, +335,11, +110,-17, +-108,26, +-212,-48, +-45,8, +53,116, +-171,-117, +-139,-79, +1,206, +278,89, +32,106, +-292,150, +191,8, +129,-17, +-78,-242, +-8,-176, +-88,58, +63,-59, +148,-99, +46,-267, +25,-109, +-140,257, +15,-6, +-26,183, +-148,209, +84,-208, +-260,-48, +-33,44, +37,174, +-107,64, +-86,-107, +-139,-165, +202,-178, +90,110, +133,-193, +-118,-130, +166,-31, +23,275, +24,-107, +-68,20, +-210,1, +-153,77, +149,-7, +-107,-40, +-73,-109, +-161,-112, +117,-4, +5,-310, +90,-103, +-56,222, +-5,20, +-141,-58, +-125,139, +143,179, +-32,-94, +-21,-51, +64,143, +79,245, +79,225, +-84,58, +243,-91, +26,-68, +88,103, +-18,144, +-78,30, +91,-260, +-51,123, +105,127, +211,-97, +-164,-137, +-40,-72, +100,-187, +87,-107, +56,-7, +-131,80, +60,44, +-93,108, +126,155, +167,-13, +-212,-33, +-18,-24, +-185,-155, +23,-51, +-165,-180, +25,199, +-5,1, +7,235, +-16,68, +-24,148, +-23,51, +-136,-203, +-124,-180, +-53,71, +92,-124, +165,148, +-78,-54, +-19,-51, +4,133, +40,68, +184,-137, +-108,69, +-126,-156, +156,-186, +9,-78, +-48,217, +54,-144, +160,-45, +-156,14, +-47,133, +-30,126, +110,50, +145,126, +26,-92, +28,33, +78,-83, +56,194, +160,-175, +17,-100, +-145,74, +-50,-198, +47,148, +13,-89, +-29,-113, +65,18, +94,52, +44,-125, +178,-183, +-55,47, +21,-72, +254,120, +-87,46, +54,-212, +-29,156, +-10,-52, +-247,-63, +-117,-134, +99,-43, +148,149, +15,173, +-76,-34, +-92,36, +-38,30, +-10,-15, +-133,-103, +216,95, +-119,13, +7,29, +11,-7, +-151,-202, +29,133, +106,-131, +-85,-136, +-19,-22, +90,-29, +6,126, +29,24, +232,-98, +-32,-3, +-30,186, +-156,-121, +-210,222, +18,-5, +-78,61, +-128,-112, +161,-142, +-24,-98, +-192,-109, +-223,-204, +-76,41, +30,-115, +-52,90, +65,229, +34,20, +-45,-69, +56,45, +141,-15, +-24,-12, +94,61, +61,-1, +45,119, +113,-59, +-214,59, +39,118, +-65,-17, +21,136, +-52,-21, +99,-85, +97,78, +26,64, +-37,202, +53,-117, +63,-56, +76,-10, +16,-93, +11,-97, +-139,138, +117,-35, +-152,-139, +-96,9, +-34,4, +31,48, +-152,137, +-73,-51, +-88,24, +-91,-30, +4,-67, +-180,30, +-125,145, +-82,-162, +-52,-140, +-96,55, +127,118, +-162,-79, +-80,45, +-20,77, +140,-122, +-63,-78, +-139,-206, +33,-36, +-7,94, +53,56, +-102,-238, +4,-47, +69,39, +65,31, +-122,-137, +132,3, +-160,-149, +-91,5, +68,-104, +101,66, +112,-109, +-34,-163, +-45,-59, +-31,33, +-36,-82, +-43,152, +-92,97, +8,-183, +104,-64, +157,12, +-62,-216, +-156,111, +226,38, +107,-100, +-17,-35, +148,-52, +91,-128, +-100,-85, +106,-278, +110,121, +-147,-70, +-152,20, +142,84, +-101,40, +39,97, +22,72, +120,-47, +-93,35, +-119,-54, +-154,46, +33,-86, +0,-8, +229,78, +103,-40, +-113,126, +190,50, +65,30, +225,-19, +80,144, +114,-46, +-81,-20, +-105,-16, +-34,70, +-6,115, +59,29, +-16,80, +29,-21, +59,-67, +-27,27, +23,131, +-72,54, +135,104, +53,-116, +44,91, +107,-57, +115,-39, +23,-106, +68,-153, +-128,17, +118,-167, +-121,120, +54,-210, +-57,110, +-30,-208, +18,93, +165,-29, +57,62, +-145,-142, +97,-18, +54,119, +-24,65, +-92,51, +-7,213, +-97,-70, +36,70, +20,-35, +-37,-110, +-53,-176, +-79,64, +-90,-70, +-29,-63, +126,88, +-37,-114, +-47,120, +-132,-18, +-257,95, +26,20, +-85,175, +10,32, +63,-162, +2,-49, +103,-78, +-64,-32, +145,-87, +137,24, +14,177, +-49,122, +57,60, +104,-98, +61,13, +99,87, +134,41, +113,113, +-26,216, +-154,-90, +81,-84, +-147,145, +3,-90, +48,51, +73,173, +28,73, +24,66, +-135,25, +-131,-94, +86,-32, +-143,165, +140,-157, +-42,137, +32,-82, +-52,-94, +-25,-89, +52,-27, +142,45, +115,71, +11,80, +52,-99, +-27,22, +13,-102, +-53,-7, +83,-95, +231,107, +-3,171, +38,46, +77,83, +-97,102, +-28,32, +245,-26, +70,5, +28,139, +-1,91, +-142,45, +15,-62, +-87,159, +-138,-23, +26,-38, +155,85, +63,-180, +-32,-86, +177,-155, +-117,-109, +88,72, +-23,33, +-53,7, +0,-85, +-25,-61, +-83,-68, +-165,-21, +54,43, +-56,-34, +80,-6, +55,-66, +129,-45, +33,-53, +85,106, +2,-7, +-95,-31, +-45,-9, +143,141, +-140,60, +72,-90, +-168,24, +86,-52, +-151,47, +81,-99, +-151,99, +-38,-97, +-97,79, +-94,116, +63,43, +-60,46, +43,98, +-38,7, +134,55, +63,-72, +22,34, +-33,24, +-27,18, +35,19, +89,-4, +18,48, +90,-55, +18,-94, +-104,-17, +72,20, +27,148, +34,65, +-10,199, +91,-23, +12,59, +71,19, +-15,120, +6,143, +-8,-128, +-66,-25, +64,-107, +-55,-81, +13,55, +38,135, +58,-143, +69,82, +23,18, +11,-95, +40,-104, +-100,100, +29,29, +-250,-28, +-29,61, +26,75, +-142,18, +-15,99, +94,81, +-87,-9, +15,-107, +-69,102, +-83,140, +-39,-62, +17,-37, +69,-21, +46,-41, +-73,-27, +-8,-14, +-92,-19, +-91,27, +-7,149, +58,-3, +-157,-97, +26,16, +-68,-80, +-61,60, +-18,-26, +94,56, +-114,4, +-96,-34, +6,-44, +79,91, +-59,-47, +-66,-72, +-140,-19, +-12,44, +29,52, +6,-137, +-9,-1, +38,-27, +68,26, +-127,-81, +-58,-38, +48,-94, +46,-74, +-51,-65, +-10,3, +-22,-71, +37,-89, +13,-20, +65,-48, +25,18, +-52,-89, +-46,-36, +-7,-36, +20,51, +11,-106, +-91,58, +-14,62, +-24,3, +-32,36, +17,19, +176,-44, +-61,94, +-24,61, +46,-40, +-24,-22, +83,68, +30,-137, +10,32, +39,-34, +-22,50, +78,69, +-7,0, +-11,34, +29,48, +-15,53, +-26,-34, +35,16, +92,44, +58,-20, +-8,-23, +-89,15, +5,-162, +-128,-131, +-62,78, +-27,-25, +-89,-3, +-22,-20, +145,-81, +-73,-27, +103,-96, +8,-96, +11,103, +-27,38, +3,30, +31,37, +56,23, +-73,-32, +-69,9, +10,23, +-67,-11, +35,-9, +-86,-45, +12,-27, +76,60, +-37,-53, +2,67, +-19,-67, +11,-24, +2,-16, +31,-58, +33,7, +93,81, +7,51, +-106,-72, +-43,-98, +73,-43, +-83,52, +40,-73, +-29,73, +0,32, +81,40, +-72,13, +-59,8, +-39,89, +4,17, +-1,20, +-37,11, +-8,-10, +-47,25, +73,-25, +-98,-60, +-23,4, +16,59, +-70,60, +101,0, +-60,22, +-15,36, +31,29, +74,61, +-1,23, +78,-95, +54,7, +-116,24, +32,39, +37,-31, +-8,32, +-110,22, +-6,-21, +-54,-37, +7,25, +15,83, +24,-30, +9,-34, +1,35, +-30,3, +72,67, +-67,-6, +-45,-90, +-55,-25, +-21,-17, +67,-19, +80,3, +-3,0, +116,4, +-27,-17, +14,-5, +-84,-82, +-18,33, +-30,-107, +-15,-8, +14,26, +36,47, +59,6, +16,-48, +15,31, +25,-45, +-69,63, +-52,55, +-31,-69, +-59,5, +-31,31, +61,46, +4,18, +-35,-27, +-47,24, +87,-21, +34,-5, +-40,86, +-20,-2, +25,46, +63,-19, +101,46, +52,26, +-35,-27, +-13,22, +51,8, +51,-7, +-26,-61, +24,-24, +55,31, +-28,-28, +-83,50, +-48,4, +13,-18, +-64,-77, +-18,34, +27,-16, +-11,-16, +33,-64, +-26,-46, +10,15, +25,42, +63,-19, +-107,44, +-14,-22, +4,67, +-30,32, +-82,0, +-1,-83, +3,14, +40,3, +60,-54, +-78,2, +-8,-58, +40,10, +36,-21, +49,-17, +15,-2, +12,-34, +-86,45, +-58,31, +36,3, +-31,14, +-33,-47, +-45,1, +-53,54, +48,-2, +25,-17, +11,-28, +63,69, +22,41, +-11,-85, +-17,-17, +4,9, +25,-21, +-19,-46, +-7,-35, +28,40, +-44,65, +5,53, +-18,-16, +16,4, +-13,10, +7,-7, +13,-11, +-74,15, +-9,5, +2,48, +11,32, +6,-3, +20,-19, +-10,27, +-7,-30, +72,35, +20,8, +-4,-6, +3,-27, +-13,-12, +41,-40, +6,-13, +65,-47, +10,-6, +29,0, +9,7, +36,2, +20,-28, +-18,25, +14,-51, +40,43, +6,-38, +38,33, +35,-61, +0,-19, +-49,-1, +-15,-7, +21,10, +12,20, +-10,-14, +-16,21, +24,17, +14,1, +-20,25, +-12,-29, +27,17, +13,4, +31,-33, +47,25, +-2,22, +-17,-19, +20,-8, +3,34, +17,-27, +-72,-11, +11,-16, +13,3, +-20,-22, +-21,0, +-22,12, +6,-3, +24,-25, +-12,15, +21,-7, +16,-16, +-30,-48, +39,-34, +13,8, +-26,-11, +-2,10, +-37,-6, +18,12, +39,17, +-5,-23, +15,-24, +-1,-17, +7,-6, +-41,-12, +52,8, +12,0, +-23,7, +-2,-21, +4,-6, +24,1, +10,17, +6,2, +8,18, +-6,-5, +-2,-13, +-11,1, +8,-8, +-2,-2, +-5,-16, +3,26, +-12,2, +-22,-13, +7,-18, +-21,2, +-15,-6, +-11,-15, +-6,-5, +5,-23, +-8,2, +6,-8, +-8,-6, +-3,21, +-5,9, +-10,-9, +-2,12, +-10,-8, +-3,-6, +26,17, +-4,-9, +1,-8, +15,-14, +-17,-1, +0,10, +-12,5, +-12,4, +-7,-16, +3,-9, +0,-3, +4,-7, +2,-6, +-5,-3, +-8,3, +14,5, +10,7, +-7,-5, +-2,-3, +6,2, +-7,9, +6,4, +5,-2, +-17,3, +-2,-2, +2,6, +-8,-4, +11,-9, +3,2, +-4,-5, +-5,-2, +-3,-5, +3,1, +4,0, +1,0, +-8,-5, +0,3, +2,0, +-3,6, +8,3, +-3,0, +0,-2, +5,-1, +-2,-2, +-1,0, +8,-2, +-3,1, +-1,1, +4,0, +-3,-1, +-4,-1, +6,0, +-2,0, +-3,0, +6,0, +-3,0, +-2,0, +6,0, +-4,1, +-3,1, +4,0, +-1,-1, +-3,-1, +8,2, +-1,0, +-2,2, +5,1, +0,2, +-3,0, +8,-3, +-3,-6, +2,0, +0,-3, +-8,5, +1,0, +4,0, +3,-1, +-3,5, +-5,2, +-4,5, +3,-2, +11,9, +-8,4, +2,-6, +-2,2, +-17,-3, +5,2, +6,-4, +-7,-9, +6,-2, +-2,3, +-7,5, +10,-7, +14,-5, +-8,-3, +-5,3, +2,6, +4,7, +0,3, +3,9, +-7,16, +-12,-4, +-12,-5, +0,-10, +-17,1, +15,14, +1,8, +-4,9, +26,-17, +-3,6, +-10,8, +-2,-12, +-10,9, +-5,-9, +-3,-21, +-8,6, +6,8, +-8,-2, +5,23, +-6,5, +-11,15, +-15,6, +-21,-2, +7,18, +-22,13, +-12,-2, +3,-26, +-5,16, +-2,2, +8,8, +-11,-1, +-2,13, +-6,5, +8,-18, +6,-2, +10,-17, +24,-1, +4,6, +-2,21, +-23,-7, +12,0, +52,-8, +-41,12, +7,6, +-1,17, +15,24, +-5,23, +39,-17, +18,-12, +-37,6, +-2,-10, +-26,11, +13,-8, +39,34, +-30,48, +16,16, +21,7, +-12,-15, +24,25, +6,3, +-22,-12, +-21,0, +-20,22, +13,-3, +11,16, +-72,11, +17,27, +3,-34, +20,8, +-17,19, +-2,-22, +47,-25, +31,33, +13,-4, +27,-17, +-12,29, +-20,-25, +14,-1, +24,-17, +-16,-21, +-10,14, +12,-20, +21,-10, +-15,7, +-49,1, +0,19, +35,61, +38,-33, +6,38, +40,-43, +14,51, +-18,-25, +20,28, +36,-2, +9,-7, +29,0, +10,6, +65,47, +6,13, +41,40, +-13,12, +3,27, +-4,6, +20,-8, +72,-35, +-7,30, +-10,-27, +20,19, +6,3, +11,-32, +2,-48, +-9,-5, +-74,-15, +13,11, +7,7, +-13,-10, +16,-4, +-18,16, +5,-53, +-44,-65, +28,-40, +-7,35, +-19,46, +25,21, +4,-9, +-17,17, +-11,85, +22,-41, +63,-69, +11,28, +25,17, +48,2, +-53,-54, +-45,-1, +-33,47, +-31,-14, +36,-3, +-58,-31, +-86,-45, +12,34, +15,2, +49,17, +36,21, +40,-10, +-8,58, +-78,-2, +60,54, +40,-3, +3,-14, +-1,83, +-82,0, +-30,-32, +4,-67, +-14,22, +-107,-44, +63,19, +25,-42, +10,-15, +-26,46, +33,64, +-11,16, +27,16, +-18,-34, +-64,77, +13,18, +-48,-4, +-83,-50, +-28,28, +55,-31, +24,24, +-26,61, +51,7, +51,-8, +-13,-22, +-35,27, +52,-26, +101,-46, +63,19, +25,-46, +-20,2, +-40,-86, +34,5, +87,21, +-47,-24, +-35,27, +4,-18, +61,-46, +-31,-31, +-59,-5, +-31,69, +-52,-55, +-69,-63, +25,45, +15,-31, +16,48, +59,-6, +36,-47, +14,-26, +-15,8, +-30,107, +-18,-33, +-84,82, +14,5, +-27,17, +116,-4, +-3,0, +80,-3, +67,19, +-21,17, +-55,25, +-45,90, +-67,6, +72,-67, +-30,-3, +1,-35, +9,34, +24,30, +15,-83, +7,-25, +-54,37, +-6,21, +-110,-22, +-8,-32, +37,31, +32,-39, +-116,-24, +54,-7, +78,95, +-1,-23, +74,-61, +31,-29, +-15,-36, +-60,-22, +101,0, +-70,-60, +16,-59, +-23,-4, +-98,60, +73,25, +-47,-25, +-8,10, +-37,-11, +-1,-20, +4,-17, +-39,-89, +-59,-8, +-72,-13, +81,-40, +0,-32, +-29,-73, +40,73, +-83,-52, +73,43, +-43,98, +-106,72, +7,-51, +93,-81, +33,-7, +31,58, +2,16, +11,24, +-19,67, +2,-67, +-37,53, +76,-60, +12,27, +-86,45, +35,9, +-67,11, +10,-23, +-69,-9, +-73,32, +56,-23, +31,-37, +3,-30, +-27,-38, +11,-103, +8,96, +103,96, +-73,27, +145,81, +-22,20, +-89,3, +-27,25, +-62,-78, +-128,131, +5,162, +-89,-15, +-8,23, +58,20, +92,-44, +35,-16, +-26,34, +-15,-53, +29,-48, +-11,-34, +-7,0, +78,-69, +-22,-50, +39,34, +10,-32, +30,137, +83,-68, +-24,22, +46,40, +-24,-61, +-61,-94, +176,44, +17,-19, +-32,-36, +-24,-3, +-14,-62, +-91,-58, +11,106, +20,-51, +-7,36, +-46,36, +-52,89, +25,-18, +65,48, +13,20, +37,89, +-22,71, +-10,-3, +-51,65, +46,74, +48,94, +-58,38, +-127,81, +68,-26, +38,27, +-9,1, +6,137, +29,-52, +-12,-44, +-140,19, +-66,72, +-59,47, +79,-91, +6,44, +-96,34, +-114,-4, +94,-56, +-18,26, +-61,-60, +-68,80, +26,-16, +-157,97, +58,3, +-7,-149, +-91,-27, +-92,19, +-8,14, +-73,27, +46,41, +69,21, +17,37, +-39,62, +-83,-140, +-69,-102, +15,107, +-87,9, +94,-81, +-15,-99, +-142,-18, +26,-75, +-29,-61, +-250,28, +29,-29, +-100,-100, +40,104, +11,95, +23,-18, +69,-82, +58,143, +38,-135, +13,-55, +-55,81, +64,107, +-66,25, +-8,128, +6,-143, +-15,-120, +71,-19, +12,-59, +91,23, +-10,-199, +34,-65, +27,-148, +72,-20, +-104,17, +18,94, +90,55, +18,-48, +89,4, +35,-19, +-27,-18, +-33,-24, +22,-34, +63,72, +134,-55, +-38,-7, +43,-98, +-60,-46, +63,-43, +-94,-116, +-97,-79, +-38,97, +-151,-99, +81,99, +-151,-47, +86,52, +-168,-24, +72,90, +-140,-60, +143,-141, +-45,9, +-95,31, +2,7, +85,-106, +33,53, +129,45, +55,66, +80,6, +-56,34, +54,-43, +-165,21, +-83,68, +-25,61, +0,85, +-53,-7, +-23,-33, +88,-72, +-117,109, +177,155, +-32,86, +63,180, +155,-85, +26,38, +-138,23, +-87,-159, +15,62, +-142,-45, +-1,-91, +28,-139, +70,-5, +245,26, +-28,-32, +-97,-102, +77,-83, +38,-46, +-3,-171, +231,-107, +83,95, +-53,7, +13,102, +-27,-22, +52,99, +11,-80, +115,-71, +142,-45, +52,27, +-25,89, +-52,94, +32,82, +-42,-137, +140,157, +-143,-165, +86,32, +-131,94, +-135,-25, +24,-66, +28,-73, +73,-173, +48,-51, +3,90, +-147,-145, +81,84, +-154,90, +-26,-216, +113,-113, +134,-41, +99,-87, +61,-13, +104,98, +57,-60, +-49,-122, +14,-177, +137,-24, +145,87, +-64,32, +103,78, +2,49, +63,162, +10,-32, +-85,-175, +26,-20, +-257,-95, +-132,18, +-47,-120, +-37,114, +126,-88, +-29,63, +-90,70, +-79,-64, +-53,176, +-37,110, +20,35, +36,-70, +-97,70, +-7,-213, +-92,-51, +-24,-65, +54,-119, +97,18, +-145,142, +57,-62, +165,29, +18,-93, +-30,208, +-57,-110, +54,210, +-121,-120, +118,167, +-128,-17, +68,153, +23,106, +115,39, +107,57, +44,-91, +53,116, +135,-104, +-72,-54, +23,-131, +-27,-27, +59,67, +29,21, +-16,-80, +59,-29, +-6,-115, +-34,-70, +-105,16, +-81,20, +114,46, +80,-144, +225,19, +65,-30, +190,-50, +-113,-126, +103,40, +229,-78, +0,8, +33,86, +-154,-46, +-119,54, +-93,-35, +120,47, +22,-72, +39,-97, +-101,-40, +142,-84, +-152,-20, +-147,70, +110,-121, +106,278, +-100,85, +91,128, +148,52, +-17,35, +107,100, +226,-38, +-156,-111, +-62,216, +157,-12, +104,64, +8,183, +-92,-97, +-43,-152, +-36,82, +-31,-33, +-45,59, +-34,163, +112,109, +101,-66, +68,104, +-91,-5, +-160,149, +132,-3, +-122,137, +65,-31, +69,-39, +4,47, +-102,238, +53,-56, +-7,-94, +33,36, +-139,206, +-63,78, +140,122, +-20,-77, +-80,-45, +-162,79, +127,-118, +-96,-55, +-52,140, +-82,162, +-125,-145, +-180,-30, +4,67, +-91,30, +-88,-24, +-73,51, +-152,-137, +31,-48, +-34,-4, +-96,-9, +-152,139, +117,35, +-139,-138, +11,97, +16,93, +76,10, +63,56, +53,117, +-37,-202, +26,-64, +97,-78, +99,85, +-52,21, +21,-136, +-65,17, +39,-118, +-214,-59, +113,59, +45,-119, +61,1, +94,-61, +-24,12, +141,15, +56,-45, +-45,69, +34,-20, +65,-229, +-52,-90, +30,115, +-76,-41, +-223,204, +-192,109, +-24,98, +161,142, +-128,112, +-78,-61, +18,5, +-210,-222, +-156,121, +-30,-186, +-32,3, +232,98, +29,-24, +6,-126, +90,29, +-19,22, +-85,136, +106,131, +29,-133, +-151,202, +11,7, +7,-29, +-119,-13, +216,-95, +-133,103, +-10,15, +-38,-30, +-92,-36, +-76,34, +15,-173, +148,-149, +99,43, +-117,134, +-247,63, +-10,52, +-29,-156, +54,212, +-87,-46, +254,-120, +21,72, +-55,-47, +178,183, +44,125, +94,-52, +65,-18, +-29,113, +13,89, +47,-148, +-50,198, +-145,-74, +17,100, +160,175, +56,-194, +78,83, +28,-33, +26,92, +145,-126, +110,-50, +-30,-126, +-47,-133, +-156,-14, +160,45, +54,144, +-48,-217, +9,78, +156,186, +-126,156, +-108,-69, +184,137, +40,-68, +4,-133, +-19,51, +-78,54, +165,-148, +92,124, +-53,-71, +-124,180, +-136,203, +-23,-51, +-24,-148, +-16,-68, +7,-235, +-5,-1, +25,-199, +-165,180, +23,51, +-185,155, +-18,24, +-212,33, +167,13, +126,-155, +-93,-108, +60,-44, +-131,-80, +56,7, +87,107, +100,187, +-40,72, +-164,137, +211,97, +105,-127, +-51,-123, +91,260, +-78,-30, +-18,-144, +88,-103, +26,68, +243,91, +-84,-58, +79,-225, +79,-245, +64,-143, +-21,51, +-32,94, +143,-179, +-125,-139, +-141,58, +-5,-20, +-56,-222, +90,103, +5,310, +117,4, +-161,112, +-73,109, +-107,40, +149,7, +-153,-77, +-210,-1, +-68,-20, +24,107, +23,-275, +166,31, +-118,130, +133,193, +90,-110, +202,178, +-139,165, +-86,107, +-107,-64, +37,-174, +-33,-44, +-260,48, +84,208, +-148,-209, +-26,-183, +15,6, +-140,-257, +25,109, +46,267, +148,99, +63,59, +-88,-58, +-8,176, +-78,242, +129,17, +191,-8, +-292,-150, +32,-106, +278,-89, +1,-206, +-139,79, +-171,117, +53,-116, +-45,-8, +-212,48, +-108,-26, +110,17, +335,-11, +101,194, +19,-134, +-4,74, +15,22, +-20,-112, +9,104, +-41,131, +117,167, +153,-96, +130,19, +-27,-79, +25,-59, +-91,73, +119,-76, +-47,-161, +127,-212, +-44,58, +-107,65, +-124,-118, +-35,46, +-229,-257, +-62,-75, +-126,-231, +40,7, +49,-121, +-75,-160, +40,-53, +-158,37, +137,-53, +-245,-140, +277,-125, +-233,-80, +-39,-255, +-181,51, +-58,214, +64,85, +20,-103, +2,-80, +126,86, +-60,40, +102,-90, +195,-96, +-166,122, +96,38, +12,-96, +-78,-121, +-11,-145, +26,-227, +124,-59, +-56,140, +-35,-41, +55,-256, +77,283, +-296,16, +52,203, +-28,-113, +-129,-47, +-13,343, +125,41, +-100,-153, +-62,110, +-18,-154, +88,-110, +-235,114, +-239,-136, +-177,-9, +-117,-98, +158,-35, +-118,305, +26,33, +140,-63, +12,-190, +-78,-121, +-201,84, +-112,-228, +-83,256, +-3,-58, +-58,-68, +121,-265, +-41,157, +-81,173, +-132,-226, +105,-65, +34,-106, +123,-93, +53,6, +30,-33, +-129,115, +-54,-6, +86,8, +-230,2, +66,1, +91,28, +100,114, +-178,82, +-88,133, +-81,-4, +-8,273, +-64,100, +-266,-28, +21,88, +-144,-70, +-100,85, +76,-29, +95,67, +83,116, +79,-5, +-103,120, +39,135, +-15,-127, +-22,-72, +160,-132, +-290,-2, +-132,9, +44,-96, +35,292, +162,-5, +-26,185, +-147,159, +-186,-96, +-20,-23, +-87,41, +-151,-158, +6,170, +21,104, +99,-277, +92,-118, +-28,126, +-142,-66, +125,63, +125,-20, +47,-119, +58,66, +-80,127, +117,170, +6,33, +-62,-80, +-116,33, +-143,-249, +91,106, +-230,236, +-69,0, +20,-84, +28,-134, +-110,106, +40,56, +-139,153, +179,66, +147,-293, +143,131, +5,-120, +-84,-115, +-145,-5, +33,15, +-126,-203, +-58,-80, +-44,-141, +165,87, +42,-21, +-140,282, +-73,1, +-81,-74, +-72,-43, +175,-146, +6,0, +-121,14, +110,-25, +-304,-55, +147,17, +52,102, +34,149, +-317,-16, +-29,-82, +74,58, +148,-17, +-264,-63, +70,-208, +162,99, +41,-143, +137,101, +-4,289, +-37,122, +-1,-88, +41,-188, +149,-136, +109,-158, +-195,69, +21,24, +79,116, +13,-96, +59,17, +37,17, +-159,52, +186,181, +186,-136, +167,-219, +219,-124, +-163,28, +-153,151, +-268,-12, +15,-4, +-212,-20, +-81,19, +123,125, +-154,95, +-65,89, +-2,116, +-80,246, +-337,-31, +-10,161, +193,-93, +-130,-12, +-153,131, +45,94, +45,-20, +-53,15, +143,125, +32,-72, +-197,29, +-16,-109, +-35,-102, +21,92, +-150,93, +-6,-101, +-40,160, +-87,119, +-36,48, +-45,-118, +28,122, +-48,97, +156,-26, +17,-45, +-109,-135, +221,-240, +-16,-14, +-33,12, +142,-67, +-173,163, +78,253, +19,-185, +21,-180, +-144,-108, +-62,42, +-163,-125, +-195,-61, +-167,-80, +-99,79, +43,104, +208,94, +-266,-155, +335,-79, +115,67, +-15,71, +50,-8, +-62,154, +131,14, +-32,54, +15,-14, +-246,-60, +60,-4, +-141,-18, +-39,-72, +259,-169, +-137,-68, +24,56, +108,139, +88,-123, +-175,73, +-145,85, +34,-241, +-163,63, +114,73, +50,-103, +227,202, +-14,-147, +40,-150, +43,26, +203,38, +-83,320, +34,157, +98,-52, +57,-11, +131,21, +237,91, +97,15, +61,-75, +-91,115, +-104,29, +-25,-142, +262,-44, +38,-110, +3,-95, +-315,-18, +122,-45, +243,165, +-123,-128, +-121,185, +-46,-98, +250,100, +-197,35, +87,-147, +-8,32, +159,166, +149,-26, +-203,-48, +-175,44, +-28,12, +87,180, +-267,-61, +190,62, +-60,245, +79,-39, +-160,-155, +-89,222, +-19,15, +142,80, +213,0, +-105,-156, +134,-14, +-96,-166, +-206,-80, +-90,4, +142,20, +-266,-4, +111,101, +-141,-131, +-10,-71, +140,-25, +-189,4, +-71,-172, +99,-26, +-216,165, +84,-18, +136,136, +65,-75, +9,61, +-18,-161, +76,62, +-26,-148, +-203,-27, +71,-30, +-169,-145, +149,-4, +-225,-32, +-72,-57, +78,-23, +-150,-81, +-147,47, +-14,-3, +-51,93, +-91,99, +-42,-190, +218,-118, +-73,97, +-33,225, +8,106, +-11,61, +39,-154, +49,-110, +-230,27, +16,190, +-148,87, +-92,32, +2,-53, +62,21, +297,154, +-140,-6, +110,76, +125,240, +-128,65, +-3,-148, +-23,-176, +57,-51, +-76,212, +149,-140, +27,-70, +165,-146, +-142,89, +73,-1, +-6,18, +79,-14, +-252,-127, +92,173, +-36,-112, +-22,91, +256,27, +-10,-38, +-41,94, +72,122, +-106,22, +44,-315, +-55,68, +-84,177, +158,92, +46,113, +92,204, +-134,-18, +102,39, +149,-84, +-27,100, +74,55, +-43,93, +9,29, +105,165, +-63,-168, +-31,-121, +-2,-98, +160,-88, +-221,-59, +-70,-11, +84,-326, +-94,-204, +-108,-13, +94,179, +97,-81, +-272,-111, +211,123, +58,158, +-79,-11, +-95,22, +39,-121, +15,195, +260,-161, +-269,15, +-111,-126, +-124,-8, +-5,-130, +155,-68, +16,-17, +56,-13, +-3,-53, +51,-354, +112,5, +40,-120, +144,10, +-68,-137, +67,-72, +-44,-50, +135,60, +-208,63, +-108,109, +-32,18, +36,-68, +-87,-39, +317,136, +-147,38, +-88,13, +11,50, +76,18, +62,25, +-268,-119, +93,-95, +-135,70, +-91,0, +-169,93, +-228,-21, +-175,-18, +52,263, +-250,0, +29,48, +109,-35, +98,-9, +-33,16, +-52,98, +-36,-196, +-3,57, +104,200, +66,234, +17,-32, +-79,56, +-135,12, +-81,9, +-78,22, +-223,-10, +24,79, +154,-15, +58,48, +-52,-109, +-165,204, +78,-4, +66,-127, +90,98, +-109,-162, +-72,4, +-110,33, +15,-97, +211,100, +202,-71, +-39,-157, +-248,-30, +-53,79, +116,210, +-49,-110, +-49,-163, +-70,-81, +47,119, +8,100, +-24,-90, +-74,-128, +24,-158, +24,25, +27,-81, +-82,44, +-148,81, +-163,72, +-154,9, +-76,-114, +-195,-89, +63,-169, +105,-95, +-15,44, +178,48, +106,29, +-144,42, +-81,52, +-60,46, +-56,107, +-7,96, +2,33, +-82,-34, +-113,237, +-210,32, +4,126, +104,110, +-21,-151, +62,224, +5,58, +12,-6, +40,150, +-130,177, +-162,-90, +196,117, +228,-179, +-181,-40, +50,31, +-124,37, +-162,-108, +17,42, +61,99, +217,48, +114,43, +-101,68, +73,-15, +-236,-136, +-122,89, +-195,-106, +-75,0, +32,3, +-22,249, +28,-83, +-64,-28, +131,-1, +113,-44, +53,-15, +143,-109, +-31,-28, +123,42, +187,-84, +72,151, +130,164, +21,147, +-42,77, +29,-3, +-80,-190, +-31,0, +-58,174, +21,-78, +98,-5, +213,52, +-125,19, +23,-153, +-51,89, +67,274, +-190,139, +76,0, +142,132, +-142,-65, +-33,80, +-47,-3, +102,-49, +87,95, +98,-24, +-193,125, +-164,57, +6,-65, +-142,-113, +-82,-8, +-99,90, +18,121, +105,43, +-35,169, +36,-55, +-86,38, +175,-19, +-143,118, +48,46, +12,48, +-68,-45, +27,129, +67,-139, +78,-168, +-87,112, +-42,-150, +182,-47, +-82,154, +155,-103, +55,64, +137,-80, +-62,21, +37,-156, +-83,53, +-75,81, +-72,12, +-52,124, +-50,99, +-35,-24, +5,-21, +45,-80, +-68,133, +-7,-92, +-13,83, +56,-2, +99,24, +-230,55, +-147,145, +29,-8, +-160,33, +9,-25, +127,-30, +1,20, +-50,-151, +76,106, +-52,-21, +-142,-138, +26,87, +23,59, +-53,37, +25,-109, +-97,-174, +157,37, +-58,-95, +-13,33, +79,-15, +-67,-44, +70,26, +7,121, +-71,194, +18,133, +32,325, +-92,32, +62,-58, +-102,52, +-83,-25, +-62,53, +-108,-147, +-71,-103, +-71,-40, +-67,-69, +-89,136, +-213,-70, +-56,-87, +-80,-130, +-67,-14, +89,-35, +191,57, +11,-107, +37,108, +-124,-138, +47,59, +-85,25, +-155,-83, +45,-10, +40,-167, +-128,118, +18,126, +33,27, +34,-17, +4,121, +157,-82, +36,-56, +-23,30, +-182,-2, +52,-93, +-2,-94, +-54,-32, +88,38, +-151,-146, +106,145, +-65,137, +11,62, +-31,-27, +-82,-70, +-171,-124, +57,-95, +-3,-177, +47,-26, +-105,-40, +-94,-131, +-64,-39, +-89,-81, +134,-115, +-61,3, +-48,-73, +133,33, +135,-30, +268,1, +99,-7, +120,-27, +42,12, +-49,76, +-9,-76, +-9,43, +20,50, +-124,-89, +-11,160, +-153,-127, +-29,-39, +195,103, +-65,-54, +-59,-120, +28,12, +-38,10, +22,-41, +-103,41, +28,88, +-3,-45, +-45,-20, +88,-86, +44,-99, +90,-113, +6,-52, +24,146, +-13,-12, +79,-92, +-86,52, +104,-28, +-104,7, +-29,5, +142,-67, +50,-49, +18,-28, +97,-101, +-2,-28, +-74,-23, +-70,35, +88,-12, +-160,195, +125,-36, +7,86, +-65,18, +25,52, +-78,-95, +-46,20, +-73,144, +-26,-73, +106,-10, +-57,52, +75,-88, +69,60, +38,-39, +-70,86, +84,-96, +11,69, +117,20, +48,22, +80,-24, +4,-155, +-103,-13, +-40,-51, +65,-123, +26,-99, +88,11, +-38,127, +28,11, +12,45, +-31,-120, +83,-15, +-23,55, +72,35, +85,-44, +179,-95, +84,122, +-101,-129, +-36,28, +118,68, +-91,123, +12,-15, +94,-20, +-8,-53, +-104,-5, +-32,-42, +75,16, +80,18, +153,33, +39,131, +23,77, +-37,64, +2,72, +-42,-23, +-76,118, +31,75, +-16,16, +-68,61, +50,-67, +32,29, +135,14, +-111,-62, +15,-98, +-11,-150, +-25,-29, +-68,-118, +84,84, +22,8, +0,92, +114,166, +-11,-106, +-61,-83, +33,23, +33,-141, +-103,38, +33,81, +-96,95, +71,-38, +70,-113, +66,1, +24,53, +80,-8, +5,-14, +76,75, +-48,2, +76,-8, +131,-51, +-9,-158, +95,-6, +-20,21, +40,-53, +93,-10, +24,-2, +9,-118, +50,-29, +8,64, +23,48, +32,62, +-55,30, +-97,4, +-70,-34, +-27,-128, +-39,-38, +64,-101, +62,-106, +-25,-21, +20,-4, +-49,26, +-38,-1, +-111,-22, +-24,-37, +45,27, +58,3, +-19,-10, +-127,-66, +-15,16, +62,30, +105,-18, +-72,-120, +-65,-54, +1,140, +-42,101, +53,-5, +-32,-27, +-46,-78, +44,-20, +-92,9, +11,80, +26,-17, +-4,-22, +74,-80, +-72,53, +40,96, +20,-33, +14,-64, +-12,-72, +15,-37, +25,-57, +-19,-49, +41,2, +68,53, +143,31, +-23,9, +-29,-19, +-24,-25, +61,-19, +-26,43, +-9,87, +-6,-59, +74,-18, +22,-74, +78,-23, +-33,-121, +-8,-93, +92,-52, +-41,2, +-28,-81, +-18,23, +-46,-93, +47,88, +22,33, +-20,-133, +48,56, +42,22, +-8,61, +-38,-52, +21,26, +32,-79, +45,-52, +13,-8, +-10,75, +-51,-72, +-25,54, +-55,12, +33,40, +-102,38, +-52,33, +-99,-7, +28,6, +1,60, +-61,-5, +-18,45, +-40,-32, +-6,-147, +-71,36, +45,-30, +-48,86, +62,2, +-59,-55, +15,-39, +76,84, +35,-18, +-43,-1, +-18,-37, +44,68, +33,-41, +-129,-48, +-78,40, +-46,-37, +-4,-59, +-33,8, +-42,71, +-67,-80, +-11,19, +-10,30, +75,-13, +1,15, +32,-7, +22,20, +13,38, +-56,34, +61,-14, +41,-33, +38,100, +52,-16, +68,4, +-17,-1, +-46,-47, +-57,37, +84,-22, +20,-19, +-16,49, +25,21, +-4,34, +28,2, +-31,-38, +43,12, +-53,-66, +-1,65, +48,-22, +-30,-2, +1,-6, +-65,83, +1,-20, +8,23, +45,-9, +-91,16, +-59,-37, +62,3, +42,12, +25,17, +34,31, +4,-14, +28,113, +-3,-35, +-23,-63, +54,32, +52,-75, +5,-21, +-40,0, +-21,9, +-17,-2, +58,13, +61,-30, +25,5, +-39,33, +-33,26, +-3,-67, +47,12, +9,-3, +-25,-72, +23,-2, +-35,-1, +-18,-38, +17,-2, +-33,-46, +-19,42, +-11,-53, +-25,-6, +-6,-32, +-31,19, +15,21, +-47,-34, +41,40, +-15,53, +32,-38, +23,22, +-1,-27, +-39,-23, +-14,6, +16,-26, +-45,14, +-4,17, +1,-73, +14,34, +0,-25, +0,-9, +-24,-45, +-20,-13, +-40,-9, +2,33, +-19,3, +0,53, +57,3, +-11,-43, +2,-6, +-6,-25, +24,47, +40,-32, +-4,11, +-8,-30, +60,17, +-21,-46, +-22,-35, +31,17, +9,42, +0,17, +1,-34, +-19,31, +9,-17, +37,36, +-42,-47, +46,-17, +-10,46, +9,18, +-9,-37, +-16,-47, +-20,63, +-20,10, +-7,9, +-10,-13, +18,-22, +10,-1, +-25,45, +26,21, +22,26, +-36,27, +13,3, +37,-1, +18,18, +52,-6, +-20,36, +-38,-2, +17,1, +-15,20, +15,48, +8,-30, +-11,11, +-7,-8, +-10,-27, +15,-22, +-1,13, +-8,20, +34,-16, +-21,19, +-31,-5, +0,16, +-5,-6, +-11,-35, +7,11, +-9,-28, +-4,7, +28,9, +-4,14, +11,-24, +13,15, +1,34, +-10,-11, +-8,33, +-6,-22, +27,18, +6,1, +-10,-37, +-12,-24, +-2,-4, +-14,-25, +4,-10, +-32,3, +-16,8, +23,-14, +25,16, +-12,-15, +1,5, +2,16, +-28,-7, +-18,11, +4,-1, +-10,1, +10,14, +16,-10, +-12,0, +-7,-3, +33,-8, +-7,-5, +1,-3, +13,-5, +-2,-12, +-6,12, +0,-12, +-14,-13, +7,4, +7,8, +-2,-1, +0,0, +12,6, +3,-14, +-1,-7, +6,13, +-9,-1, +16,-21, +7,-9, +8,7, +7,-13, +8,-1, +1,2, +6,-5, +1,-7, +-7,-8, +6,-4, +5,-19, +0,2, +-4,3, +-10,11, +-7,12, +5,0, +9,2, +-6,-3, +1,2, +5,4, +-8,1, +9,-2, +2,-1, +-9,-2, +-3,7, +-1,3, +-10,-4, +7,0, +10,2, +-5,-1, +3,4, +1,3, +-6,-2, +-1,0, +4,-2, +-5,3, +2,-1, +3,-2, +-4,-1, +4,2, +3,-1, +-6,0, +3,0, +3,0, +-6,0, +3,0, +3,0, +-6,0, +3,1, +4,-2, +-4,1, +3,2, +2,1, +-5,-3, +4,2, +-1,0, +-6,2, +1,-3, +3,-4, +-5,1, +10,-2, +7,0, +-10,4, +-1,-3, +-3,-7, +-9,2, +2,1, +9,2, +-8,-1, +5,-4, +1,-2, +-6,3, +9,-2, +5,0, +-7,-12, +-10,-11, +-4,-3, +0,-2, +5,19, +6,4, +-7,8, +1,7, +6,5, +1,-2, +8,1, +7,13, +8,-7, +7,9, +16,21, +-9,1, +6,-13, +-1,7, +3,14, +12,-6, +0,0, +-2,1, +7,-8, +7,-4, +-14,13, +0,12, +-6,-12, +-2,12, +13,5, +1,3, +-7,5, +33,8, +-7,3, +-12,0, +16,10, +10,-14, +-10,-1, +4,1, +-18,-11, +-28,7, +2,-16, +1,-5, +-12,15, +25,-16, +23,14, +-16,-8, +-32,-3, +4,10, +-14,25, +-2,4, +-12,24, +-10,37, +6,-1, +27,-18, +-6,22, +-8,-33, +-10,11, +1,-34, +13,-15, +11,24, +-4,-14, +28,-9, +-4,-7, +-9,28, +7,-11, +-11,35, +-5,6, +0,-16, +-31,5, +-21,-19, +34,16, +-8,-20, +-1,-13, +15,22, +-10,27, +-7,8, +-11,-11, +8,30, +15,-48, +-15,-20, +17,-1, +-38,2, +-20,-36, +52,6, +18,-18, +37,1, +13,-3, +-36,-27, +22,-26, +26,-21, +-25,-45, +10,1, +18,22, +-10,13, +-7,-9, +-20,-10, +-20,-63, +-16,47, +-9,37, +9,-18, +-10,-46, +46,17, +-42,47, +37,-36, +9,17, +-19,-31, +1,34, +0,-17, +9,-42, +31,-17, +-22,35, +-21,46, +60,-17, +-8,30, +-4,-11, +40,32, +24,-47, +-6,25, +2,6, +-11,43, +57,-3, +0,-53, +-19,-3, +2,-33, +-40,9, +-20,13, +-24,45, +0,9, +0,25, +14,-34, +1,73, +-4,-17, +-45,-14, +16,26, +-14,-6, +-39,23, +-1,27, +23,-22, +32,38, +-15,-53, +41,-40, +-47,34, +15,-21, +-31,-19, +-6,32, +-25,6, +-11,53, +-19,-42, +-33,46, +17,2, +-18,38, +-35,1, +23,2, +-25,72, +9,3, +47,-12, +-3,67, +-33,-26, +-39,-33, +25,-5, +61,30, +58,-13, +-17,2, +-21,-9, +-40,0, +5,21, +52,75, +54,-32, +-23,63, +-3,35, +28,-113, +4,14, +34,-31, +25,-17, +42,-12, +62,-3, +-59,37, +-91,-16, +45,9, +8,-23, +1,20, +-65,-83, +1,6, +-30,2, +48,22, +-1,-65, +-53,66, +43,-12, +-31,38, +28,-2, +-4,-34, +25,-21, +-16,-49, +20,19, +84,22, +-57,-37, +-46,47, +-17,1, +68,-4, +52,16, +38,-100, +41,33, +61,14, +-56,-34, +13,-38, +22,-20, +32,7, +1,-15, +75,13, +-10,-30, +-11,-19, +-67,80, +-42,-71, +-33,-8, +-4,59, +-46,37, +-78,-40, +-129,48, +33,41, +44,-68, +-18,37, +-43,1, +35,18, +76,-84, +15,39, +-59,55, +62,-2, +-48,-86, +45,30, +-71,-36, +-6,147, +-40,32, +-18,-45, +-61,5, +1,-60, +28,-6, +-99,7, +-52,-33, +-102,-38, +33,-40, +-55,-12, +-25,-54, +-51,72, +-10,-75, +13,8, +45,52, +32,79, +21,-26, +-38,52, +-8,-61, +42,-22, +48,-56, +-20,133, +22,-33, +47,-88, +-46,93, +-18,-23, +-28,81, +-41,-2, +92,52, +-8,93, +-33,121, +78,23, +22,74, +74,18, +-6,59, +-9,-87, +-26,-43, +61,19, +-24,25, +-29,19, +-23,-9, +143,-31, +68,-53, +41,-2, +-19,49, +25,57, +15,37, +-12,72, +14,64, +20,33, +40,-96, +-72,-53, +74,80, +-4,22, +26,17, +11,-80, +-92,-9, +44,20, +-46,78, +-32,27, +53,5, +-42,-101, +1,-140, +-65,54, +-72,120, +105,18, +62,-30, +-15,-16, +-127,66, +-19,10, +58,-3, +45,-27, +-24,37, +-111,22, +-38,1, +-49,-26, +20,4, +-25,21, +62,106, +64,101, +-39,38, +-27,128, +-70,34, +-97,-4, +-55,-30, +32,-62, +23,-48, +8,-64, +50,29, +9,118, +24,2, +93,10, +40,53, +-20,-21, +95,6, +-9,158, +131,51, +76,8, +-48,-2, +76,-75, +5,14, +80,8, +24,-53, +66,-1, +70,113, +71,38, +-96,-95, +33,-81, +-103,-38, +33,141, +33,-23, +-61,83, +-11,106, +114,-166, +0,-92, +22,-8, +84,-84, +-68,118, +-25,29, +-11,150, +15,98, +-111,62, +135,-14, +32,-29, +50,67, +-68,-61, +-16,-16, +31,-75, +-76,-118, +-42,23, +2,-72, +-37,-64, +23,-77, +39,-131, +153,-33, +80,-18, +75,-16, +-32,42, +-104,5, +-8,53, +94,20, +12,15, +-91,-123, +118,-68, +-36,-28, +-101,129, +84,-122, +179,95, +85,44, +72,-35, +-23,-55, +83,15, +-31,120, +12,-45, +28,-11, +-38,-127, +88,-11, +26,99, +65,123, +-40,51, +-103,13, +4,155, +80,24, +48,-22, +117,-20, +11,-69, +84,96, +-70,-86, +38,39, +69,-60, +75,88, +-57,-52, +106,10, +-26,73, +-73,-144, +-46,-20, +-78,95, +25,-52, +-65,-18, +7,-86, +125,36, +-160,-195, +88,12, +-70,-35, +-74,23, +-2,28, +97,101, +18,28, +50,49, +142,67, +-29,-5, +-104,-7, +104,28, +-86,-52, +79,92, +-13,12, +24,-146, +6,52, +90,113, +44,99, +88,86, +-45,20, +-3,45, +28,-88, +-103,-41, +22,41, +-38,-10, +28,-12, +-59,120, +-65,54, +195,-103, +-29,39, +-153,127, +-11,-160, +-124,89, +20,-50, +-9,-43, +-9,76, +-49,-76, +42,-12, +120,27, +99,7, +268,-1, +135,30, +133,-33, +-48,73, +-61,-3, +134,115, +-89,81, +-64,39, +-94,131, +-105,40, +47,26, +-3,177, +57,95, +-171,124, +-82,70, +-31,27, +11,-62, +-65,-137, +106,-145, +-151,146, +88,-38, +-54,32, +-2,94, +52,93, +-182,2, +-23,-30, +36,56, +157,82, +4,-121, +34,17, +33,-27, +18,-126, +-128,-118, +40,167, +45,10, +-155,83, +-85,-25, +47,-59, +-124,138, +37,-108, +11,107, +191,-57, +89,35, +-67,14, +-80,130, +-56,87, +-213,70, +-89,-136, +-67,69, +-71,40, +-71,103, +-108,147, +-62,-53, +-83,25, +-102,-52, +62,58, +-92,-32, +32,-325, +18,-133, +-71,-194, +7,-121, +70,-26, +-67,44, +79,15, +-13,-33, +-58,95, +157,-37, +-97,174, +25,109, +-53,-37, +23,-59, +26,-87, +-142,138, +-52,21, +76,-106, +-50,151, +1,-20, +127,30, +9,25, +-160,-33, +29,8, +-147,-145, +-230,-55, +99,-24, +56,2, +-13,-83, +-7,92, +-68,-133, +45,80, +5,21, +-35,24, +-50,-99, +-52,-124, +-72,-12, +-75,-81, +-83,-53, +37,156, +-62,-21, +137,80, +55,-64, +155,103, +-82,-154, +182,47, +-42,150, +-87,-112, +78,168, +67,139, +27,-129, +-68,45, +12,-48, +48,-46, +-143,-118, +175,19, +-86,-38, +36,55, +-35,-169, +105,-43, +18,-121, +-99,-90, +-82,8, +-142,113, +6,65, +-164,-57, +-193,-125, +98,24, +87,-95, +102,49, +-47,3, +-33,-80, +-142,65, +142,-132, +76,0, +-190,-139, +67,-274, +-51,-89, +23,153, +-125,-19, +213,-52, +98,5, +21,78, +-58,-174, +-31,0, +-80,190, +29,3, +-42,-77, +21,-147, +130,-164, +72,-151, +187,84, +123,-42, +-31,28, +143,109, +53,15, +113,44, +131,1, +-64,28, +28,83, +-22,-249, +32,-3, +-75,0, +-195,106, +-122,-89, +-236,136, +73,15, +-101,-68, +114,-43, +217,-48, +61,-99, +17,-42, +-162,108, +-124,-37, +50,-31, +-181,40, +228,179, +196,-117, +-162,90, +-130,-177, +40,-150, +12,6, +5,-58, +62,-224, +-21,151, +104,-110, +4,-126, +-210,-32, +-113,-237, +-82,34, +2,-33, +-7,-96, +-56,-107, +-60,-46, +-81,-52, +-144,-42, +106,-29, +178,-48, +-15,-44, +105,95, +63,169, +-195,89, +-76,114, +-154,-9, +-163,-72, +-148,-81, +-82,-44, +27,81, +24,-25, +24,158, +-74,128, +-24,90, +8,-100, +47,-119, +-70,81, +-49,163, +-49,110, +116,-210, +-53,-79, +-248,30, +-39,157, +202,71, +211,-100, +15,97, +-110,-33, +-72,-4, +-109,162, +90,-98, +66,127, +78,4, +-165,-204, +-52,109, +58,-48, +154,15, +24,-79, +-223,10, +-78,-22, +-81,-9, +-135,-12, +-79,-56, +17,32, +66,-234, +104,-200, +-3,-57, +-36,196, +-52,-98, +-33,-16, +98,9, +109,35, +29,-48, +-250,0, +52,-263, +-175,18, +-228,21, +-169,-93, +-91,0, +-135,-70, +93,95, +-268,119, +62,-25, +76,-18, +11,-50, +-88,-13, +-147,-38, +317,-136, +-87,39, +36,68, +-32,-18, +-108,-109, +-208,-63, +135,-60, +-44,50, +67,72, +-68,137, +144,-10, +40,120, +112,-5, +51,354, +-3,53, +56,13, +16,17, +155,68, +-5,130, +-124,8, +-111,126, +-269,-15, +260,161, +15,-195, +39,121, +-95,-22, +-79,11, +58,-158, +211,-123, +-272,111, +97,81, +94,-179, +-108,13, +-94,204, +84,326, +-70,11, +-221,59, +160,88, +-2,98, +-31,121, +-63,168, +105,-165, +9,-29, +-43,-93, +74,-55, +-27,-100, +149,84, +102,-39, +-134,18, +92,-204, +46,-113, +158,-92, +-84,-177, +-55,-68, +44,315, +-106,-22, +72,-122, +-41,-94, +-10,38, +256,-27, +-22,-91, +-36,112, +92,-173, +-252,127, +79,14, +-6,-18, +73,1, +-142,-89, +165,146, +27,70, +149,140, +-76,-212, +57,51, +-23,176, +-3,148, +-128,-65, +125,-240, +110,-76, +-140,6, +297,-154, +62,-21, +2,53, +-92,-32, +-148,-87, +16,-190, +-230,-27, +49,110, +39,154, +-11,-61, +8,-106, +-33,-225, +-73,-97, +218,118, +-42,190, +-91,-99, +-51,-93, +-14,3, +-147,-47, +-150,81, +78,23, +-72,57, +-225,32, +149,4, +-169,145, +71,30, +-203,27, +-26,148, +76,-62, +-18,161, +9,-61, +65,75, +136,-136, +84,18, +-216,-165, +99,26, +-71,172, +-189,-4, +140,25, +-10,71, +-141,131, +111,-101, +-266,4, +142,-20, +-90,-4, +-206,80, +-96,166, +134,14, +-105,156, +213,0, +142,-80, +-19,-15, +-89,-222, +-160,155, +79,39, +-60,-245, +190,-62, +-267,61, +87,-180, +-28,-12, +-175,-44, +-203,48, +149,26, +159,-166, +-8,-32, +87,147, +-197,-35, +250,-100, +-46,98, +-121,-185, +-123,128, +243,-165, +122,45, +-315,18, +3,95, +38,110, +262,44, +-25,142, +-104,-29, +-91,-115, +61,75, +97,-15, +237,-91, +131,-21, +57,11, +98,52, +34,-157, +-83,-320, +203,-38, +43,-26, +40,150, +-14,147, +227,-202, +50,103, +114,-73, +-163,-63, +34,241, +-145,-85, +-175,-73, +88,123, +108,-139, +24,-56, +-137,68, +259,169, +-39,72, +-141,18, +60,4, +-246,60, +15,14, +-32,-54, +131,-14, +-62,-154, +50,8, +-15,-71, +115,-67, +335,79, +-266,155, +208,-94, +43,-104, +-99,-79, +-167,80, +-195,61, +-163,125, +-62,-42, +-144,108, +21,180, +19,185, +78,-253, +-173,-163, +142,67, +-33,-12, +-16,14, +221,240, +-109,135, +17,45, +156,26, +-48,-97, +28,-122, +-45,118, +-36,-48, +-87,-119, +-40,-160, +-6,101, +-150,-93, +21,-92, +-35,102, +-16,109, +-197,-29, +32,72, +143,-125, +-53,-15, +45,20, +45,-94, +-153,-131, +-130,12, +193,93, +-10,-161, +-337,31, +-80,-246, +-2,-116, +-65,-89, +-154,-95, +123,-125, +-81,-19, +-212,20, +15,4, +-268,12, +-153,-151, +-163,-28, +219,124, +167,219, +186,136, +186,-181, +-159,-52, +37,-17, +59,-17, +13,96, +79,-116, +21,-24, +-195,-69, +109,158, +149,136, +41,188, +-1,88, +-37,-122, +-4,-289, +137,-101, +41,143, +162,-99, +70,208, +-264,63, +148,17, +74,-58, +-29,82, +-317,16, +34,-149, +52,-102, +147,-17, +-304,55, +110,25, +-121,-14, +0,0, +82,-3, +91,4, +312,66, +-32,-86, +52,-82, +87,-14, +16,82, +-205,-94, +54,48, +42,32, +-185,42, +-91,-97, +258,11, +-126,77, +26,169, +-127,-308, +151,-227, +30,197, +51,124, +-106,18, +-17,-227, +-111,-3, +78,73, +-159,246, +183,-125, +-76,-262, +-68,-35, +29,90, +-5,-41, +15,160, +107,96, +232,-3, +53,111, +-212,-155, +-17,162, +56,113, +-9,38, +10,-155, +-231,-205, +106,17, +125,-42, +298,-58, +-66,68, +43,9, +21,-79, +-63,-129, +320,119, +183,-27, +-168,133, +1,-54, +-323,129, +17,-259, +12,-31, +-88,-96, +108,5, +-15,19, +19,-267, +-71,264, +-120,-8, +-126,92, +-110,80, +112,-45, +83,-192, +42,65, +114,-62, +-63,-96, +-175,-6, +184,-87, +63,28, +150,-115, +-38,39, +-144,-24, +-131,-114, +-87,73, +-19,133, +188,-277, +-109,199, +-35,200, +-121,-107, +-25,157, +105,-186, +141,-147, +-88,-85, +-81,-154, +112,110, +7,7, +-118,57, +-120,52, +-88,-211, +-184,-171, +-29,220, +-83,-51, +170,119, +-37,45, +-1,-25, +96,42, +-19,-125, +-168,-204, +-207,-14, +-150,-151, +-128,51, +151,1, +-69,-125, +-73,-188, +-277,-74, +177,161, +-21,-113, +44,50, +-195,-126, +109,159, +-105,-196, +60,194, +57,14, +-86,-44, +-81,244, +-146,192, +-46,7, +12,-213, +35,-209, +-65,90, +29,17, +-169,-107, +93,-106, +130,-19, +138,-97, +-103,57, +75,28, +63,33, +121,97, +26,56, +-82,234, +-60,290, +232,-45, +201,-113, +-87,-66, +84,8, +96,-78, +-82,200, +-23,-91, +62,24, +96,116, +38,-99, +110,-30, +3,25, +129,71, +71,-13, +192,-45, +81,-41, +180,20, +-169,38, +174,0, +-52,237, +157,-39, +-13,12, +101,-95, +191,-157, +-183,-44, +-99,121, +-29,-120, +245,172, +9,109, +-43,159, +-116,188, +-151,193, +278,55, +269,53, +81,-83, +23,-18, +-56,56, +336,-134, +-98,-76, +-16,-113, +87,14, +119,-177, +281,-47, +13,60, +27,167, +36,-58, +38,0, +-63,-46, +-230,-194, +126,-10, +-132,-67, +31,-30, +-163,96, +-127,267, +-70,20, +-3,189, +-162,-176, +34,32, +197,-209, +-5,40, +-123,-116, +86,140, +19,-76, +200,-263, +27,-96, +49,129, +235,-112, +-94,38, +-206,178, +-54,15, +13,91, +-50,183, +-70,-8, +-107,115, +-37,-13, +93,246, +63,-99, +-3,34, +178,-116, +-60,230, +165,24, +-203,118, +-111,164, +167,123, +191,120, +58,-67, +-80,51, +33,-100, +144,157, +-76,132, +0,165, +138,89, +-209,10, +-101,160, +-8,-177, +283,145, +23,151, +-79,-270, +-25,147, +22,74, +-86,-82, +71,-38, +-7,-3, +-94,-68, +127,137, +-148,-176, +-28,-146, +64,92, +-10,-196, +-15,84, +-251,-154, +-77,-107, +-104,-78, +-22,-7, +149,-105, +-147,-44, +-13,-123, +-169,-190, +118,-74, +-81,51, +-42,13, +139,17, +-158,228, +-112,127, +53,7, +3,54, +124,65, +-121,-40, +72,127, +-94,105, +120,66, +84,-159, +240,-133, +100,-113, +-57,-189, +227,87, +56,136, +187,83, +-5,-50, +-17,110, +-143,3, +54,49, +62,166, +2,174, +-14,-68, +7,23, +104,59, +10,39, +-6,-16, +-185,87, +-98,60, +9,157, +19,81, +-66,-3, +-55,76, +-80,87, +96,-128, +30,72, +-95,-122, +120,-61, +36,15, +-26,-106, +-99,-245, +-76,85, +-54,169, +217,56, +95,99, +44,-78, +165,-115, +-93,190, +-89,-93, +-220,-199, +105,-75, +82,76, +-56,-200, +33,-122, +-138,-23, +-12,106, +-84,-59, +-94,220, +14,-198, +-64,92, +157,-59, +75,62, +-86,239, +-38,110, +-134,-19, +96,140, +-74,202, +-203,-47, +53,36, +-37,19, +-85,6, +-12,-260, +52,156, +-153,63, +-114,94, +-95,-126, +-46,-253, +29,78, +16,132, +74,-52, +-83,-121, +105,-40, +-106,103, +-15,-99, +-13,40, +-48,-221, +39,-21, +-225,-83, +76,-27, +-7,9, +135,-9, +-51,-84, +169,18, +242,31, +69,-93, +-184,84, +-128,19, +6,23, +-120,39, +56,-40, +154,-183, +-124,-40, +136,-218, +54,134, +65,64, +-195,-72, +-165,199, +-261,134, +-91,60, +5,32, +44,98, +197,140, +-53,-230, +85,139, +-86,-200, +-148,38, +34,91, +62,-66, +-70,139, +139,-151, +-167,-56, +40,196, +188,135, +80,179, +7,66, +86,64, +-131,-57, +179,-84, +56,-159, +145,47, +43,88, +-37,0, +-62,17, +-45,196, +-17,-85, +46,-157, +-47,200, +-8,30, +2,78, +-159,116, +-97,93, +38,-148, +125,125, +-130,122, +-32,16, +-71,62, +-148,-26, +75,101, +32,214, +-14,-155, +31,91, +-12,-60, +-51,118, +-96,-46, +-30,-153, +129,88, +-5,97, +-110,184, +50,-167, +86,-103, +-39,-44, +0,-102, +182,45, +-22,92, +8,79, +26,18, +21,173, +-103,-119, +24,98, +26,-203, +-145,-70, +-23,-21, +85,3, +-81,-23, +10,-49, +91,21, +113,86, +-57,130, +-41,105, +-126,-56, +-101,-21, +-45,-28, +-107,89, +27,-61, +70,8, +-126,149, +96,72, +42,-126, +-48,36, +-95,-5, +-1,-33, +139,41, +-5,-110, +-130,-153, +48,118, +104,15, +-189,-66, +-47,136, +221,111, +-31,19, +-62,-23, +108,162, +-46,-30, +-63,28, +75,35, +61,41, +2,144, +-98,1, +174,44, +-108,85, +-85,160, +-37,-93, +-119,-121, +-97,20, +-12,117, +-18,-80, +18,-64, +117,87, +102,-52, +-92,-135, +50,25, +-152,-132, +13,-113, +-80,101, +-22,130, +43,209, +102,84, +-35,5, +112,179, +48,21, +76,120, +110,0, +-57,-65, +53,109, +-116,4, +-6,-137, +-10,3, +34,80, +135,-142, +-136,-92, +2,-16, +-28,144, +-94,86, +-131,2, +9,20, +-15,22, +-19,-87, +-44,-23, +-33,-208, +-17,100, +50,-183, +161,42, +7,264, +225,2, +-51,-69, +97,-81, +204,-162, +-79,112, +-3,83, +-128,76, +-143,109, +138,-14, +158,229, +26,14, +-23,97, +-158,4, +71,-76, +-233,-7, +19,-39, +18,1, +-32,-11, +51,-96, +79,-132, +82,33, +79,-84, +-183,-15, +-70,3, +58,131, +-14,-41, +-110,-67, +16,37, +50,-133, +3,104, +-25,21, +54,58, +158,129, +-9,-10, +132,62, +53,40, +103,58, +255,-39, +-8,-14, +-99,-105, +-27,26, +-99,-123, +-46,47, +-37,24, +11,113, +4,35, +-72,-33, +40,-7, +104,-82, +-167,-100, +-62,-38, +135,-89, +105,-23, +-44,13, +115,92, +26,-155, +72,129, +62,86, +-52,-143, +58,51, +66,59, +44,-94, +-55,53, +166,125, +60,-38, +-50,-107, +61,28, +24,65, +-74,-92, +-90,-31, +-9,114, +14,39, +0,-128, +-30,-27, +-17,96, +-6,-47, +135,30, +22,-21, +-52,16, +25,-20, +72,-104, +-119,-55, +22,-68, +72,-97, +77,20, +87,41, +21,105, +-53,-29, +-20,-19, +30,27, +-35,-4, +-99,-92, +-7,-17, +-152,45, +142,-68, +-29,-36, +71,97, +65,-71, +67,43, +-11,99, +0,22, +-81,-47, +-104,83, +-14,20, +-10,-75, +199,9, +-19,64, +-72,12, +-32,-88, +31,-48, +87,30, +-139,-20, +113,4, +-5,58, +100,-21, +72,-30, +-82,-80, +72,-61, +132,1, +-31,-15, +8,96, +10,-92, +94,-112, +19,3, +115,4, +9,-39, +-16,14, +-56,32, +49,-76, +110,-28, +-47,1, +46,-4, +57,77, +-87,147, +-128,-66, +45,102, +-4,-56, +51,10, +104,115, +152,76, +29,-17, +21,33, +-36,-91, +-92,88, +164,7, +-39,-30, +-64,-28, +111,-59, +-185,-35, +53,116, +1,-18, +78,102, +19,13, +35,-120, +118,-90, +36,-154, +60,-80, +-4,-19, +5,134, +46,-50, +-212,50, +-14,21, +-3,33, +-51,-16, +46,-66, +72,-36, +-69,-105, +39,5, +5,186, +-43,62, +7,11, +-11,11, +-31,106, +6,-99, +-3,15, +-128,-89, +15,25, +-93,1, +16,-63, +10,20, +28,-30, +-117,41, +-12,-36, +110,64, +-32,-8, +-73,-35, +-80,-20, +-10,-102, +143,-54, +-30,12, +-41,5, +-84,-68, +91,21, +-48,-28, +13,-61, +108,-51, +54,8, +-4,18, +86,-120, +82,20, +44,41, +33,15, +-94,65, +77,-73, +-49,-22, +84,-10, +-14,-78, +34,9, +-102,-47, +-68,8, +14,37, +-14,21, +-142,-38, +22,-149, +17,63, +-6,6, +-36,36, +3,91, +76,36, +74,29, +3,-57, +-66,-52, +-82,-18, +6,55, +-25,-6, +-25,12, +-49,-4, +40,17, +-26,16, +42,-71, +34,-15, +8,16, +61,-4, +79,-56, +-15,-53, +21,-46, +18,44, +23,18, +-8,22, +11,-17, +34,1, +99,43, +17,-5, +7,-26, +22,-50, +26,48, +-15,17, +97,109, +16,7, +-64,47, +-73,19, +-36,73, +-64,105, +-13,-29, +110,34, +-3,-37, +7,23, +36,-32, +7,79, +0,-18, +78,-64, +62,1, +24,-19, +6,22, +15,-7, +-34,-37, +-66,45, +-50,-111, +-40,19, +-5,11, +-31,13, +-22,-37, +-48,-64, +-19,-36, +-67,-81, +62,54, +-79,12, +-25,-54, +-2,24, +-61,-35, +59,15, +-10,-5, +-64,-9, +12,14, +53,-23, +-48,-1, +26,-27, +-17,17, +30,67, +38,62, +-63,-114, +82,-9, +21,12, +18,4, +104,-5, +7,19, +3,36, +-22,-33, +26,1, +-11,99, +79,31, +52,-42, +6,-18, +70,-36, +4,85, +34,-22, +-58,34, +38,31, +3,4, +78,0, +-36,-22, +45,-48, +46,-4, +12,16, +32,-40, +42,-61, +0,1, +-3,20, +6,56, +-9,15, +-87,5, +-19,83, +21,-29, +15,-27, +-63,21, +25,37, +-78,7, +27,-19, +-14,-34, +64,-3, +36,-42, +51,-33, +-18,-36, +-11,40, +-22,-51, +-27,1, +-37,-46, +3,7, +8,29, +4,-15, +58,30, +-38,42, +-38,71, +-8,1, +-4,-20, +-64,36, +9,-2, +-10,71, +-10,-42, +6,21, +-17,105, +31,28, +52,-8, +40,-38, +35,-22, +58,26, +-8,30, +26,31, +-9,-67, +2,-4, +-32,16, +-29,35, +-11,15, +31,-9, +2,56, +46,-35, +-10,29, +-4,-9, +12,51, +-23,24, +-7,36, +28,5, +7,26, +-31,5, +16,19, +0,16, +-3,20, +24,-16, +-15,-7, +28,19, +-16,5, +-15,3, +-24,25, +5,51, +37,-1, +60,-33, +21,17, +-6,19, +27,19, +8,0, +-15,4, +14,-2, +-22,51, +-23,-4, +-9,-12, +2,-18, +-2,12, +-10,-12, +-57,9, +-6,-6, +63,-27, +13,-25, +4,4, +20,-3, +-9,3, +22,15, +-28,-31, +28,15, +-32,-29, +12,23, +5,1, +1,-8, +-36,-56, +-19,28, +7,0, +-8,-12, +2,-23, +-30,-30, +-13,-33, +-18,7, +-12,10, +17,-7, +2,12, +-5,2, +35,12, +-11,-24, +-3,-11, +-23,-20, +-14,-14, +22,-15, +9,1, +-16,11, +16,-5, +-30,-14, +-29,15, +13,21, +-25,-12, +17,-7, +22,-13, +-1,2, +3,1, +-13,18, +18,-20, +-5,-19, +-15,-4, +8,-10, +0,4, +-22,35, +15,-11, +-12,-2, +-16,-3, +11,-3, +-10,15, +-11,11, +-3,-2, +6,2, +1,-15, +21,-15, +-8,-1, +8,-2, +-18,3, +4,-1, +3,7, +-23,-8, +1,-7, +-10,2, +12,-34, +-4,10, +10,14, +-2,4, +-1,16, +-10,-5, +3,-8, +4,15, +-4,3, +-2,16, +-1,1, +-8,-4, +-14,-13, +3,11, +11,2, +-3,-10, +7,0, +-7,-2, +5,7, +7,13, +0,-4, +4,-2, +2,6, +-3,-6, +-9,-2, +-4,4, +5,3, +8,-11, +-5,9, +-3,-5, +-3,-7, +7,6, +3,3, +-5,-5, +-6,8, +0,-6, +6,-2, +-2,7, +-1,0, +1,-8, +1,6, +-1,0, +1,-7, +-1,4, +0,2, +0,-5, +-1,6, +0,1, +0,-4, +0,5, +0,0, +0,-5, +0,4, +0,-1, +-1,-6, +0,5, +0,-2, +-1,-4, +1,7, +-1,0, +1,-6, +1,8, +-1,0, +-2,-7, +6,2, +0,6, +-6,-8, +-5,5, +3,-3, +7,-6, +-3,7, +-3,5, +-5,-9, +8,11, +5,-3, +-4,-4, +-9,2, +-3,6, +2,-6, +4,2, +0,4, +7,-13, +5,-7, +-7,2, +7,0, +-3,10, +11,-2, +3,-11, +-14,13, +-8,4, +-1,-1, +-2,-16, +-4,-3, +4,-15, +3,8, +-10,5, +-1,-16, +-2,-4, +10,-14, +-4,-10, +12,34, +-10,-2, +1,7, +-23,8, +3,-7, +4,1, +-18,-3, +8,2, +-8,1, +21,15, +1,15, +6,-2, +-3,2, +-11,-11, +-10,-15, +11,3, +-16,3, +-12,2, +15,11, +-22,-35, +0,-4, +8,10, +-15,4, +-5,19, +18,20, +-13,-18, +3,-1, +-1,-2, +22,13, +17,7, +-25,12, +13,-21, +-29,-15, +-30,14, +16,5, +-16,-11, +9,-1, +22,15, +-14,14, +-23,20, +-3,11, +-11,24, +35,-12, +-5,-2, +2,-12, +17,7, +-12,-10, +-18,-7, +-13,33, +-30,30, +2,23, +-8,12, +7,0, +-19,-28, +-36,56, +1,8, +5,-1, +12,-23, +-32,29, +28,-15, +-28,31, +22,-15, +-9,-3, +20,3, +4,-4, +13,25, +63,27, +-6,6, +-57,-9, +-10,12, +-2,-12, +2,18, +-9,12, +-23,4, +-22,-51, +14,2, +-15,-4, +8,0, +27,-19, +-6,-19, +21,-17, +60,33, +37,1, +5,-51, +-24,-25, +-15,-3, +-16,-5, +28,-19, +-15,7, +24,16, +-3,-20, +0,-16, +16,-19, +-31,-5, +7,-26, +28,-5, +-7,-36, +-23,-24, +12,-51, +-4,9, +-10,-29, +46,35, +2,-56, +31,9, +-11,-15, +-29,-35, +-32,-16, +2,4, +-9,67, +26,-31, +-8,-30, +58,-26, +35,22, +40,38, +52,8, +31,-28, +-17,-105, +6,-21, +-10,42, +-10,-71, +9,2, +-64,-36, +-4,20, +-8,-1, +-38,-71, +-38,-42, +58,-30, +4,15, +8,-29, +3,-7, +-37,46, +-27,-1, +-22,51, +-11,-40, +-18,36, +51,33, +36,42, +64,3, +-14,34, +27,19, +-78,-7, +25,-37, +-63,-21, +15,27, +21,29, +-19,-83, +-87,-5, +-9,-15, +6,-56, +-3,-20, +0,-1, +42,61, +32,40, +12,-16, +46,4, +45,48, +-36,22, +78,0, +3,-4, +38,-31, +-58,-34, +34,22, +4,-85, +70,36, +6,18, +52,42, +79,-31, +-11,-99, +26,-1, +-22,33, +3,-36, +7,-19, +104,5, +18,-4, +21,-12, +82,9, +-63,114, +38,-62, +30,-67, +-17,-17, +26,27, +-48,1, +53,23, +12,-14, +-64,9, +-10,5, +59,-15, +-61,35, +-2,-24, +-25,54, +-79,-12, +62,-54, +-67,81, +-19,36, +-48,64, +-22,37, +-31,-13, +-5,-11, +-40,-19, +-50,111, +-66,-45, +-34,37, +15,7, +6,-22, +24,19, +62,-1, +78,64, +0,18, +7,-79, +36,32, +7,-23, +-3,37, +110,-34, +-13,29, +-64,-105, +-36,-73, +-73,-19, +-64,-47, +16,-7, +97,-109, +-15,-17, +26,-48, +22,50, +7,26, +17,5, +99,-43, +34,-1, +11,17, +-8,-22, +23,-18, +18,-44, +21,46, +-15,53, +79,56, +61,4, +8,-16, +34,15, +42,71, +-26,-16, +40,-17, +-49,4, +-25,-12, +-25,6, +6,-55, +-82,18, +-66,52, +3,57, +74,-29, +76,-36, +3,-91, +-36,-36, +-6,-6, +17,-63, +22,149, +-142,38, +-14,-21, +14,-37, +-68,-8, +-102,47, +34,-9, +-14,78, +84,10, +-49,22, +77,73, +-94,-65, +33,-15, +44,-41, +82,-20, +86,120, +-4,-18, +54,-8, +108,51, +13,61, +-48,28, +91,-21, +-84,68, +-41,-5, +-30,-12, +143,54, +-10,102, +-80,20, +-73,35, +-32,8, +110,-64, +-12,36, +-117,-41, +28,30, +10,-20, +16,63, +-93,-1, +15,-25, +-128,89, +-3,-15, +6,99, +-31,-106, +-11,-11, +7,-11, +-43,-62, +5,-186, +39,-5, +-69,105, +72,36, +46,66, +-51,16, +-3,-33, +-14,-21, +-212,-50, +46,50, +5,-134, +-4,19, +60,80, +36,154, +118,90, +35,120, +19,-13, +78,-102, +1,18, +53,-116, +-185,35, +111,59, +-64,28, +-39,30, +164,-7, +-92,-88, +-36,91, +21,-33, +29,17, +152,-76, +104,-115, +51,-10, +-4,56, +45,-102, +-128,66, +-87,-147, +57,-77, +46,4, +-47,-1, +110,28, +49,76, +-56,-32, +-16,-14, +9,39, +115,-4, +19,-3, +94,112, +10,92, +8,-96, +-31,15, +132,-1, +72,61, +-82,80, +72,30, +100,21, +-5,-58, +113,-4, +-139,20, +87,-30, +31,48, +-32,88, +-72,-12, +-19,-64, +199,-9, +-10,75, +-14,-20, +-104,-83, +-81,47, +0,-22, +-11,-99, +67,-43, +65,71, +71,-97, +-29,36, +142,68, +-152,-45, +-7,17, +-99,92, +-35,4, +30,-27, +-20,19, +-53,29, +21,-105, +87,-41, +77,-20, +72,97, +22,68, +-119,55, +72,104, +25,20, +-52,-16, +22,21, +135,-30, +-6,47, +-17,-96, +-30,27, +0,128, +14,-39, +-9,-114, +-90,31, +-74,92, +24,-65, +61,-28, +-50,107, +60,38, +166,-125, +-55,-53, +44,94, +66,-59, +58,-51, +-52,143, +62,-86, +72,-129, +26,155, +115,-92, +-44,-13, +105,23, +135,89, +-62,38, +-167,100, +104,82, +40,7, +-72,33, +4,-35, +11,-113, +-37,-24, +-46,-47, +-99,123, +-27,-26, +-99,105, +-8,14, +255,39, +103,-58, +53,-40, +132,-62, +-9,10, +158,-129, +54,-58, +-25,-21, +3,-104, +50,133, +16,-37, +-110,67, +-14,41, +58,-131, +-70,-3, +-183,15, +79,84, +82,-33, +79,132, +51,96, +-32,11, +18,-1, +19,39, +-233,7, +71,76, +-158,-4, +-23,-97, +26,-14, +158,-229, +138,14, +-143,-109, +-128,-76, +-3,-83, +-79,-112, +204,162, +97,81, +-51,69, +225,-2, +7,-264, +161,-42, +50,183, +-17,-100, +-33,208, +-44,23, +-19,87, +-15,-22, +9,-20, +-131,-2, +-94,-86, +-28,-144, +2,16, +-136,92, +135,142, +34,-80, +-10,-3, +-6,137, +-116,-4, +53,-109, +-57,65, +110,0, +76,-120, +48,-21, +112,-179, +-35,-5, +102,-84, +43,-209, +-22,-130, +-80,-101, +13,113, +-152,132, +50,-25, +-92,135, +102,52, +117,-87, +18,64, +-18,80, +-12,-117, +-97,-20, +-119,121, +-37,93, +-85,-160, +-108,-85, +174,-44, +-98,-1, +2,-144, +61,-41, +75,-35, +-63,-28, +-46,30, +108,-162, +-62,23, +-31,-19, +221,-111, +-47,-136, +-189,66, +104,-15, +48,-118, +-130,153, +-5,110, +139,-41, +-1,33, +-95,5, +-48,-36, +42,126, +96,-72, +-126,-149, +70,-8, +27,61, +-107,-89, +-45,28, +-101,21, +-126,56, +-41,-105, +-57,-130, +113,-86, +91,-21, +10,49, +-81,23, +85,-3, +-23,21, +-145,70, +26,203, +24,-98, +-103,119, +21,-173, +26,-18, +8,-79, +-22,-92, +182,-45, +0,102, +-39,44, +86,103, +50,167, +-110,-184, +-5,-97, +129,-88, +-30,153, +-96,46, +-51,-118, +-12,60, +31,-91, +-14,155, +32,-214, +75,-101, +-148,26, +-71,-62, +-32,-16, +-130,-122, +125,-125, +38,148, +-97,-93, +-159,-116, +2,-78, +-8,-30, +-47,-200, +46,157, +-17,85, +-45,-196, +-62,-17, +-37,0, +43,-88, +145,-47, +56,159, +179,84, +-131,57, +86,-64, +7,-66, +80,-179, +188,-135, +40,-196, +-167,56, +139,151, +-70,-139, +62,66, +34,-91, +-148,-38, +-86,200, +85,-139, +-53,230, +197,-140, +44,-98, +5,-32, +-91,-60, +-261,-134, +-165,-199, +-195,72, +65,-64, +54,-134, +136,218, +-124,40, +154,183, +56,40, +-120,-39, +6,-23, +-128,-19, +-184,-84, +69,93, +242,-31, +169,-18, +-51,84, +135,9, +-7,-9, +76,27, +-225,83, +39,21, +-48,221, +-13,-40, +-15,99, +-106,-103, +105,40, +-83,121, +74,52, +16,-132, +29,-78, +-46,253, +-95,126, +-114,-94, +-153,-63, +52,-156, +-12,260, +-85,-6, +-37,-19, +53,-36, +-203,47, +-74,-202, +96,-140, +-134,19, +-38,-110, +-86,-239, +75,-62, +157,59, +-64,-92, +14,198, +-94,-220, +-84,59, +-12,-106, +-138,23, +33,122, +-56,200, +82,-76, +105,75, +-220,199, +-89,93, +-93,-190, +165,115, +44,78, +95,-99, +217,-56, +-54,-169, +-76,-85, +-99,245, +-26,106, +36,-15, +120,61, +-95,122, +30,-72, +96,128, +-80,-87, +-55,-76, +-66,3, +19,-81, +9,-157, +-98,-60, +-185,-87, +-6,16, +10,-39, +104,-59, +7,-23, +-14,68, +2,-174, +62,-166, +54,-49, +-143,-3, +-17,-110, +-5,50, +187,-83, +56,-136, +227,-87, +-57,189, +100,113, +240,133, +84,159, +120,-66, +-94,-105, +72,-127, +-121,40, +124,-65, +3,-54, +53,-7, +-112,-127, +-158,-228, +139,-17, +-42,-13, +-81,-51, +118,74, +-169,190, +-13,123, +-147,44, +149,105, +-22,7, +-104,78, +-77,107, +-251,154, +-15,-84, +-10,196, +64,-92, +-28,146, +-148,176, +127,-137, +-94,68, +-7,3, +71,38, +-86,82, +22,-74, +-25,-147, +-79,270, +23,-151, +283,-145, +-8,177, +-101,-160, +-209,-10, +138,-89, +0,-165, +-76,-132, +144,-157, +33,100, +-80,-51, +58,67, +191,-120, +167,-123, +-111,-164, +-203,-118, +165,-24, +-60,-230, +178,116, +-3,-34, +63,99, +93,-246, +-37,13, +-107,-115, +-70,8, +-50,-183, +13,-91, +-54,-15, +-206,-178, +-94,-38, +235,112, +49,-129, +27,96, +200,263, +19,76, +86,-140, +-123,116, +-5,-40, +197,209, +34,-32, +-162,176, +-3,-189, +-70,-20, +-127,-267, +-163,-96, +31,30, +-132,67, +126,10, +-230,194, +-63,46, +38,0, +36,58, +27,-167, +13,-60, +281,47, +119,177, +87,-14, +-16,113, +-98,76, +336,134, +-56,-56, +23,18, +81,83, +269,-53, +278,-55, +-151,-193, +-116,-188, +-43,-159, +9,-109, +245,-172, +-29,120, +-99,-121, +-183,44, +191,157, +101,95, +-13,-12, +157,39, +-52,-237, +174,0, +-169,-38, +180,-20, +81,41, +192,45, +71,13, +129,-71, +3,-25, +110,30, +38,99, +96,-116, +62,-24, +-23,91, +-82,-200, +96,78, +84,-8, +-87,66, +201,113, +232,45, +-60,-290, +-82,-234, +26,-56, +121,-97, +63,-33, +75,-28, +-103,-57, +138,97, +130,19, +93,106, +-169,107, +29,-17, +-65,-90, +35,209, +12,213, +-46,-7, +-146,-192, +-81,-244, +-86,44, +57,-14, +60,-194, +-105,196, +109,-159, +-195,126, +44,-50, +-21,113, +177,-161, +-277,74, +-73,188, +-69,125, +151,-1, +-128,-51, +-150,151, +-207,14, +-168,204, +-19,125, +96,-42, +-1,25, +-37,-45, +170,-119, +-83,51, +-29,-220, +-184,171, +-88,211, +-120,-52, +-118,-57, +7,-7, +112,-110, +-81,154, +-88,85, +141,147, +105,186, +-25,-157, +-121,107, +-35,-200, +-109,-199, +188,277, +-19,-133, +-87,-73, +-131,114, +-144,24, +-38,-39, +150,115, +63,-28, +184,87, +-175,6, +-63,96, +114,62, +42,-65, +83,192, +112,45, +-110,-80, +-126,-92, +-120,8, +-71,-264, +19,267, +-15,-19, +108,-5, +-88,96, +12,31, +17,259, +-323,-129, +1,54, +-168,-133, +183,27, +320,-119, +-63,129, +21,79, +43,-9, +-66,-68, +298,58, +125,42, +106,-17, +-231,205, +10,155, +-9,-38, +56,-113, +-17,-162, +-212,155, +53,-111, +232,3, +107,-96, +15,-160, +-5,41, +29,-90, +-68,35, +-76,262, +183,125, +-159,-246, +78,-73, +-111,3, +-17,227, +-106,-18, +51,-124, +30,-197, +151,227, +-127,308, +26,-169, +-126,-77, +258,-11, +-91,97, +-185,-42, +42,-32, +54,-48, +-205,94, +16,-82, +87,14, +52,82, +-32,86, +312,-66, +91,-4, +82,3, +6,0, +218,59, +-210,-257, +36,-282, +185,-134, +-98,65, +100,-160, +-7,-28, +86,3, +73,-130, +159,32, +-30,-116, +12,-107, +146,-144, +162,-128, +-109,-5, +-27,-74, +60,86, +31,-46, +-137,191, +-181,-249, +56,-16, +12,-81, +4,2, +31,-41, +-93,119, +-220,-134, +238,-80, +-185,6, +90,34, +-167,50, +-117,184, +-80,-119, +-164,-133, +-110,-44, +40,7, +-97,-2, +150,-37, +52,-248, +262,-95, +-66,210, +215,50, +106,46, +-24,-17, +-25,-27, +268,8, +92,175, +-185,-190, +135,34, +-29,-17, +13,141, +134,1, +-46,-146, +232,7, +139,142, +-118,-162, +-95,89, +-138,211, +265,76, +21,152, +78,-177, +-41,125, +163,-75, +33,83, +279,-197, +-223,-60, +-71,-53, +-36,-157, +-183,41, +27,102, +-131,-67, +28,-30, +194,-66, +139,-79, +-130,74, +55,-42, +69,-27, +-104,-70, +48,-70, +-118,-258, +-132,-27, +-136,114, +-169,-283, +-75,-34, +93,-76, +117,-93, +-39,-93, +-267,-61, +-23,-84, +86,70, +-233,-80, +231,20, +34,-56, +-111,-54, +-50,-13, +-126,-65, +-55,-316, +-127,-190, +-48,166, +23,190, +-12,-134, +153,168, +-13,5, +-256,23, +260,31, +36,-139, +164,-222, +-97,-41, +124,9, +-12,200, +27,-95, +-64,-82, +-61,-81, +-171,108, +199,-20, +-145,24, +10,-17, +-99,-101, +182,-67, +-31,-39, +-61,-191, +117,-23, +-279,133, +-161,269, +-85,148, +13,-103, +87,140, +-42,-56, +-50,63, +50,-39, +181,204, +-82,-182, +-110,56, +-62,-123, +-166,-131, +-243,62, +73,45, +13,181, +235,-63, +-45,209, +10,-116, +214,123, +59,0, +1,8, +122,64, +-58,76, +156,25, +-92,105, +68,75, +-38,-20, +139,42, +-25,-235, +-97,146, +-149,-230, +-134,-121, +-91,169, +48,290, +86,-115, +-115,158, +105,-81, +-118,-60, +248,-14, +119,62, +-9,-41, +-100,96, +-27,180, +-130,66, +-21,-205, +29,-242, +-57,36, +38,-110, +51,-72, +31,-149, +124,280, +193,4, +246,-224, +-8,-3, +111,58, +-56,-93, +-141,0, +-14,166, +44,192, +-81,59, +-166,-118, +-4,180, +175,152, +-67,94, +-105,73, +102,131, +144,67, +-70,132, +17,160, +23,169, +110,61, +-140,-54, +-174,-64, +-6,-307, +23,-98, +-47,27, +155,-30, +109,3, +-45,-43, +70,-137, +-103,-159, +96,20, +65,-54, +-175,121, +-169,-39, +184,-217, +-57,156, +-187,-215, +88,-16, +15,230, +-161,-131, +36,-192, +-98,150, +-13,117, +-7,-111, +142,185, +-79,167, +64,67, +54,-59, +-108,96, +-176,-41, +-76,107, +12,14, +-68,-204, +196,141, +172,-29, +-155,219, +138,-93, +-113,-34, +51,52, +-28,-162, +-88,218, +-189,-145, +-2,-156, +88,93, +7,146, +-86,-108, +-108,-94, +5,-197, +124,-126, +-140,-41, +-69,-29, +7,62, +-98,-171, +-158,6, +52,-20, +-10,-128, +118,62, +-148,8, +-128,-30, +-26,-158, +-75,141, +43,87, +-44,-74, +-36,85, +126,-141, +87,-256, +68,183, +283,57, +31,75, +-84,208, +16,92, +-34,116, +-19,163, +-258,-56, +157,99, +236,-27, +184,-27, +-167,75, +-112,-49, +128,127, +31,82, +36,34, +-113,-27, +-254,-223, +-10,-7, +245,-97, +50,188, +28,36, +-62,8, +-3,37, +-75,119, +-87,21, +-73,48, +142,152, +32,56, +-2,175, +71,94, +85,-187, +92,-46, +-168,163, +41,8, +-67,-62, +-120,112, +109,-39, +-115,41, +115,-82, +-70,-16, +-192,-167, +20,27, +-110,147, +143,63, +-221,-12, +-153,-123, +74,238, +109,-124, +16,30, +165,77, +18,-93, +0,44, +18,0, +233,106, +-160,75, +40,-58, +-181,8, +31,-16, +128,-236, +27,-195, +79,171, +-170,-127, +13,-58, +-85,-171, +-38,18, +108,141, +77,-224, +9,74, +-51,26, +-36,87, +-119,88, +-173,156, +-210,34, +200,14, +106,-122, +-151,-49, +31,128, +28,-44, +-72,-180, +-50,68, +-121,-10, +13,-47, +105,-95, +-268,-171, +81,-67, +166,-101, +18,-11, +-8,-6, +-76,-35, +-119,-104, +136,90, +40,34, +-58,-26, +-142,-71, +91,-101, +-206,-5, +78,71, +17,16, +29,71, +228,-88, +-183,60, +-135,-27, +140,45, +234,-95, +217,-77, +-72,158, +215,-78, +-66,7, +-3,75, +-36,-195, +-23,12, +8,150, +-105,-20, +196,-89, +-36,-98, +67,-76, +15,-44, +-41,2, +11,68, +-65,43, +63,-158, +210,63, +5,-91, +193,97, +165,-39, +140,78, +9,16, +51,131, +83,-85, +-155,229, +52,-59, +-30,150, +-81,-59, +-81,77, +-147,-62, +-90,146, +28,-17, +270,30, +101,9, +223,5, +143,-21, +-135,-132, +37,-7, +168,-82, +17,-124, +-22,-18, +-78,11, +13,71, +21,77, +-88,173, +-13,26, +-49,124, +34,87, +208,-76, +6,-108, +41,40, +-140,9, +-217,62, +83,62, +51,-69, +13,-52, +179,-176, +-70,-132, +-13,38, +-55,174, +12,120, +-233,-11, +113,-228, +10,-97, +111,95, +53,29, +-68,96, +-31,-84, +114,180, +-13,-67, +126,-48, +-16,15, +-10,132, +-11,-112, +-24,128, +-54,110, +11,219, +4,104, +48,-200, +16,44, +50,-78, +-182,242, +109,-68, +90,13, +27,-127, +-26,44, +167,135, +103,-48, +-19,71, +179,-50, +79,37, +28,-50, +45,24, +29,-37, +100,67, +-68,218, +-34,-52, +-14,-105, +-107,11, +57,51, +23,104, +-23,35, +-164,150, +83,188, +142,118, +-8,90, +43,82, +88,-17, +-61,52, +-23,-101, +92,-38, +-88,7, +182,83, +108,79, +48,-58, +70,-61, +-34,27, +-149,33, +-94,70, +62,195, +55,-55, +-222,-59, +-155,-165, +19,-105, +-33,53, +116,-9, +224,-44, +-2,27, +-37,-68, +155,30, +9,-84, +147,-135, +-38,-35, +-118,-70, +23,26, +-103,64, +4,-179, +20,41, +94,-24, +53,275, +-65,56, +11,-102, +46,51, +-64,29, +-42,-61, +17,30, +90,-6, +-84,63, +11,-54, +46,-51, +-38,20, +-14,31, +58,-48, +134,-1, +215,143, +-219,30, +22,-98, +-25,67, +10,-132, +7,-52, +-116,28, +-81,-20, +-65,188, +-51,23, +54,-2, +-82,39, +3,149, +29,137, +-37,-2, +-32,-49, +-136,-90, +-167,-200, +107,-22, +50,157, +115,-149, +52,-155, +-22,58, +-38,-28, +-26,58, +23,196, +104,-12, +22,93, +-95,-14, +-3,-19, +-44,-6, +60,42, +26,30, +89,30, +125,103, +134,49, +135,-75, +77,-108, +3,103, +130,-23, +-24,-29, +-132,-59, +49,-22, +96,-6, +97,-17, +-8,130, +-44,-13, +36,-7, +-50,159, +52,50, +-55,44, +78,79, +30,110, +42,19, +-21,-29, +-143,149, +134,-19, +-3,-20, +140,-75, +-162,88, +3,4, +-7,19, +160,-10, +205,-22, +-66,-30, +64,-12, +11,-14, +55,38, +-75,-10, +28,127, +0,-13, +111,-2, +-88,-6, +127,-7, +43,58, +-105,139, +-116,-108, +-63,3, +120,-109, +135,22, +13,-73, +-99,48, +-100,9, +-104,100, +17,40, +9,-32, +32,-45, +60,-156, +-27,-30, +-53,150, +-48,4, +49,96, +76,-3, +77,-110, +42,33, +130,-23, +11,-25, +19,21, +-16,-90, +-80,48, +-63,133, +-26,-21, +-35,-43, +-91,75, +54,138, +16,136, +-53,95, +97,112, +-5,-128, +46,-73, +-35,-52, +77,-82, +-62,24, +158,-28, +-40,-24, +101,-29, +-20,97, +83,-7, +-10,46, +51,206, +-36,17, +62,97, +-88,85, +11,53, +-49,-18, +66,-37, +30,17, +-79,-4, +-21,1, +-41,86, +-122,-30, +49,89, +87,-99, +-55,5, +-20,35, +-34,-104, +8,70, +33,26, +-22,71, +43,11, +-72,255, +-38,43, +89,-138, +-64,28, +18,-18, +-5,105, +47,47, +14,-96, +8,53, +-46,-82, +-74,-17, +1,-64, +43,63, +-8,13, +9,0, +-65,-69, +2,-43, +5,74, +-50,82, +-92,-32, +-24,-2, +-106,-87, +-43,67, +74,-20, +-58,-133, +-47,28, +-14,37, +18,-76, +17,5, +-60,44, +-51,40, +88,-4, +50,-183, +49,-43, +49,5, +62,-53, +-76,-6, +33,87, +-54,14, +55,-12, +-31,-4, +-168,-74, +82,7, +-16,-52, +-64,87, +-114,37, +-36,-14, +13,5, +-8,-130, +4,74, +69,1, +38,75, +-64,-28, +49,34, +-9,43, +-26,58, +67,25, +-48,37, +77,-69, +-72,-81, +27,-31, +111,104, +-17,-143, +-67,-21, +-34,3, +22,-69, +-77,92, +76,-53, +2,-25, +-35,-3, +38,-45, +58,-7, +-40,-25, +-47,95, +17,7, +68,-11, +76,59, +22,9, +40,9, +28,-54, +25,-40, +38,-6, +-7,8, +41,-52, +24,86, +53,81, +-108,-14, +-22,-85, +-49,-67, +15,-4, +60,63, +17,7, +34,-30, +-28,-53, +27,29, +4,169, +-35,1, +81,-43, +-2,-80, +47,51, +107,-34, +18,-38, +41,57, +97,56, +-35,78, +-29,27, +-58,26, +-32,22, +44,-29, +11,-14, +18,31, +10,-64, +-80,-45, +44,-9, +4,-41, +-34,81, +-22,-28, +-6,-59, +-21,-21, +-53,-5, +61,-50, +-45,-7, +-77,1, +-14,26, +-92,-37, +-21,-51, +67,13, +20,40, +-73,-18, +5,-56, +-15,-44, +46,9, +-61,-29, +11,42, +14,-54, +-30,35, +127,17, +-66,61, +-13,25, +8,-51, +-4,4, +32,-61, +3,-62, +1,46, +-7,2, +106,-12, +14,24, +-11,43, +46,-67, +32,29, +-65,-31, +-13,-43, +36,19, +2,9, +-13,-55, +-57,-4, +32,32, +-54,-29, +2,-71, +64,27, +-61,18, +-31,0, +-25,-28, +-34,32, +-7,16, +22,31, +-15,24, +-42,-24, +-47,3, +-77,-36, +19,-56, +18,18, +29,54, +72,-52, +28,15, +21,42, +38,10, +29,-18, +13,-7, +66,16, +25,32, +-2,-56, +-13,-41, +71,39, +53,-17, +-22,-52, +-6,14, +16,-1, +-22,24, +-40,45, +5,78, +34,9, +28,21, +-87,23, +16,-17, +-10,12, +-57,1, +-58,-24, +20,-4, +52,-27, +9,-23, +8,0, +5,46, +0,13, +-25,46, +16,-49, +-24,20, +42,6, +22,5, +56,-12, +-29,-34, +-36,-38, +-26,-28, +36,12, +-72,4, +31,24, +34,-20, +-16,22, +31,-17, +26,42, +-13,-13, +15,10, +24,35, +-31,14, +43,17, +-12,12, +28,-2, +3,63, +47,-27, +-20,-37, +-15,-30, +-3,-19, +-41,-28, +26,0, +-12,18, +29,22, +-16,-16, +21,-1, +-12,6, +18,12, +6,-14, +51,-54, +44,-13, +-28,-20, +-18,14, +-13,-2, +-15,2, +-14,30, +-2,-50, +-4,21, +10,-3, +3,1, +3,-35, +-33,6, +6,-7, +8,8, +28,4, +-26,15, +-31,-19, +-15,60, +-6,-9, +4,-6, +21,-15, +-10,16, +16,17, +7,-14, +28,0, +-20,-12, +-53,-28, +-14,5, +10,-24, +-17,-16, +-5,25, +0,-4, +0,8, +-12,-17, +11,5, +-18,-23, +-18,-27, +-2,32, +-7,10, +-30,-21, +3,-6, +-16,-23, +2,-26, +-13,7, +-33,-16, +6,-1, +-4,10, +-7,-4, +3,-5, +6,11, +-19,23, +-6,-1, +9,-2, +-5,-16, +5,0, +-1,-12, +-23,-16, +-4,2, +1,-6, +-25,34, +23,-5, +-8,7, +-3,1, +-3,13, +27,4, +5,13, +4,-30, +8,0, +-14,18, +12,1, +-3,16, +-17,0, +17,-1, +14,10, +-28,-5, +14,-2, +2,3, +-5,16, +5,4, +2,-8, +-11,14, +18,5, +9,7, +-12,2, +-6,17, +-4,-5, +-5,5, +6,-4, +-1,-5, +-16,-5, +4,-8, +5,-5, +0,-1, +5,-10, +3,10, +-11,-6, +2,1, +2,-6, +-3,-1, +0,3, +3,1, +-12,-1, +4,-2, +-1,-6, +0,0, +1,4, +3,-3, +-7,-1, +1,3, +-1,3, +-8,-1, +3,1, +1,1, +-5,2, +2,0, +2,1, +-6,-1, +2,1, +3,0, +-7,0, +2,0, +3,0, +-6,0, +3,0, +2,0, +-7,0, +3,0, +2,-1, +-6,1, +2,-1, +2,0, +-5,-2, +1,-1, +3,-1, +-8,1, +-1,-3, +1,-3, +-7,1, +3,3, +1,-4, +0,0, +-1,6, +4,2, +-12,1, +3,-1, +0,-3, +-3,1, +2,6, +2,-1, +-11,6, +3,-10, +5,10, +0,1, +5,5, +4,8, +-16,5, +-1,5, +6,4, +-5,-5, +-4,5, +-6,-17, +-12,-2, +9,-7, +18,-5, +-11,-14, +2,8, +5,-4, +-5,-16, +2,-3, +14,2, +-28,5, +14,-10, +17,1, +-17,0, +-3,-16, +12,-1, +-14,-18, +8,0, +4,30, +5,-13, +27,-4, +-3,-13, +-3,-1, +-8,-7, +23,5, +-25,-34, +1,6, +-4,-2, +-23,16, +-1,12, +5,0, +-5,16, +9,2, +-6,1, +-19,-23, +6,-11, +3,5, +-7,4, +-4,-10, +6,1, +-33,16, +-13,-7, +2,26, +-16,23, +3,6, +-30,21, +-7,-10, +-2,-32, +-18,27, +-18,23, +11,-5, +-12,17, +0,-8, +0,4, +-5,-25, +-17,16, +10,24, +-14,-5, +-53,28, +-20,12, +28,0, +7,14, +16,-17, +-10,-16, +21,15, +4,6, +-6,9, +-15,-60, +-31,19, +-26,-15, +28,-4, +8,-8, +6,7, +-33,-6, +3,35, +3,-1, +10,3, +-4,-21, +-2,50, +-14,-30, +-15,-2, +-13,2, +-18,-14, +-28,20, +44,13, +51,54, +6,14, +18,-12, +-12,-6, +21,1, +-16,16, +29,-22, +-12,-18, +26,0, +-41,28, +-3,19, +-15,30, +-20,37, +47,27, +3,-63, +28,2, +-12,-12, +43,-17, +-31,-14, +24,-35, +15,-10, +-13,13, +26,-42, +31,17, +-16,-22, +34,20, +31,-24, +-72,-4, +36,-12, +-26,28, +-36,38, +-29,34, +56,12, +22,-5, +42,-6, +-24,-20, +16,49, +-25,-46, +0,-13, +5,-46, +8,0, +9,23, +52,27, +20,4, +-58,24, +-57,-1, +-10,-12, +16,17, +-87,-23, +28,-21, +34,-9, +5,-78, +-40,-45, +-22,-24, +16,1, +-6,-14, +-22,52, +53,17, +71,-39, +-13,41, +-2,56, +25,-32, +66,-16, +13,7, +29,18, +38,-10, +21,-42, +28,-15, +72,52, +29,-54, +18,-18, +19,56, +-77,36, +-47,-3, +-42,24, +-15,-24, +22,-31, +-7,-16, +-34,-32, +-25,28, +-31,0, +-61,-18, +64,-27, +2,71, +-54,29, +32,-32, +-57,4, +-13,55, +2,-9, +36,-19, +-13,43, +-65,31, +32,-29, +46,67, +-11,-43, +14,-24, +106,12, +-7,-2, +1,-46, +3,62, +32,61, +-4,-4, +8,51, +-13,-25, +-66,-61, +127,-17, +-30,-35, +14,54, +11,-42, +-61,29, +46,-9, +-15,44, +5,56, +-73,18, +20,-40, +67,-13, +-21,51, +-92,37, +-14,-26, +-77,-1, +-45,7, +61,50, +-53,5, +-21,21, +-6,59, +-22,28, +-34,-81, +4,41, +44,9, +-80,45, +10,64, +18,-31, +11,14, +44,29, +-32,-22, +-58,-26, +-29,-27, +-35,-78, +97,-56, +41,-57, +18,38, +107,34, +47,-51, +-2,80, +81,43, +-35,-1, +4,-169, +27,-29, +-28,53, +34,30, +17,-7, +60,-63, +15,4, +-49,67, +-22,85, +-108,14, +53,-81, +24,-86, +41,52, +-7,-8, +38,6, +25,40, +28,54, +40,-9, +22,-9, +76,-59, +68,11, +17,-7, +-47,-95, +-40,25, +58,7, +38,45, +-35,3, +2,25, +76,53, +-77,-92, +22,69, +-34,-3, +-67,21, +-17,143, +111,-104, +27,31, +-72,81, +77,69, +-48,-37, +67,-25, +-26,-58, +-9,-43, +49,-34, +-64,28, +38,-75, +69,-1, +4,-74, +-8,130, +13,-5, +-36,14, +-114,-37, +-64,-87, +-16,52, +82,-7, +-168,74, +-31,4, +55,12, +-54,-14, +33,-87, +-76,6, +62,53, +49,-5, +49,43, +50,183, +88,4, +-51,-40, +-60,-44, +17,-5, +18,76, +-14,-37, +-47,-28, +-58,133, +74,20, +-43,-67, +-106,87, +-24,2, +-92,32, +-50,-82, +5,-74, +2,43, +-65,69, +9,0, +-8,-13, +43,-63, +1,64, +-74,17, +-46,82, +8,-53, +14,96, +47,-47, +-5,-105, +18,18, +-64,-28, +89,138, +-38,-43, +-72,-255, +43,-11, +-22,-71, +33,-26, +8,-70, +-34,104, +-20,-35, +-55,-5, +87,99, +49,-89, +-122,30, +-41,-86, +-21,-1, +-79,4, +30,-17, +66,37, +-49,18, +11,-53, +-88,-85, +62,-97, +-36,-17, +51,-206, +-10,-46, +83,7, +-20,-97, +101,29, +-40,24, +158,28, +-62,-24, +77,82, +-35,52, +46,73, +-5,128, +97,-112, +-53,-95, +16,-136, +54,-138, +-91,-75, +-35,43, +-26,21, +-63,-133, +-80,-48, +-16,90, +19,-21, +11,25, +130,23, +42,-33, +77,110, +76,3, +49,-96, +-48,-4, +-53,-150, +-27,30, +60,156, +32,45, +9,32, +17,-40, +-104,-100, +-100,-9, +-99,-48, +13,73, +135,-22, +120,109, +-63,-3, +-116,108, +-105,-139, +43,-58, +127,7, +-88,6, +111,2, +0,13, +28,-127, +-75,10, +55,-38, +11,14, +64,12, +-66,30, +205,22, +160,10, +-7,-19, +3,-4, +-162,-88, +140,75, +-3,20, +134,19, +-143,-149, +-21,29, +42,-19, +30,-110, +78,-79, +-55,-44, +52,-50, +-50,-159, +36,7, +-44,13, +-8,-130, +97,17, +96,6, +49,22, +-132,59, +-24,29, +130,23, +3,-103, +77,108, +135,75, +134,-49, +125,-103, +89,-30, +26,-30, +60,-42, +-44,6, +-3,19, +-95,14, +22,-93, +104,12, +23,-196, +-26,-58, +-38,28, +-22,-58, +52,155, +115,149, +50,-157, +107,22, +-167,200, +-136,90, +-32,49, +-37,2, +29,-137, +3,-149, +-82,-39, +54,2, +-51,-23, +-65,-188, +-81,20, +-116,-28, +7,52, +10,132, +-25,-67, +22,98, +-219,-30, +215,-143, +134,1, +58,48, +-14,-31, +-38,-20, +46,51, +11,54, +-84,-63, +90,6, +17,-30, +-42,61, +-64,-29, +46,-51, +11,102, +-65,-56, +53,-275, +94,24, +20,-41, +4,179, +-103,-64, +23,-26, +-118,70, +-38,35, +147,135, +9,84, +155,-30, +-37,68, +-2,-27, +224,44, +116,9, +-33,-53, +19,105, +-155,165, +-222,59, +55,55, +62,-195, +-94,-70, +-149,-33, +-34,-27, +70,61, +48,58, +108,-79, +182,-83, +-88,-7, +92,38, +-23,101, +-61,-52, +88,17, +43,-82, +-8,-90, +142,-118, +83,-188, +-164,-150, +-23,-35, +23,-104, +57,-51, +-107,-11, +-14,105, +-34,52, +-68,-218, +100,-67, +29,37, +45,-24, +28,50, +79,-37, +179,50, +-19,-71, +103,48, +167,-135, +-26,-44, +27,127, +90,-13, +109,68, +-182,-242, +50,78, +16,-44, +48,200, +4,-104, +11,-219, +-54,-110, +-24,-128, +-11,112, +-10,-132, +-16,-15, +126,48, +-13,67, +114,-180, +-31,84, +-68,-96, +53,-29, +111,-95, +10,97, +113,228, +-233,11, +12,-120, +-55,-174, +-13,-38, +-70,132, +179,176, +13,52, +51,69, +83,-62, +-217,-62, +-140,-9, +41,-40, +6,108, +208,76, +34,-87, +-49,-124, +-13,-26, +-88,-173, +21,-77, +13,-71, +-78,-11, +-22,18, +17,124, +168,82, +37,7, +-135,132, +143,21, +223,-5, +101,-9, +270,-30, +28,17, +-90,-146, +-147,62, +-81,-77, +-81,59, +-30,-150, +52,59, +-155,-229, +83,85, +51,-131, +9,-16, +140,-78, +165,39, +193,-97, +5,91, +210,-63, +63,158, +-65,-43, +11,-68, +-41,-2, +15,44, +67,76, +-36,98, +196,89, +-105,20, +8,-150, +-23,-12, +-36,195, +-3,-75, +-66,-7, +215,78, +-72,-158, +217,77, +234,95, +140,-45, +-135,27, +-183,-60, +228,88, +29,-71, +17,-16, +78,-71, +-206,5, +91,101, +-142,71, +-58,26, +40,-34, +136,-90, +-119,104, +-76,35, +-8,6, +18,11, +166,101, +81,67, +-268,171, +105,95, +13,47, +-121,10, +-50,-68, +-72,180, +28,44, +31,-128, +-151,49, +106,122, +200,-14, +-210,-34, +-173,-156, +-119,-88, +-36,-87, +-51,-26, +9,-74, +77,224, +108,-141, +-38,-18, +-85,171, +13,58, +-170,127, +79,-171, +27,195, +128,236, +31,16, +-181,-8, +40,58, +-160,-75, +233,-106, +18,0, +0,-44, +18,93, +165,-77, +16,-30, +109,124, +74,-238, +-153,123, +-221,12, +143,-63, +-110,-147, +20,-27, +-192,167, +-70,16, +115,82, +-115,-41, +109,39, +-120,-112, +-67,62, +41,-8, +-168,-163, +92,46, +85,187, +71,-94, +-2,-175, +32,-56, +142,-152, +-73,-48, +-87,-21, +-75,-119, +-3,-37, +-62,-8, +28,-36, +50,-188, +245,97, +-10,7, +-254,223, +-113,27, +36,-34, +31,-82, +128,-127, +-112,49, +-167,-75, +184,27, +236,27, +157,-99, +-258,56, +-19,-163, +-34,-116, +16,-92, +-84,-208, +31,-75, +283,-57, +68,-183, +87,256, +126,141, +-36,-85, +-44,74, +43,-87, +-75,-141, +-26,158, +-128,30, +-148,-8, +118,-62, +-10,128, +52,20, +-158,-6, +-98,171, +7,-62, +-69,29, +-140,41, +124,126, +5,197, +-108,94, +-86,108, +7,-146, +88,-93, +-2,156, +-189,145, +-88,-218, +-28,162, +51,-52, +-113,34, +138,93, +-155,-219, +172,29, +196,-141, +-68,204, +12,-14, +-76,-107, +-176,41, +-108,-96, +54,59, +64,-67, +-79,-167, +142,-185, +-7,111, +-13,-117, +-98,-150, +36,192, +-161,131, +15,-230, +88,16, +-187,215, +-57,-156, +184,217, +-169,39, +-175,-121, +65,54, +96,-20, +-103,159, +70,137, +-45,43, +109,-3, +155,30, +-47,-27, +23,98, +-6,307, +-174,64, +-140,54, +110,-61, +23,-169, +17,-160, +-70,-132, +144,-67, +102,-131, +-105,-73, +-67,-94, +175,-152, +-4,-180, +-166,118, +-81,-59, +44,-192, +-14,-166, +-141,0, +-56,93, +111,-58, +-8,3, +246,224, +193,-4, +124,-280, +31,149, +51,72, +38,110, +-57,-36, +29,242, +-21,205, +-130,-66, +-27,-180, +-100,-96, +-9,41, +119,-62, +248,14, +-118,60, +105,81, +-115,-158, +86,115, +48,-290, +-91,-169, +-134,121, +-149,230, +-97,-146, +-25,235, +139,-42, +-38,20, +68,-75, +-92,-105, +156,-25, +-58,-76, +122,-64, +1,-8, +59,0, +214,-123, +10,116, +-45,-209, +235,63, +13,-181, +73,-45, +-243,-62, +-166,131, +-62,123, +-110,-56, +-82,182, +181,-204, +50,39, +-50,-63, +-42,56, +87,-140, +13,103, +-85,-148, +-161,-269, +-279,-133, +117,23, +-61,191, +-31,39, +182,67, +-99,101, +10,17, +-145,-24, +199,20, +-171,-108, +-61,81, +-64,82, +27,95, +-12,-200, +124,-9, +-97,41, +164,222, +36,139, +260,-31, +-256,-23, +-13,-5, +153,-168, +-12,134, +23,-190, +-48,-166, +-127,190, +-55,316, +-126,65, +-50,13, +-111,54, +34,56, +231,-20, +-233,80, +86,-70, +-23,84, +-267,61, +-39,93, +117,93, +93,76, +-75,34, +-169,283, +-136,-114, +-132,27, +-118,258, +48,70, +-104,70, +69,27, +55,42, +-130,-74, +139,79, +194,66, +28,30, +-131,67, +27,-102, +-183,-41, +-36,157, +-71,53, +-223,60, +279,197, +33,-83, +163,75, +-41,-125, +78,177, +21,-152, +265,-76, +-138,-211, +-95,-89, +-118,162, +139,-142, +232,-7, +-46,146, +134,-1, +13,-141, +-29,17, +135,-34, +-185,190, +92,-175, +268,-8, +-25,27, +-24,17, +106,-46, +215,-50, +-66,-210, +262,95, +52,248, +150,37, +-97,2, +40,-7, +-110,44, +-164,133, +-80,119, +-117,-184, +-167,-50, +90,-34, +-185,-6, +238,80, +-220,134, +-93,-119, +31,41, +4,-2, +12,81, +56,16, +-181,249, +-137,-191, +31,46, +60,-86, +-27,74, +-109,5, +162,128, +146,144, +12,107, +-30,116, +159,-32, +73,130, +86,-3, +-7,28, +100,160, +-98,-65, +185,134, +36,282, +-210,257, +218,-59, +11,0, +35,82, +77,284, +-115,-69, +113,-219, +57,-182, +16,199, +104,26, +134,24, +21,158, +-99,202, +-77,-38, +15,125, +-106,-108, +38,-67, +49,77, +176,228, +149,-50, +211,178, +181,86, +-81,-120, +118,-23, +-94,33, +28,30, +12,-40, +70,-8, +-48,41, +55,-32, +-138,16, +-111,53, +236,-34, +41,54, +110,107, +25,-21, +80,82, +68,-365, +-165,-77, +-134,-102, +22,-46, +71,-43, +-126,-6, +-3,225, +16,51, +-118,168, +-107,128, +46,134, +130,-274, +-172,-55, +67,226, +-142,77, +59,110, +-226,-165, +160,-47, +-165,-16, +106,-3, +-255,-123, +20,64, +-40,128, +-146,-100, +-4,-194, +64,-109, +-48,-138, +-23,159, +-25,42, +8,-22, +-136,-123, +183,240, +131,-173, +32,25, +53,-37, +-52,-55, +-83,8, +12,84, +147,150, +-63,-44, +-6,-123, +-158,-75, +-70,-233, +75,-226, +12,27, +-29,75, +137,-109, +-115,281, +0,-177, +98,20, +67,188, +-139,17, +-150,-126, +-43,-85, +32,-195, +218,0, +-64,-84, +-42,129, +23,43, +-177,41, +-102,-141, +-67,-68, +169,-119, +162,-127, +-23,223, +-93,-128, +21,-42, +49,103, +-91,46, +-41,-62, +114,-102, +-98,191, +250,-135, +-74,252, +44,156, +-151,-24, +-5,-226, +77,-15, +162,216, +127,-117, +-65,-197, +-45,-55, +132,-4, +195,-32, +-20,-9, +65,-106, +-31,105, +152,-23, +103,-140, +-236,-133, +6,-54, +-31,149, +-192,257, +29,-81, +80,-48, +-68,-77, +-90,-8, +-53,-177, +94,25, +-55,78, +73,-39, +-99,-1, +256,10, +-64,-133, +-32,-30, +-9,-111, +-116,214, +173,72, +-32,66, +164,-53, +-45,-44, +213,-21, +185,95, +-134,-50, +-217,16, +-257,77, +-34,-111, +-132,-129, +-215,215, +156,115, +91,-231, +15,92, +25,109, +-92,101, +-56,166, +82,-140, +86,-17, +28,3, +-254,-60, +106,22, +54,8, +101,-68, +-73,-42, +-12,84, +-157,-83, +56,107, +39,-159, +-70,5, +241,95, +105,-280, +5,140, +142,71, +-71,-198, +-180,-39, +139,53, +15,32, +-22,-109, +-80,-136, +-316,8, +-195,172, +-76,14, +-40,-8, +-140,79, +-22,157, +71,27, +-102,-29, +50,-154, +157,-1, +-49,102, +-59,-171, +-45,-165, +129,36, +-151,223, +-204,0, +114,121, +-137,-68, +-79,-153, +-277,-64, +96,-7, +-19,23, +-115,13, +71,24, +-108,115, +-60,4, +26,145, +142,56, +132,-11, +-13,69, +-169,-1, +138,-40, +53,-83, +201,-62, +194,-79, +-149,180, +-295,9, +207,-102, +69,25, +-99,43, +3,153, +24,-139, +319,226, +43,50, +-78,-47, +-33,-56, +39,-133, +-187,-13, +-60,100, +174,-54, +181,175, +-96,21, +-109,-72, +77,87, +28,-12, +2,0, +-246,-34, +-2,62, +-150,49, +-31,175, +-43,-109, +-178,119, +-333,72, +-96,9, +-15,-3, +-34,20, +108,-128, +127,-126, +67,-71, +151,-136, +41,-179, +159,-89, +144,-17, +-62,-66, +106,67, +-79,50, +14,89, +187,-63, +-7,68, +-9,55, +-153,52, +-144,-17, +55,241, +37,-86, +75,78, +-105,260, +-93,252, +-140,-233, +3,65, +-251,116, +221,-31, +-209,-99, +-8,-132, +30,-24, +-86,-31, +34,108, +68,68, +82,-37, +92,48, +209,-3, +9,-122, +142,-277, +-127,-28, +27,-73, +-41,130, +167,-229, +17,89, +130,-18, +50,-27, +-98,164, +18,-78, +-42,169, +-128,-127, +91,-260, +-4,-113, +116,92, +-53,49, +36,-34, +-14,36, +29,-86, +28,-26, +30,-20, +26,201, +-166,186, +60,37, +275,-144, +4,143, +-132,-9, +42,103, +2,-81, +28,36, +118,79, +-126,23, +-221,-164, +-260,74, +-9,-27, +-163,104, +138,140, +-35,219, +165,-23, +-115,39, +83,-53, +31,258, +-67,-7, +128,15, +-79,-20, +-134,-29, +-22,157, +100,215, +81,-11, +149,164, +34,-37, +80,-64, +-204,-7, +-197,73, +-118,-199, +111,74, +-156,-65, +125,-9, +-55,89, +235,29, +-9,-45, +172,-155, +-51,-133, +142,159, +0,-34, +51,25, +70,-37, +8,-63, +-30,31, +-110,-60, +-132,32, +201,224, +-154,-156, +-31,-190, +102,70, +-96,-120, +12,127, +93,31, +-42,39, +-59,107, +71,82, +-156,-138, +125,-98, +53,80, +-172,153, +-36,-90, +47,283, +7,-94, +-47,-48, +81,211, +-47,-6, +107,-198, +63,-164, +125,-35, +39,-93, +114,91, +267,50, +-33,-121, +189,-71, +12,33, +-253,-35, +106,69, +57,-178, +66,1, +-231,62, +-74,-180, +-36,18, +54,-4, +-16,17, +122,83, +77,-34, +58,113, +-45,89, +-95,144, +142,8, +-35,-97, +-29,99, +71,103, +-48,67, +22,-175, +-119,-65, +-44,0, +143,81, +36,-98, +188,-127, +95,-35, +105,104, +-68,-23, +-105,-117, +93,23, +5,75, +-144,216, +122,-165, +-281,-113, +-85,-246, +9,-64, +-48,-198, +63,-17, +-29,-38, +-75,-61, +76,-23, +76,-90, +-82,17, +-213,-105, +-151,7, +-11,-47, +-194,-36, +198,65, +153,-37, +-78,-79, +104,6, +-151,-91, +15,74, +-25,155, +-91,-116, +93,23, +-141,82, +-81,-135, +54,-201, +-42,71, +154,-12, +98,-114, +-131,-102, +21,-12, +66,16, +82,188, +-56,81, +214,90, +143,-29, +-1,-88, +-139,133, +4,-47, +83,54, +-70,22, +21,20, +-91,173, +162,3, +166,-53, +16,108, +114,48, +129,23, +-30,143, +92,145, +-218,-34, +47,32, +-163,40, +30,53, +136,121, +-86,33, +-5,134, +-177,-21, +7,99, +-32,39, +-16,81, +30,28, +61,42, +249,-9, +213,1, +102,6, +86,122, +13,-25, +-82,3, +-14,-284, +-24,65, +169,34, +24,-14, +78,-36, +45,-71, +55,159, +-62,-223, +-54,235, +112,-70, +149,-27, +-17,104, +37,-35, +44,-51, +1,21, +109,102, +99,-108, +-20,31, +-95,107, +28,-7, +281,6, +32,-77, +112,11, +142,106, +-54,-107, +61,-77, +-95,62, +-42,-143, +-19,100, +-26,98, +80,42, +-30,163, +-122,136, +108,132, +80,-142, +-44,-29, +10,150, +10,37, +64,46, +-83,47, +27,-16, +27,51, +-17,98, +70,109, +-79,-26, +180,-76, +-202,33, +141,101, +-74,-12, +-91,118, +158,59, +-76,78, +-114,-103, +-164,-19, +146,6, +-17,39, +60,140, +11,183, +-34,178, +30,139, +83,-45, +-8,0, +105,30, +33,-108, +48,-16, +14,-151, +164,56, +-7,30, +83,31, +89,-25, +-72,-196, +44,105, +119,-174, +83,106, +47,118, +73,9, +15,95, +16,135, +17,58, +51,51, +133,-110, +-28,36, +-27,17, +131,16, +-74,-88, +38,-65, +-23,207, +-14,88, +179,27, +75,7, +44,122, +-13,-71, +-72,-18, +-131,39, +47,78, +9,89, +-140,-84, +-111,-25, +75,-17, +-24,-115, +-20,99, +52,-62, +85,-112, +-34,113, +-77,-143, +11,56, +-44,144, +1,27, +45,7, +-69,-138, +-43,-41, +39,-183, +-124,-89, +28,114, +-46,-1, +-70,-31, +15,13, +-61,-42, +-87,55, +-145,-17, +-43,-154, +-247,-18, +27,-129, +49,53, +126,-42, +-29,14, +-54,13, +-30,-101, +59,46, +21,172, +-148,1, +-29,143, +40,36, +15,-24, +-87,-37, +-46,-68, +-49,56, +153,-14, +30,-11, +-63,31, +11,-1, +98,35, +77,-90, +21,31, +82,119, +-57,-4, +65,61, +52,-2, +-134,-4, +33,-85, +-30,-79, +-52,-82, +21,193, +-98,-70, +55,-83, +20,3, +-80,50, +-66,107, +57,40, +17,169, +-28,8, +-39,19, +-85,155, +-177,-49, +66,48, +85,26, +-49,-33, +45,-6, +17,78, +110,-97, +-24,-57, +109,50, +-71,-16, +-101,35, +69,-62, +60,-3, +5,1, +82,23, +-31,-5, +61,9, +-67,-11, +-79,-12, +-46,4, +35,-48, +104,81, +-53,-140, +-38,-49, +45,90, +-63,-18, +-29,10, +98,97, +-45,-45, +16,86, +-104,5, +-81,96, +92,-2, +12,144, +-36,-110, +59,54, +-83,-21, +-4,-27, +-26,-144, +25,-62, +-57,-32, +25,99, +10,27, +88,66, +52,60, +99,-18, +19,-90, +-52,4, +2,1, +76,30, +4,-13, +117,10, +-85,43, +38,-66, +103,145, +94,-61, +3,3, +72,-63, +-56,-82, +-15,-184, +-21,3, +48,20, +9,9, +0,44, +-31,-23, +108,-58, +-36,31, +2,101, +-14,42, +99,-51, +96,-46, +21,62, +-70,7, +20,-15, +-24,36, +-8,-20, +36,11, +37,0, +-62,83, +-121,-49, +-32,0, +-8,-21, +99,-43, +-53,14, +53,2, +27,24, +-79,86, +49,-4, +-77,48, +59,-48, +-66,18, +-93,-35, +-90,107, +30,29, +1,59, +-10,53, +33,27, +43,-21, +0,23, +-41,-22, +-14,-49, +-88,46, +1,-95, +85,67, +-46,-111, +-16,-22, +42,-41, +157,-39, +-2,-5, +17,76, +25,-31, +77,-39, +-39,-46, +48,-56, +26,61, +-15,30, +-2,16, +79,5, +-23,-33, +-6,58, +-1,9, +-49,57, +-75,76, +-38,-10, +-42,68, +-58,60, +-26,2, +-15,21, +3,-4, +12,-75, +35,-88, +1,-92, +42,-17, +-24,-15, +79,-21, +10,-80, +-24,1, +-4,-74, +37,41, +-31,34, +16,-54, +21,-35, +-5,75, +68,68, +-19,-48, +-6,-29, +-5,-16, +-66,-5, +-10,-26, +64,33, +-4,56, +46,95, +-27,-70, +70,-23, +-16,78, +-39,-12, +29,-41, +23,-62, +12,40, +-49,87, +-16,47, +-17,-27, +6,22, +9,-46, +13,33, +15,84, +29,-10, +42,-47, +-9,28, +40,-40, +0,-9, +-13,14, +25,-26, +-35,-15, +-58,-100, +10,27, +-3,-23, +39,-28, +39,-47, +35,2, +-72,45, +-32,-69, +16,6, +2,57, +-34,-7, +-31,-13, +30,15, +34,-6, +28,-45, +-7,-9, +16,-12, +30,-88, +19,-48, +-43,-52, +-40,-15, +16,49, +27,-16, +-45,-20, +-19,-9, +15,2, +-8,30, +8,37, +-54,21, +27,33, +3,-15, +-63,0, +64,4, +-16,-53, +-25,16, +15,4, +-8,38, +-21,-12, +26,-12, +-16,-45, +-35,54, +30,16, +-18,-32, +40,2, +61,-9, +-35,0, +-13,45, +20,4, +32,-21, +-9,-45, +-31,-19, +8,-29, +12,-88, +-4,-4, +-2,40, +20,25, +-23,32, +-11,-14, +11,47, +37,-14, +5,19, +28,-26, +-49,-16, +-8,29, +3,-10, +-11,43, +0,-29, +18,11, +-6,8, +-20,3, +-22,-37, +8,0, +-37,20, +11,-17, +31,-13, +36,-11, +-5,-23, +-36,-5, +-22,-13, +4,31, +-1,22, +7,-29, +-23,27, +3,26, +3,19, +-19,-2, +-32,-9, +-10,12, +17,37, +19,14, +-47,-13, +-18,-2, +60,-26, +-1,31, +19,-8, +-2,30, +9,-13, +-29,3, +20,-6, +16,-6, +-23,10, +12,-11, +-3,-11, +9,28, +-26,26, +-21,-6, +-1,-30, +-12,-2, +18,-16, +8,-5, +6,11, +-26,1, +0,26, +-28,-10, +-19,-29, +16,-9, +15,7, +-8,10, +12,-5, +-11,3, +27,-8, +-9,14, +0,0, +-13,-3, +-36,2, +-14,-14, +-1,-21, +-14,17, +13,2, +25,2, +-15,-4, +-1,-6, +9,-2, +-25,12, +13,13, +-1,5, +4,7, +-14,-17, +16,6, +2,-2, +0,-7, +-17,6, +-17,1, +-6,-13, +9,-4, +4,-3, +-6,-4, +-6,-22, +4,23, +-10,-19, +-3,4, +-5,-10, +20,4, +8,-14, +-5,8, +-9,-5, +-5,7, +21,-3, +3,-13, +8,2, +9,2, +7,-9, +-9,0, +-1,9, +1,-14, +-18,-8, +-3,6, +-10,2, +7,2, +3,4, +1,8, +1,0, +0,5, +1,-9, +-1,-4, +0,9, +2,-6, +-3,2, +0,4, +4,-3, +-4,-4, +-2,10, +4,-4, +1,6, +3,11, +2,-3, +4,3, +-3,5, +0,-6, +0,-1, +2,5, +1,-7, +3,0, +0,7, +1,-4, +1,0, +0,6, +-2,-5, +0,0, +1,5, +0,-5, +0,0, +0,5, +1,-5, +0,0, +-2,5, +0,-6, +1,0, +1,4, +0,-7, +3,0, +1,7, +2,-5, +0,1, +0,6, +-3,-5, +4,-3, +2,3, +3,-11, +1,-6, +4,4, +-2,-10, +-4,4, +4,3, +0,-4, +-3,-2, +2,6, +0,-9, +-1,4, +1,9, +0,-5, +1,0, +1,-8, +3,-4, +7,-2, +-10,-2, +-3,-6, +-18,8, +1,14, +-1,-9, +-9,0, +7,9, +9,-2, +8,-2, +3,13, +21,3, +-5,-7, +-9,5, +-5,-8, +8,14, +20,-4, +-5,10, +-3,-4, +-10,19, +4,-23, +-6,22, +-6,4, +4,3, +9,4, +-6,13, +-17,-1, +-17,-6, +0,7, +2,2, +16,-6, +-14,17, +4,-7, +-1,-5, +13,-13, +-25,-12, +9,2, +-1,6, +-15,4, +25,-2, +13,-2, +-14,-17, +-1,21, +-14,14, +-36,-2, +-13,3, +0,0, +-9,-14, +27,8, +-11,-3, +12,5, +-8,-10, +15,-7, +16,9, +-19,29, +-28,10, +0,-26, +-26,-1, +6,-11, +8,5, +18,16, +-12,2, +-1,30, +-21,6, +-26,-26, +9,-28, +-3,11, +12,11, +-23,-10, +16,6, +20,6, +-29,-3, +9,13, +-2,-30, +19,8, +-1,-31, +60,26, +-18,2, +-47,13, +19,-14, +17,-37, +-10,-12, +-32,9, +-19,2, +3,-19, +3,-26, +-23,-27, +7,29, +-1,-22, +4,-31, +-22,13, +-36,5, +-5,23, +36,11, +31,13, +11,17, +-37,-20, +8,0, +-22,37, +-20,-3, +-6,-8, +18,-11, +0,29, +-11,-43, +3,10, +-8,-29, +-49,16, +28,26, +5,-19, +37,14, +11,-47, +-11,14, +-23,-32, +20,-25, +-2,-40, +-4,4, +12,88, +8,29, +-31,19, +-9,45, +32,21, +20,-4, +-13,-45, +-35,0, +61,9, +40,-2, +-18,32, +30,-16, +-35,-54, +-16,45, +26,12, +-21,12, +-8,-38, +15,-4, +-25,-16, +-16,53, +64,-4, +-63,0, +3,15, +27,-33, +-54,-21, +8,-37, +-8,-30, +15,-2, +-19,9, +-45,20, +27,16, +16,-49, +-40,15, +-43,52, +19,48, +30,88, +16,12, +-7,9, +28,45, +34,6, +30,-15, +-31,13, +-34,7, +2,-57, +16,-6, +-32,69, +-72,-45, +35,-2, +39,47, +39,28, +-3,23, +10,-27, +-58,100, +-35,15, +25,26, +-13,-14, +0,9, +40,40, +-9,-28, +42,47, +29,10, +15,-84, +13,-33, +9,46, +6,-22, +-17,27, +-16,-47, +-49,-87, +12,-40, +23,62, +29,41, +-39,12, +-16,-78, +70,23, +-27,70, +46,-95, +-4,-56, +64,-33, +-10,26, +-66,5, +-5,16, +-6,29, +-19,48, +68,-68, +-5,-75, +21,35, +16,54, +-31,-34, +37,-41, +-4,74, +-24,-1, +10,80, +79,21, +-24,15, +42,17, +1,92, +35,88, +12,75, +3,4, +-15,-21, +-26,-2, +-58,-60, +-42,-68, +-38,10, +-75,-76, +-49,-57, +-1,-9, +-6,-58, +-23,33, +79,-5, +-2,-16, +-15,-30, +26,-61, +48,56, +-39,46, +77,39, +25,31, +17,-76, +-2,5, +157,39, +42,41, +-16,22, +-46,111, +85,-67, +1,95, +-88,-46, +-14,49, +-41,22, +0,-23, +43,21, +33,-27, +-10,-53, +1,-59, +30,-29, +-90,-107, +-93,35, +-66,-18, +59,48, +-77,-48, +49,4, +-79,-86, +27,-24, +53,-2, +-53,-14, +99,43, +-8,21, +-32,0, +-121,49, +-62,-83, +37,0, +36,-11, +-8,20, +-24,-36, +20,15, +-70,-7, +21,-62, +96,46, +99,51, +-14,-42, +2,-101, +-36,-31, +108,58, +-31,23, +0,-44, +9,-9, +48,-20, +-21,-3, +-15,184, +-56,82, +72,63, +3,-3, +94,61, +103,-145, +38,66, +-85,-43, +117,-10, +4,13, +76,-30, +2,-1, +-52,-4, +19,90, +99,18, +52,-60, +88,-66, +10,-27, +25,-99, +-57,32, +25,62, +-26,144, +-4,27, +-83,21, +59,-54, +-36,110, +12,-144, +92,2, +-81,-96, +-104,-5, +16,-86, +-45,45, +98,-97, +-29,-10, +-63,18, +45,-90, +-38,49, +-53,140, +104,-81, +35,48, +-46,-4, +-79,12, +-67,11, +61,-9, +-31,5, +82,-23, +5,-1, +60,3, +69,62, +-101,-35, +-71,16, +109,-50, +-24,57, +110,97, +17,-78, +45,6, +-49,33, +85,-26, +66,-48, +-177,49, +-85,-155, +-39,-19, +-28,-8, +17,-169, +57,-40, +-66,-107, +-80,-50, +20,-3, +55,83, +-98,70, +21,-193, +-52,82, +-30,79, +33,85, +-134,4, +52,2, +65,-61, +-57,4, +82,-119, +21,-31, +77,90, +98,-35, +11,1, +-63,-31, +30,11, +153,14, +-49,-56, +-46,68, +-87,37, +15,24, +40,-36, +-29,-143, +-148,-1, +21,-172, +59,-46, +-30,101, +-54,-13, +-29,-14, +126,42, +49,-53, +27,129, +-247,18, +-43,154, +-145,17, +-87,-55, +-61,42, +15,-13, +-70,31, +-46,1, +28,-114, +-124,89, +39,183, +-43,41, +-69,138, +45,-7, +1,-27, +-44,-144, +11,-56, +-77,143, +-34,-113, +85,112, +52,62, +-20,-99, +-24,115, +75,17, +-111,25, +-140,84, +9,-89, +47,-78, +-131,-39, +-72,18, +-13,71, +44,-122, +75,-7, +179,-27, +-14,-88, +-23,-207, +38,65, +-74,88, +131,-16, +-27,-17, +-28,-36, +133,110, +51,-51, +17,-58, +16,-135, +15,-95, +73,-9, +47,-118, +83,-106, +119,174, +44,-105, +-72,196, +89,25, +83,-31, +-7,-30, +164,-56, +14,151, +48,16, +33,108, +105,-30, +-8,0, +83,45, +30,-139, +-34,-178, +11,-183, +60,-140, +-17,-39, +146,-6, +-164,19, +-114,103, +-76,-78, +158,-59, +-91,-118, +-74,12, +141,-101, +-202,-33, +180,76, +-79,26, +70,-109, +-17,-98, +27,-51, +27,16, +-83,-47, +64,-46, +10,-37, +10,-150, +-44,29, +80,142, +108,-132, +-122,-136, +-30,-163, +80,-42, +-26,-98, +-19,-100, +-42,143, +-95,-62, +61,77, +-54,107, +142,-106, +112,-11, +32,77, +281,-6, +28,7, +-95,-107, +-20,-31, +99,108, +109,-102, +1,-21, +44,51, +37,35, +-17,-104, +149,27, +112,70, +-54,-235, +-62,223, +55,-159, +45,71, +78,36, +24,14, +169,-34, +-24,-65, +-14,284, +-82,-3, +13,25, +86,-122, +102,-6, +213,-1, +249,9, +61,-42, +30,-28, +-16,-81, +-32,-39, +7,-99, +-177,21, +-5,-134, +-86,-33, +136,-121, +30,-53, +-163,-40, +47,-32, +-218,34, +92,-145, +-30,-143, +129,-23, +114,-48, +16,-108, +166,53, +162,-3, +-91,-173, +21,-20, +-70,-22, +83,-54, +4,47, +-139,-133, +-1,88, +143,29, +214,-90, +-56,-81, +82,-188, +66,-16, +21,12, +-131,102, +98,114, +154,12, +-42,-71, +54,201, +-81,135, +-141,-82, +93,-23, +-91,116, +-25,-155, +15,-74, +-151,91, +104,-6, +-78,79, +153,37, +198,-65, +-194,36, +-11,47, +-151,-7, +-213,105, +-82,-17, +76,90, +76,23, +-75,61, +-29,38, +63,17, +-48,198, +9,64, +-85,246, +-281,113, +122,165, +-144,-216, +5,-75, +93,-23, +-105,117, +-68,23, +105,-104, +95,35, +188,127, +36,98, +143,-81, +-44,0, +-119,65, +22,175, +-48,-67, +71,-103, +-29,-99, +-35,97, +142,-8, +-95,-144, +-45,-89, +58,-113, +77,34, +122,-83, +-16,-17, +54,4, +-36,-18, +-74,180, +-231,-62, +66,-1, +57,178, +106,-69, +-253,35, +12,-33, +189,71, +-33,121, +267,-50, +114,-91, +39,93, +125,35, +63,164, +107,198, +-47,6, +81,-211, +-47,48, +7,94, +47,-283, +-36,90, +-172,-153, +53,-80, +125,98, +-156,138, +71,-82, +-59,-107, +-42,-39, +93,-31, +12,-127, +-96,120, +102,-70, +-31,190, +-154,156, +201,-224, +-132,-32, +-110,60, +-30,-31, +8,63, +70,37, +51,-25, +0,34, +142,-159, +-51,133, +172,155, +-9,45, +235,-29, +-55,-89, +125,9, +-156,65, +111,-74, +-118,199, +-197,-73, +-204,7, +80,64, +34,37, +149,-164, +81,11, +100,-215, +-22,-157, +-134,29, +-79,20, +128,-15, +-67,7, +31,-258, +83,53, +-115,-39, +165,23, +-35,-219, +138,-140, +-163,-104, +-9,27, +-260,-74, +-221,164, +-126,-23, +118,-79, +28,-36, +2,81, +42,-103, +-132,9, +4,-143, +275,144, +60,-37, +-166,-186, +26,-201, +30,20, +28,26, +29,86, +-14,-36, +36,34, +-53,-49, +116,-92, +-4,113, +91,260, +-128,127, +-42,-169, +18,78, +-98,-164, +50,27, +130,18, +17,-89, +167,229, +-41,-130, +27,73, +-127,28, +142,277, +9,122, +209,3, +92,-48, +82,37, +68,-68, +34,-108, +-86,31, +30,24, +-8,132, +-209,99, +221,31, +-251,-116, +3,-65, +-140,233, +-93,-252, +-105,-260, +75,-78, +37,86, +55,-241, +-144,17, +-153,-52, +-9,-55, +-7,-68, +187,63, +14,-89, +-79,-50, +106,-67, +-62,66, +144,17, +159,89, +41,179, +151,136, +67,71, +127,126, +108,128, +-34,-20, +-15,3, +-96,-9, +-333,-72, +-178,-119, +-43,109, +-31,-175, +-150,-49, +-2,-62, +-246,34, +2,0, +28,12, +77,-87, +-109,72, +-96,-21, +181,-175, +174,54, +-60,-100, +-187,13, +39,133, +-33,56, +-78,47, +43,-50, +319,-226, +24,139, +3,-153, +-99,-43, +69,-25, +207,102, +-295,-9, +-149,-180, +194,79, +201,62, +53,83, +138,40, +-169,1, +-13,-69, +132,11, +142,-56, +26,-145, +-60,-4, +-108,-115, +71,-24, +-115,-13, +-19,-23, +96,7, +-277,64, +-79,153, +-137,68, +114,-121, +-204,0, +-151,-223, +129,-36, +-45,165, +-59,171, +-49,-102, +157,1, +50,154, +-102,29, +71,-27, +-22,-157, +-140,-79, +-40,8, +-76,-14, +-195,-172, +-316,-8, +-80,136, +-22,109, +15,-32, +139,-53, +-180,39, +-71,198, +142,-71, +5,-140, +105,280, +241,-95, +-70,-5, +39,159, +56,-107, +-157,83, +-12,-84, +-73,42, +101,68, +54,-8, +106,-22, +-254,60, +28,-3, +86,17, +82,140, +-56,-166, +-92,-101, +25,-109, +15,-92, +91,231, +156,-115, +-215,-215, +-132,129, +-34,111, +-257,-77, +-217,-16, +-134,50, +185,-95, +213,21, +-45,44, +164,53, +-32,-66, +173,-72, +-116,-214, +-9,111, +-32,30, +-64,133, +256,-10, +-99,1, +73,39, +-55,-78, +94,-25, +-53,177, +-90,8, +-68,77, +80,48, +29,81, +-192,-257, +-31,-149, +6,54, +-236,133, +103,140, +152,23, +-31,-105, +65,106, +-20,9, +195,32, +132,4, +-45,55, +-65,197, +127,117, +162,-216, +77,15, +-5,226, +-151,24, +44,-156, +-74,-252, +250,135, +-98,-191, +114,102, +-41,62, +-91,-46, +49,-103, +21,42, +-93,128, +-23,-223, +162,127, +169,119, +-67,68, +-102,141, +-177,-41, +23,-43, +-42,-129, +-64,84, +218,0, +32,195, +-43,85, +-150,126, +-139,-17, +67,-188, +98,-20, +0,177, +-115,-281, +137,109, +-29,-75, +12,-27, +75,226, +-70,233, +-158,75, +-6,123, +-63,44, +147,-150, +12,-84, +-83,-8, +-52,55, +53,37, +32,-25, +131,173, +183,-240, +-136,123, +8,22, +-25,-42, +-23,-159, +-48,138, +64,109, +-4,194, +-146,100, +-40,-128, +20,-64, +-255,123, +106,3, +-165,16, +160,47, +-226,165, +59,-110, +-142,-77, +67,-226, +-172,55, +130,274, +46,-134, +-107,-128, +-118,-168, +16,-51, +-3,-225, +-126,6, +71,43, +22,46, +-134,102, +-165,77, +68,365, +80,-82, +25,21, +110,-107, +41,-54, +236,34, +-111,-53, +-138,-16, +55,32, +-48,-41, +70,8, +12,40, +28,-30, +-94,-33, +118,23, +-81,120, +181,-86, +211,-178, +149,50, +176,-228, +49,-77, +38,67, +-106,108, +15,-125, +-77,38, +-99,-202, +21,-158, +134,-24, +104,-26, +16,-199, +57,182, +113,219, +-115,69, +77,-284, +35,-82, +6,0, +-139,-1, +236,162, +11,38, +149,38, +92,-90, +220,105, +-73,-15, +-24,-23, +-101,-15, +76,46, +75,-26, +-71,56, +53,-54, +-26,-101, +117,1, +-116,40, +-73,-56, +-172,-27, +-93,-147, +-164,103, +-36,125, +-134,-48, +-154,187, +-164,19, +-213,-5, +52,-73, +125,-188, +48,150, +89,-231, +-94,-61, +-7,40, +94,-64, +33,153, +-161,-230, +-78,-89, +306,66, +-301,50, +-34,40, +-56,44, +84,303, +125,82, +-268,-69, +-17,134, +-148,-26, +-64,-164, +-196,207, +-32,143, +-303,89, +40,3, +140,162, +-37,282, +-252,-215, +-84,154, +-11,-152, +-7,-118, +37,-114, +24,86, +-9,-176, +-147,-133, +-227,-249, +192,123, +-122,-87, +-82,166, +128,-47, +109,-147, +100,-190, +218,9, +-50,-176, +257,49, +-135,-124, +-14,63, +-100,-67, +118,-55, +-278,-116, +-119,43, +138,223, +16,222, +48,-71, +53,-95, +95,28, +302,107, +59,70, +35,168, +-51,-19, +123,-198, +-57,-6, +41,-114, +129,-176, +-71,-105, +-22,70, +227,71, +113,-96, +-83,-53, +95,-80, +87,127, +154,78, +-2,6, +-249,-23, +3,127, +26,-118, +-95,-79, +-155,-84, +-90,193, +163,55, +270,-222, +-123,-80, +2,-132, +-173,1, +-130,-50, +-51,11, +-28,79, +-187,275, +-36,-24, +161,-101, +-36,-79, +184,-56, +-189,38, +-36,31, +-77,-54, +43,30, +-249,131, +137,-70, +74,19, +7,69, +-9,-39, +21,89, +65,-81, +-102,-26, +140,34, +20,176, +0,-66, +12,18, +219,-25, +-92,-110, +127,-15, +12,-138, +19,-204, +154,-40, +-135,159, +222,-8, +-142,11, +123,226, +5,-63, +96,-82, +-233,49, +-46,35, +5,-299, +28,-91, +180,-17, +-221,-54, +11,-54, +15,147, +190,-77, +137,-80, +66,135, +164,-353, +-86,153, +81,90, +181,37, +48,-156, +-5,201, +-257,25, +51,124, +-17,-95, +17,-38, +-14,-231, +58,30, +-23,-219, +-101,131, +94,-158, +45,-207, +34,-60, +47,-82, +44,52, +-26,-65, +-79,237, +69,-173, +-14,149, +3,-159, +-83,-321, +-123,61, +-78,-250, +-65,283, +-78,263, +163,-33, +-189,198, +11,-112, +209,19, +62,58, +52,128, +-92,195, +-202,-24, +20,-120, +105,-169, +117,-295, +147,-31, +-92,1, +-8,-159, +123,167, +-156,117, +73,-152, +-119,71, +-18,-110, +-71,-70, +-70,185, +79,-82, +66,38, +92,-192, +-167,-102, +-43,-152, +120,34, +-57,-100, +130,-76, +44,-101, +-24,-36, +26,4, +-133,-48, +2,-102, +-6,-118, +-38,-111, +-12,-104, +105,-273, +-3,-70, +-148,16, +-64,88, +-7,-74, +-101,182, +67,-44, +82,-160, +31,20, +4,241, +-70,-94, +126,-5, +-163,221, +14,-73, +-67,-151, +127,139, +184,53, +44,118, +60,-137, +-168,-81, +-158,12, +-20,146, +-170,46, +69,-85, +153,129, +86,-49, +-148,-96, +-107,29, +287,15, +-40,44, +75,-203, +25,-94, +26,-66, +166,-30, +242,-157, +-155,1, +-13,-232, +-82,5, +-3,-154, +-23,63, +-24,-67, +-79,-135, +-168,-216, +-118,-22, +9,-290, +175,-96, +-32,88, +57,170, +-3,232, +57,-86, +117,-102, +-147,5, +-25,217, +38,-150, +-8,29, +80,-97, +-83,-138, +29,58, +121,-194, +132,143, +123,129, +239,-41, +-12,10, +172,-27, +3,151, +-120,112, +-57,107, +13,117, +-181,-9, +-149,214, +25,-20, +-109,-42, +88,145, +-135,161, +-18,-131, +-136,6, +-271,108, +55,-89, +133,40, +-69,-4, +130,-183, +157,-34, +-69,90, +59,95, +48,19, +25,12, +71,223, +-171,99, +-128,98, +-56,-135, +-8,-31, +110,-30, +-188,8, +-83,170, +-66,53, +46,-17, +154,94, +8,-323, +-209,101, +150,-116, +16,-204, +-52,100, +109,43, +-97,47, +-125,69, +26,140, +-113,78, +-71,-75, +-67,-42, +-20,-38, +99,-6, +-52,25, +74,-40, +168,-148, +-8,24, +-143,185, +-320,160, +40,-155, +66,54, +-217,-39, +105,-155, +98,179, +-206,-38, +79,174, +-6,-30, +-10,-45, +-131,94, +66,-46, +-164,-1, +30,-17, +153,11, +77,-311, +17,-60, +-64,62, +-70,32, +-125,-107, +50,113, +-28,-200, +-3,-53, +-58,34, +-247,80, +24,-6, +-2,57, +-176,45, +100,156, +41,-69, +39,11, +32,-109, +65,54, +88,7, +43,60, +-134,-80, +-174,-41, +-48,-54, +-123,-40, +72,104, +30,7, +162,52, +44,-101, +-92,-54, +-122,31, +21,-132, +-137,-54, +28,-54, +165,44, +2,127, +-37,-249, +-14,-233, +-218,-53, +86,126, +-113,-119, +154,-2, +-130,-73, +-16,-3, +149,-29, +221,129, +-110,173, +82,35, +40,19, +45,42, +-117,-91, +109,-236, +162,109, +127,-7, +-72,-113, +-145,8, +-48,148, +112,-10, +-5,-5, +-185,101, +47,32, +-109,5, +140,1, +-47,-63, +-54,2, +107,17, +109,-27, +-75,7, +26,49, +-37,17, +107,47, +135,194, +-102,57, +31,-174, +31,103, +-86,-209, +95,155, +45,-115, +17,-76, +-127,-147, +-90,4, +-30,-46, +-71,-143, +13,-25, +-63,-53, +178,-150, +-74,60, +-73,94, +9,-189, +-134,-163, +24,144, +-141,215, +27,-71, +162,-127, +39,-11, +-36,37, +10,-154, +117,27, +-131,-18, +-118,-33, +-42,48, +57,4, +-45,-187, +38,47, +-61,-125, +42,-126, +130,-38, +-75,126, +68,-34, +-129,0, +71,65, +-152,8, +-188,68, +-88,-58, +-56,38, +40,175, +-45,0, +-25,186, +-28,39, +4,51, +-82,-154, +80,-260, +-38,-52, +6,86, +-193,190, +-112,48, +150,-130, +-48,-228, +-46,46, +94,214, +144,40, +-16,-82, +191,52, +73,78, +1,2, +-32,75, +-37,-49, +-47,-16, +-2,-38, +6,127, +-139,10, +-9,-131, +83,-29, +-132,-60, +99,133, +-6,11, +-91,139, +-135,-16, +-115,131, +14,22, +137,12, +69,39, +-37,-94, +91,-20, +96,95, +-72,94, +61,-27, +-40,105, +57,54, +115,52, +73,180, +115,51, +80,13, +13,105, +67,-109, +44,37, +100,84, +-25,37, +-55,12, +-25,65, +54,103, +46,27, +20,-81, +143,-177, +-34,-84, +155,82, +8,-70, +47,46, +-118,-25, +-60,-2, +-3,-68, +71,-67, +59,39, +-126,-49, +50,-45, +7,-14, +31,-29, +68,132, +38,76, +-63,91, +28,54, +198,124, +36,-65, +-191,2, +-149,57, +88,-22, +121,-191, +122,-73, +-86,123, +-198,-98, +-150,40, +13,-30, +137,-39, +-5,-17, +187,4, +20,-50, +55,39, +37,-123, +-75,-179, +104,-50, +45,-73, +-60,62, +47,-128, +62,99, +-13,13, +-144,41, +-8,24, +-107,-77, +-19,52, +-65,0, +27,-15, +15,-126, +-17,-50, +-54,18, +-1,80, +-80,-73, +38,48, +-89,134, +-85,1, +168,-53, +162,-97, +-185,46, +-129,-120, +96,-28, +9,40, +-94,-47, +-39,137, +-40,-98, +-94,-40, +-42,8, +-4,-89, +-84,-109, +-139,14, +71,93, +-122,-49, +117,59, +-162,-21, +8,-50, +15,69, +105,-14, +87,84, +-9,85, +31,-133, +16,39, +-21,87, +9,14, +-8,-2, +-22,23, +-23,-53, +6,115, +45,-125, +47,-52, +5,-17, +10,59, +77,-10, +31,-123, +-103,-35, +32,68, +10,147, +-77,36, +-144,-27, +64,-47, +28,132, +-8,-56, +132,24, +108,84, +-35,146, +-35,-53, +45,-11, +-130,-35, +26,119, +31,-153, +-16,22, +-190,-94, +-93,-34, +-17,66, +104,52, +-34,20, +-117,-23, +22,-90, +-53,1, +-34,-85, +-7,10, +-48,116, +75,70, +19,-71, +4,57, +-48,-120, +-39,-110, +-6,-27, +-32,-30, +78,58, +-26,92, +-17,-28, +-59,5, +52,127, +-12,-73, +117,-18, +1,-1, +-18,-67, +69,-51, +48,-95, +-126,-11, +11,39, +-53,-33, +11,-29, +-16,-77, +67,-4, +-92,-25, +-105,66, +-80,107, +56,-36, +-48,-22, +18,-38, +3,-3, +12,-90, +1,101, +-3,-67, +153,-34, +-78,33, +22,12, +-23,-37, +-61,-33, +35,30, +0,-115, +137,-191, +25,92, +-100,56, +-29,9, +42,53, +-30,-32, +-14,39, +-14,-25, +-46,-105, +23,22, +115,-42, +14,-72, +-2,6, +109,-15, +-53,8, +-50,42, +-17,-12, +-101,-7, +37,-60, +-125,86, +65,59, +60,-58, +4,-74, +68,-9, +-13,-58, +-79,83, +14,-49, +-18,-118, +96,4, +74,-44, +52,39, +-33,61, +60,-44, +78,30, +-77,64, +-46,24, +2,30, +-34,28, +21,8, +21,-70, +-14,-122, +-18,-18, +38,27, +85,-100, +-23,73, +11,-44, +46,-91, +76,-34, +-16,-27, +82,-33, +72,-35, +15,11, +56,14, +-56,100, +15,14, +70,103, +0,69, +22,28, +-93,14, +11,9, +-32,-40, +-81,60, +63,4, +-9,-54, +52,9, +-55,-14, +-26,52, +59,23, +135,-36, +5,59, +-71,19, +-36,30, +-115,-51, +-21,-82, +-80,-33, +-28,4, +1,-24, +14,-14, +-118,20, +23,-94, +-83,24, +-28,45, +-22,77, +-14,26, +-73,10, +-28,-15, +-40,74, +50,13, +-8,32, +-46,-84, +11,11, +8,111, +10,-28, +-11,-20, +64,-40, +22,-49, +-69,-52, +-1,-15, +-15,66, +79,35, +9,46, +-41,23, +-14,-77, +53,31, +18,-31, +-25,26, +48,-22, +60,12, +-99,47, +4,-2, +51,-11, +5,-19, +-25,-20, +72,-46, +-75,-8, +-78,38, +-34,2, +-39,-24, +-57,12, +-12,-21, +-25,-12, +-16,-32, +16,20, +-42,20, +-57,-1, +26,48, +-43,-14, +-24,-3, +-43,-19, +-37,-29, +-60,72, +80,2, +-30,-24, +1,-10, +20,-27, +-70,1, +19,-42, +34,34, +-1,-31, +13,19, +-26,7, +-32,-20, +-44,83, +-90,38, +-30,-45, +14,-7, +26,-40, +65,-26, +12,81, +-23,28, +34,-22, +-35,19, +74,-35, +49,27, +22,-24, +58,-43, +-122,-19, +-14,-18, +-22,-23, +-61,23, +77,1, +-28,-11, +30,-16, +-11,21, +8,9, +-53,0, +-38,35, +-12,-1, +-45,-9, +41,-10, +-71,8, +-18,7, +-32,-10, +6,20, +-22,-27, +71,-12, +-1,-53, +-11,44, +-12,43, +64,-5, +-39,16, +10,5, +-47,39, +14,25, +-4,37, +-4,33, +22,-48, +-28,12, +-1,-17, +-27,39, +-51,4, +-19,-43, +37,-8, +-37,-20, +-1,38, +39,-15, +13,29, +-9,-30, +33,50, +2,-23, +-59,20, +-15,27, +-13,-22, +-19,32, +-3,7, +-7,25, +5,-14, +12,18, +30,8, +-25,6, +2,-15, +-2,26, +12,-10, +0,-8, +2,42, +3,-12, +2,-7, +20,-25, +-9,14, +-6,-37, +16,5, +-7,-15, +-26,39, +-12,1, +9,-3, +18,-19, +44,-22, +-14,0, +-8,-24, +3,-22, +-10,-23, +-43,18, +-3,7, +-6,44, +17,-5, +21,-49, +-47,1, +2,11, +15,-28, +-3,-7, +-7,-13, +28,11, +1,39, +-1,-8, +-11,-6, +-10,24, +1,23, +21,-3, +-19,-1, +-33,9, +4,5, +-19,4, +-18,-1, +3,11, +11,-11, +16,24, +12,20, +3,26, +-15,2, +0,-4, +18,20, +30,3, +6,-16, +-14,-13, +-12,-14, +6,15, +-12,-24, +7,8, +-15,-1, +1,27, +-16,-4, +-6,20, +-22,19, +1,-2, +6,-3, +11,3, +-17,-11, +7,7, +-33,-25, +-7,-7, +7,16, +-6,-6, +-24,-4, +12,9, +-15,-15, +7,-20, +6,1, +21,11, +-1,-7, +1,-4, +23,-21, +0,-2, +-1,-10, +-2,-4, +0,-14, +6,2, +2,-10, +12,12, +16,6, +-9,-23, +6,7, +9,-1, +-13,4, +-4,-9, +0,0, +5,7, +-6,-2, +-1,-1, +-2,-1, +-10,6, +10,4, +-11,0, +-5,-4, +13,-10, +-4,-5, +1,-2, +8,-5, +-2,-1, +-3,-5, +1,-3, +-2,-4, +-2,0, +5,-1, +-4,3, +-3,-2, +5,0, +-2,1, +-3,1, +6,0, +-3,-2, +-2,1, +6,1, +-2,2, +-3,0, +6,1, +-3,0, +-3,0, +6,0, +-3,0, +-3,0, +6,-1, +-3,0, +-2,-2, +6,-1, +-2,-1, +-3,2, +6,0, +-3,-1, +-2,-1, +5,0, +-3,2, +-4,-3, +5,1, +-2,0, +-2,4, +1,3, +-3,5, +-2,1, +8,5, +1,2, +-4,5, +13,10, +-5,4, +-11,0, +10,-4, +-10,-6, +-2,1, +-1,1, +-6,2, +5,-7, +0,0, +-4,9, +-13,-4, +9,1, +6,-7, +-9,23, +16,-6, +12,-12, +2,10, +6,-2, +0,14, +-2,4, +-1,10, +0,2, +23,21, +1,4, +-1,7, +21,-11, +6,-1, +7,20, +-15,15, +12,-9, +-24,4, +-6,6, +7,-16, +-7,7, +-33,25, +7,-7, +-17,11, +11,-3, +6,3, +1,2, +-22,-19, +-6,-20, +-16,4, +1,-27, +-15,1, +7,-8, +-12,24, +6,-15, +-12,14, +-14,13, +6,16, +30,-3, +18,-20, +0,4, +-15,-2, +3,-26, +12,-20, +16,-24, +11,11, +3,-11, +-18,1, +-19,-4, +4,-5, +-33,-9, +-19,1, +21,3, +1,-23, +-10,-24, +-11,6, +-1,8, +1,-39, +28,-11, +-7,13, +-3,7, +15,28, +2,-11, +-47,-1, +21,49, +17,5, +-6,-44, +-3,-7, +-43,-18, +-10,23, +3,22, +-8,24, +-14,0, +44,22, +18,19, +9,3, +-12,-1, +-26,-39, +-7,15, +16,-5, +-6,37, +-9,-14, +20,25, +2,7, +3,12, +2,-42, +0,8, +12,10, +-2,-26, +2,15, +-25,-6, +30,-8, +12,-18, +5,14, +-7,-25, +-3,-7, +-19,-32, +-13,22, +-15,-27, +-59,-20, +2,23, +33,-50, +-9,30, +13,-29, +39,15, +-1,-38, +-37,20, +37,8, +-19,43, +-51,-4, +-27,-39, +-1,17, +-28,-12, +22,48, +-4,-33, +-4,-37, +14,-25, +-47,-39, +10,-5, +-39,-16, +64,5, +-12,-43, +-11,-44, +-1,53, +71,12, +-22,27, +6,-20, +-32,10, +-18,-7, +-71,-8, +41,10, +-45,9, +-12,1, +-38,-35, +-53,0, +8,-9, +-11,-21, +30,16, +-28,11, +77,-1, +-61,-23, +-22,23, +-14,18, +-122,19, +58,43, +22,24, +49,-27, +74,35, +-35,-19, +34,22, +-23,-28, +12,-81, +65,26, +26,40, +14,7, +-30,45, +-90,-38, +-44,-83, +-32,20, +-26,-7, +13,-19, +-1,31, +34,-34, +19,42, +-70,-1, +20,27, +1,10, +-30,24, +80,-2, +-60,-72, +-37,29, +-43,19, +-24,3, +-43,14, +26,-48, +-57,1, +-42,-20, +16,-20, +-16,32, +-25,12, +-12,21, +-57,-12, +-39,24, +-34,-2, +-78,-38, +-75,8, +72,46, +-25,20, +5,19, +51,11, +4,2, +-99,-47, +60,-12, +48,22, +-25,-26, +18,31, +53,-31, +-14,77, +-41,-23, +9,-46, +79,-35, +-15,-66, +-1,15, +-69,52, +22,49, +64,40, +-11,20, +10,28, +8,-111, +11,-11, +-46,84, +-8,-32, +50,-13, +-40,-74, +-28,15, +-73,-10, +-14,-26, +-22,-77, +-28,-45, +-83,-24, +23,94, +-118,-20, +14,14, +1,24, +-28,-4, +-80,33, +-21,82, +-115,51, +-36,-30, +-71,-19, +5,-59, +135,36, +59,-23, +-26,-52, +-55,14, +52,-9, +-9,54, +63,-4, +-81,-60, +-32,40, +11,-9, +-93,-14, +22,-28, +0,-69, +70,-103, +15,-14, +-56,-100, +56,-14, +15,-11, +72,35, +82,33, +-16,27, +76,34, +46,91, +11,44, +-23,-73, +85,100, +38,-27, +-18,18, +-14,122, +21,70, +21,-8, +-34,-28, +2,-30, +-46,-24, +-77,-64, +78,-30, +60,44, +-33,-61, +52,-39, +74,44, +96,-4, +-18,118, +14,49, +-79,-83, +-13,58, +68,9, +4,74, +60,58, +65,-59, +-125,-86, +37,60, +-101,7, +-17,12, +-50,-42, +-53,-8, +109,15, +-2,-6, +14,72, +115,42, +23,-22, +-46,105, +-14,25, +-14,-39, +-30,32, +42,-53, +-29,-9, +-100,-56, +25,-92, +137,191, +0,115, +35,-30, +-61,33, +-23,37, +22,-12, +-78,-33, +153,34, +-3,67, +1,-101, +12,90, +3,3, +18,38, +-48,22, +56,36, +-80,-107, +-105,-66, +-92,25, +67,4, +-16,77, +11,29, +-53,33, +11,-39, +-126,11, +48,95, +69,51, +-18,67, +1,1, +117,18, +-12,73, +52,-127, +-59,-5, +-17,28, +-26,-92, +78,-58, +-32,30, +-6,27, +-39,110, +-48,120, +4,-57, +19,71, +75,-70, +-48,-116, +-7,-10, +-34,85, +-53,-1, +22,90, +-117,23, +-34,-20, +104,-52, +-17,-66, +-93,34, +-190,94, +-16,-22, +31,153, +26,-119, +-130,35, +45,11, +-35,53, +-35,-146, +108,-84, +132,-24, +-8,56, +28,-132, +64,47, +-144,27, +-77,-36, +10,-147, +32,-68, +-103,35, +31,123, +77,10, +10,-59, +5,17, +47,52, +45,125, +6,-115, +-23,53, +-22,-23, +-8,2, +9,-14, +-21,-87, +16,-39, +31,133, +-9,-85, +87,-84, +105,14, +15,-69, +8,50, +-162,21, +117,-59, +-122,49, +71,-93, +-139,-14, +-84,109, +-4,89, +-42,-8, +-94,40, +-40,98, +-39,-137, +-94,47, +9,-40, +96,28, +-129,120, +-185,-46, +162,97, +168,53, +-85,-1, +-89,-134, +38,-48, +-80,73, +-1,-80, +-54,-18, +-17,50, +15,126, +27,15, +-65,0, +-19,-52, +-107,77, +-8,-24, +-144,-41, +-13,-13, +62,-99, +47,128, +-60,-62, +45,73, +104,50, +-75,179, +37,123, +55,-39, +20,50, +187,-4, +-5,17, +137,39, +13,30, +-150,-40, +-198,98, +-86,-123, +122,73, +121,191, +88,22, +-149,-57, +-191,-2, +36,65, +198,-124, +28,-54, +-63,-91, +38,-76, +68,-132, +31,29, +7,14, +50,45, +-126,49, +59,-39, +71,67, +-3,68, +-60,2, +-118,25, +47,-46, +8,70, +155,-82, +-34,84, +143,177, +20,81, +46,-27, +54,-103, +-25,-65, +-55,-12, +-25,-37, +100,-84, +44,-37, +67,109, +13,-105, +80,-13, +115,-51, +73,-180, +115,-52, +57,-54, +-40,-105, +61,27, +-72,-94, +96,-95, +91,20, +-37,94, +69,-39, +137,-12, +14,-22, +-115,-131, +-135,16, +-91,-139, +-6,-11, +99,-133, +-132,60, +83,29, +-9,131, +-139,-10, +6,-127, +-2,38, +-47,16, +-37,49, +-32,-75, +1,-2, +73,-78, +191,-52, +-16,82, +144,-40, +94,-214, +-46,-46, +-48,228, +150,130, +-112,-48, +-193,-190, +6,-86, +-38,52, +80,260, +-82,154, +4,-51, +-28,-39, +-25,-186, +-45,0, +40,-175, +-56,-38, +-88,58, +-188,-68, +-152,-8, +71,-65, +-129,0, +68,34, +-75,-126, +130,38, +42,126, +-61,125, +38,-47, +-45,187, +57,-4, +-42,-48, +-118,33, +-131,18, +117,-27, +10,154, +-36,-37, +39,11, +162,127, +27,71, +-141,-215, +24,-144, +-134,163, +9,189, +-73,-94, +-74,-60, +178,150, +-63,53, +13,25, +-71,143, +-30,46, +-90,-4, +-127,147, +17,76, +45,115, +95,-155, +-86,209, +31,-103, +31,174, +-102,-57, +135,-194, +107,-47, +-37,-17, +26,-49, +-75,-7, +109,27, +107,-17, +-54,-2, +-47,63, +140,-1, +-109,-5, +47,-32, +-185,-101, +-5,5, +112,10, +-48,-148, +-145,-8, +-72,113, +127,7, +162,-109, +109,236, +-117,91, +45,-42, +40,-19, +82,-35, +-110,-173, +221,-129, +149,29, +-16,3, +-130,73, +154,2, +-113,119, +86,-126, +-218,53, +-14,233, +-37,249, +2,-127, +165,-44, +28,54, +-137,54, +21,132, +-122,-31, +-92,54, +44,101, +162,-52, +30,-7, +72,-104, +-123,40, +-48,54, +-174,41, +-134,80, +43,-60, +88,-7, +65,-54, +32,109, +39,-11, +41,69, +100,-156, +-176,-45, +-2,-57, +24,6, +-247,-80, +-58,-34, +-3,53, +-28,200, +50,-113, +-125,107, +-70,-32, +-64,-62, +17,60, +77,311, +153,-11, +30,17, +-164,1, +66,46, +-131,-94, +-10,45, +-6,30, +79,-174, +-206,38, +98,-179, +105,155, +-217,39, +66,-54, +40,155, +-320,-160, +-143,-185, +-8,-24, +168,148, +74,40, +-52,-25, +99,6, +-20,38, +-67,42, +-71,75, +-113,-78, +26,-140, +-125,-69, +-97,-47, +109,-43, +-52,-100, +16,204, +150,116, +-209,-101, +8,323, +154,-94, +46,17, +-66,-53, +-83,-170, +-188,-8, +110,30, +-8,31, +-56,135, +-128,-98, +-171,-99, +71,-223, +25,-12, +48,-19, +59,-95, +-69,-90, +157,34, +130,183, +-69,4, +133,-40, +55,89, +-271,-108, +-136,-6, +-18,131, +-135,-161, +88,-145, +-109,42, +25,20, +-149,-214, +-181,9, +13,-117, +-57,-107, +-120,-112, +3,-151, +172,27, +-12,-10, +239,41, +123,-129, +132,-143, +121,194, +29,-58, +-83,138, +80,97, +-8,-29, +38,150, +-25,-217, +-147,-5, +117,102, +57,86, +-3,-232, +57,-170, +-32,-88, +175,96, +9,290, +-118,22, +-168,216, +-79,135, +-24,67, +-23,-63, +-3,154, +-82,-5, +-13,232, +-155,-1, +242,157, +166,30, +26,66, +25,94, +75,203, +-40,-44, +287,-15, +-107,-29, +-148,96, +86,49, +153,-129, +69,85, +-170,-46, +-20,-146, +-158,-12, +-168,81, +60,137, +44,-118, +184,-53, +127,-139, +-67,151, +14,73, +-163,-221, +126,5, +-70,94, +4,-241, +31,-20, +82,160, +67,44, +-101,-182, +-7,74, +-64,-88, +-148,-16, +-3,70, +105,273, +-12,104, +-38,111, +-6,118, +2,102, +-133,48, +26,-4, +-24,36, +44,101, +130,76, +-57,100, +120,-34, +-43,152, +-167,102, +92,192, +66,-38, +79,82, +-70,-185, +-71,70, +-18,110, +-119,-71, +73,152, +-156,-117, +123,-167, +-8,159, +-92,-1, +147,31, +117,295, +105,169, +20,120, +-202,24, +-92,-195, +52,-128, +62,-58, +209,-19, +11,112, +-189,-198, +163,33, +-78,-263, +-65,-283, +-78,250, +-123,-61, +-83,321, +3,159, +-14,-149, +69,173, +-79,-237, +-26,65, +44,-52, +47,82, +34,60, +45,207, +94,158, +-101,-131, +-23,219, +58,-30, +-14,231, +17,38, +-17,95, +51,-124, +-257,-25, +-5,-201, +48,156, +181,-37, +81,-90, +-86,-153, +164,353, +66,-135, +137,80, +190,77, +15,-147, +11,54, +-221,54, +180,17, +28,91, +5,299, +-46,-35, +-233,-49, +96,82, +5,63, +123,-226, +-142,-11, +222,8, +-135,-159, +154,40, +19,204, +12,138, +127,15, +-92,110, +219,25, +12,-18, +0,66, +20,-176, +140,-34, +-102,26, +65,81, +21,-89, +-9,39, +7,-69, +74,-19, +137,70, +-249,-131, +43,-30, +-77,54, +-36,-31, +-189,-38, +184,56, +-36,79, +161,101, +-36,24, +-187,-275, +-28,-79, +-51,-11, +-130,50, +-173,-1, +2,132, +-123,80, +270,222, +163,-55, +-90,-193, +-155,84, +-95,79, +26,118, +3,-127, +-249,23, +-2,-6, +154,-78, +87,-127, +95,80, +-83,53, +113,96, +227,-71, +-22,-70, +-71,105, +129,176, +41,114, +-57,6, +123,198, +-51,19, +35,-168, +59,-70, +302,-107, +95,-28, +53,95, +48,71, +16,-222, +138,-223, +-119,-43, +-278,116, +118,55, +-100,67, +-14,-63, +-135,124, +257,-49, +-50,176, +218,-9, +100,190, +109,147, +128,47, +-82,-166, +-122,87, +192,-123, +-227,249, +-147,133, +-9,176, +24,-86, +37,114, +-7,118, +-11,152, +-84,-154, +-252,215, +-37,-282, +140,-162, +40,-3, +-303,-89, +-32,-143, +-196,-207, +-64,164, +-148,26, +-17,-134, +-268,69, +125,-82, +84,-303, +-56,-44, +-34,-40, +-301,-50, +306,-66, +-78,89, +-161,230, +33,-153, +94,64, +-7,-40, +-94,61, +89,231, +48,-150, +125,188, +52,73, +-213,5, +-164,-19, +-154,-187, +-134,48, +-36,-125, +-164,-103, +-93,147, +-172,27, +-73,56, +-116,-40, +117,-1, +-26,101, +53,54, +-71,-56, +75,26, +76,-46, +-101,15, +-24,23, +-73,15, +220,-105, +92,90, +149,-38, +11,-38, +236,-162, +-139,1, +6,0, +-85,9, +-43,-55, +-9,47, +-138,-70, +-98,-207, +118,-84, +-24,-126, +-58,-315, +1,207, +-46,136, +83,-10, +-312,105, +56,284, +-32,101, +140,-164, +78,-23, +55,125, +-77,-137, +-154,47, +72,99, +72,-209, +23,-39, +60,218, +-100,-123, +90,-76, +-49,284, +50,69, +-34,-141, +75,-9, +104,-36, +-15,-130, +85,-20, +103,-61, +25,-88, +189,-43, +-74,49, +224,23, +54,38, +6,-53, +77,-136, +93,-73, +-192,-73, +228,216, +-1,42, +-189,163, +-159,37, +-5,139, +321,-62, +-32,-175, +129,-234, +-109,-89, +41,104, +-141,-33, +120,92, +-232,-45, +-192,-190, +-44,53, +165,29, +-27,140, +-49,80, +0,-197, +-51,118, +34,140, +-87,-54, +147,178, +29,-256, +-193,-244, +-80,-128, +56,-50, +124,-47, +139,240, +-51,342, +-104,141, +-17,-52, +-146,66, +14,-98, +-71,-10, +-138,80, +96,71, +-14,-88, +33,57, +-237,101, +-56,-44, +0,194, +100,-18, +-118,70, +263,-58, +-271,174, +124,32, +117,-126, +99,31, +242,87, +-136,-248, +-84,-209, +-66,273, +50,-71, +159,51, +-129,156, +115,-52, +-135,60, +183,145, +-75,85, +-124,72, +-104,-140, +3,-159, +318,-73, +-200,-107, +124,-89, +-205,-80, +9,28, +42,-244, +78,8, +-39,-8, +97,44, +-143,-207, +165,8, +-241,-81, +202,-166, +27,23, +-15,64, +-152,172, +112,-216, +270,-7, +206,102, +2,33, +86,-78, +24,-11, +-159,166, +-85,-103, +-115,5, +87,117, +144,-115, +18,-244, +-32,-52, +240,47, +-29,-222, +-115,-74, +-181,12, +-37,-80, +-41,-197, +-52,114, +-159,81, +-125,26, +59,-37, +-52,-173, +-38,99, +230,127, +210,-131, +18,-99, +103,-104, +-171,87, +68,-19, +22,-63, +156,99, +116,47, +-6,-5, +139,-101, +-188,102, +43,-97, +52,-29, +-72,40, +-106,-193, +6,13, +35,-157, +129,-94, +266,-80, +87,60, +-142,-181, +6,48, +-120,-23, +-2,-144, +103,-94, +14,276, +-56,50, +-30,-38, +43,142, +-50,143, +79,60, +70,-89, +-104,-101, +213,-101, +-2,-62, +179,-126, +58,-38, +8,31, +132,109, +-60,24, +97,-91, +16,136, +83,-220, +-124,-232, +-101,82, +199,-237, +-56,58, +173,-96, +300,-19, +-84,90, +-41,178, +-41,91, +15,37, +107,136, +-46,-173, +-260,-51, +222,-123, +-12,8, +135,-237, +280,-61, +-16,-276, +-37,179, +-207,57, +3,87, +164,42, +-116,72, +-128,-175, +182,-8, +-5,-98, +207,-26, +-79,52, +22,66, +24,72, +107,-42, +-98,8, +-63,-47, +123,37, +-5,200, +88,91, +130,-80, +149,-88, +168,-29, +125,-190, +-41,21, +110,-147, +34,82, +57,190, +24,173, +73,-164, +-111,-79, +-24,-12, +208,-15, +172,-95, +-146,-119, +14,85, +32,38, +-33,16, +15,-124, +74,66, +32,-138, +174,-96, +69,180, +-93,-116, +-220,-35, +-110,112, +-109,58, +134,-141, +-99,49, +-158,234, +42,227, +-40,49, +-77,-256, +58,68, +59,60, +8,-91, +231,90, +83,20, +-90,88, +204,195, +-185,62, +-15,-80, +-101,-288, +-74,43, +9,326, +-265,162, +-5,-202, +-34,62, +-59,116, +-19,156, +-164,-7, +16,-85, +111,18, +16,-193, +-125,93, +-51,-212, +4,-244, +25,-232, +126,-187, +128,-159, +-65,-73, +41,-154, +-18,-212, +80,10, +-12,-17, +103,-38, +80,-142, +-92,-8, +-142,142, +-224,183, +-106,30, +-124,-101, +104,122, +-5,207, +-12,-88, +-154,101, +-84,48, +-29,-78, +-78,-41, +116,117, +-182,166, +177,-33, +8,58, +-161,-113, +37,100, +-1,66, +147,-34, +-30,-118, +-44,68, +-7,-80, +83,-29, +1,-96, +21,46, +105,0, +-135,-10, +58,46, +-61,-205, +121,1, +-44,-262, +176,32, +78,-51, +172,36, +-30,-7, +-59,56, +78,-6, +47,-7, +97,15, +36,127, +85,-70, +-65,185, +110,-43, +150,111, +-77,30, +-68,53, +18,-15, +-101,1, +30,6, +-108,34, +-35,8, +-124,245, +218,31, +-23,131, +-70,-279, +-2,-250, +-15,166, +157,21, +33,96, +-172,-66, +76,-190, +21,-21, +-184,-67, +-8,-26, +-74,105, +-88,-24, +58,-118, +-184,194, +10,-132, +-100,-52, +-27,-56, +-109,148, +18,205, +-120,-71, +23,60, +150,131, +-69,-111, +1,-144, +68,-87, +-42,-92, +-58,-25, +35,-54, +-72,-162, +154,96, +-94,-76, +87,95, +-23,-158, +37,159, +49,167, +92,-229, +39,16, +-58,152, +-143,160, +-48,16, +-10,16, +157,-84, +-89,-68, +-126,-39, +16,15, +-65,23, +-53,230, +121,-7, +5,-44, +109,98, +-175,-58, +-123,170, +-217,94, +138,6, +-133,80, +-16,48, +44,7, +129,-40, +-52,43, +143,111, +-114,-95, +-68,-29, +0,101, +-214,42, +-190,35, +-44,-154, +-107,59, +211,97, +-86,206, +1,45, +9,28, +177,-13, +-4,-46, +-82,127, +8,101, +55,52, +287,25, +-91,-214, +37,35, +148,-111, +-232,6, +-82,110, +-62,-31, +17,-4, +165,-18, +122,-117, +-9,-70, +35,-4, +179,-159, +-17,-66, +-65,5, +-4,-40, +22,-25, +83,74, +56,-28, +219,52, +114,124, +98,216, +140,-67, +-53,-16, +-35,71, +81,-150, +65,69, +31,-94, +141,-128, +-123,-29, +160,56, +89,-135, +124,66, +18,-285, +7,91, +-61,12, +119,167, +3,175, +48,-79, +26,47, +10,-187, +-116,14, +-154,86, +-64,3, +-121,11, +157,-107, +20,67, +47,43, +63,-55, +-75,-50, +56,-34, +-36,-87, +23,8, +269,69, +-94,175, +-163,-21, +-2,-51, +40,120, +-95,-7, +13,-41, +37,120, +116,20, +-71,-115, +20,-228, +20,25, +78,108, +164,43, +-139,-176, +15,61, +42,20, +102,-80, +-44,37, +-49,19, +-48,-44, +-47,33, +-41,-56, +17,87, +55,-10, +-112,-15, +-82,-177, +0,11, +3,29, +-133,25, +162,-105, +-20,229, +-79,-10, +135,-25, +22,107, +-55,8, +132,-14, +36,44, +69,-10, +-98,57, +110,-114, +-54,23, +-105,-58, +-92,-107, +83,0, +-28,89, +71,-76, +-76,-69, +8,11, +44,-90, +-42,-31, +-10,85, +27,105, +-38,-126, +-25,48, +-79,6, +161,135, +7,48, +-190,-67, +-170,34, +115,11, +29,125, +-19,-66, +45,-39, +27,32, +8,-20, +-10,-160, +89,4, +157,89, +-72,161, +-39,-68, +-28,-55, +-71,118, +-25,-86, +44,41, +6,166, +2,-71, +-101,55, +85,-114, +61,-151, +-61,-73, +-16,8, +-143,14, +103,6, +41,103, +146,-33, +137,52, +-166,-31, +61,8, +-220,86, +59,177, +-1,-52, +-52,104, +-91,-35, +-12,83, +-95,71, +52,32, +-58,-26, +-3,1, +28,50, +56,123, +203,102, +-20,110, +8,147, +44,-29, +-9,70, +-39,7, +14,-111, +-77,56, +-83,100, +-52,30, +-29,6, +-82,105, +-42,86, +2,56, +21,-29, +11,-180, +42,1, +-23,-34, +-141,48, +44,66, +-129,-4, +67,233, +153,-65, +-10,-110, +26,93, +1,62, +-32,40, +86,-50, +114,67, +120,-55, +-39,135, +3,-148, +-87,-168, +97,-34, +69,-103, +-59,-58, +-20,45, +42,-70, +57,96, +-44,34, +0,55, +73,-68, +-8,30, +55,-74, +82,13, +16,-212, +113,-29, +-57,-18, +-1,113, +69,-16, +38,8, +113,-15, +-26,-62, +-34,-39, +-42,-33, +-32,7, +-33,110, +46,-105, +88,-88, +133,-12, +-63,10, +-42,43, +16,72, +113,-14, +12,23, +-146,-11, +168,66, +-88,-75, +-50,116, +-23,-61, +-49,-56, +-43,46, +-48,-2, +-115,-36, +-45,57, +65,5, +36,25, +-8,2, +61,-101, +158,14, +-38,-52, +-130,-31, +102,-80, +-73,38, +40,-121, +-6,21, +-22,4, +55,-136, +-21,-1, +-118,4, +-4,-48, +-64,14, +-39,-28, +181,39, +-42,101, +-110,-78, +-89,-58, +-66,88, +164,-3, +36,37, +70,-97, +-16,4, +20,-60, +-1,21, +-15,-37, +25,-46, +60,2, +-28,45, +101,58, +-26,19, +68,-29, +-1,83, +51,19, +-27,48, +8,20, +26,-12, +6,-12, +-13,44, +46,136, +-99,-11, +-1,71, +-138,-13, +0,48, +-48,-69, +30,39, +1,-31, +-12,41, +15,29, +-94,-8, +28,30, +-9,-27, +-41,-13, +-34,34, +69,96, +-9,-96, +17,-14, +-42,32, +39,-33, +44,74, +88,-84, +-37,39, +-47,-28, +63,-67, +-15,-42, +25,-44, +57,44, +70,-6, +-31,1, +-12,-106, +105,-72, +70,-93, +-19,-28, +-43,28, +-53,45, +35,23, +-37,-17, +-74,59, +-76,-41, +-49,8, +-59,45, +-92,60, +-108,15, +-131,1, +-38,-26, +-61,-54, +33,1, +-91,63, +9,-17, +6,-38, +23,-50, +114,3, +-31,-11, +-44,-56, +41,-20, +159,-103, +12,33, +-113,-25, +-68,-117, +80,80, +35,-54, +49,30, +54,51, +-43,38, +30,54, +19,17, +-37,1, +-8,-14, +-54,-1, +107,-24, +136,-36, +-26,-26, +-42,-6, +38,33, +36,-100, +-44,-72, +27,-34, +-8,32, +3,43, +-33,51, +-41,4, +25,5, +-44,2, +38,9, +19,-19, +-26,-9, +-60,22, +4,101, +11,-7, +-67,-51, +-22,22, +35,38, +94,-23, +-1,57, +-2,6, +-62,7, +-3,32, +-54,69, +-20,51, +-21,52, +24,18, +70,25, +24,10, +-25,2, +-5,-35, +11,10, +-11,55, +53,-45, +9,28, +-28,7, +10,76, +-57,-14, +-12,3, +-6,-34, +32,7, +6,51, +65,-69, +-16,-82, +2,101, +-109,16, +-9,34, +-46,95, +2,-61, +-64,11, +-1,-30, +-5,-10, +40,49, +23,-7, +50,-75, +36,52, +-19,53, +4,31, +-51,51, +23,-11, +-64,7, +-27,-32, +-43,-10, +-31,49, +50,-16, +-34,28, +22,-6, +51,33, +-50,19, +-23,6, +-7,77, +-43,-20, +-31,27, +-1,2, +-15,9, +60,11, +40,-9, +-28,4, +36,-23, +57,9, +-10,27, +-58,-11, +22,-8, +-23,-30, +-12,-10, +-14,9, +3,67, +-50,45, +-4,-1, +-44,4, +-2,-22, +-21,-27, +-5,26, +1,-12, +-16,-10, +15,-15, +-27,48, +24,-3, +18,34, +-10,45, +-7,-47, +12,22, +1,-18, +-60,18, +1,55, +20,42, +4,-6, +-4,-5, +-37,2, +11,-20, +39,-36, +-8,-15, +-15,-3, +-31,-17, +7,-24, +-21,-48, +-33,24, +-10,21, +7,13, +-58,-4, +-26,30, +32,15, +-9,-11, +-10,-38, +18,-11, +17,-5, +-33,11, +14,17, +29,22, +-29,63, +-3,18, +-5,-26, +41,-16, +-13,38, +-25,-17, +-9,25, +-14,-40, +-12,32, +-23,-19, +32,7, +-29,12, +-18,11, +-13,-19, +1,8, +-28,-40, +-6,34, +-18,-5, +-28,36, +-10,-26, +-6,-34, +27,18, +22,-10, +-5,20, +13,-22, +11,17, +-1,-5, +20,23, +1,-7, +-2,-33, +-42,15, +0,0, +21,34, +-25,23, +0,-19, +29,19, +2,-23, +-20,30, +38,-12, +-9,8, +10,-11, +15,-20, +-3,-17, +-5,26, +8,-13, +10,-5, +-9,-4, +3,-14, +-7,2, +3,-15, +14,-8, +37,0, +24,6, +0,19, +-10,7, +-11,-15, +-30,-12, +-11,1, +-8,7, +22,7, +0,-14, +3,8, +7,-3, +-17,-10, +18,6, +19,7, +-21,1, +1,-22, +-2,-9, +-9,-7, +16,10, +0,-17, +-10,8, +-12,-4, +-16,12, +-5,7, +8,16, +12,-21, +-4,-15, +19,13, +3,-4, +0,5, +-7,-3, +-5,5, +-6,2, +3,6, +5,2, +-3,12, +1,-5, +-4,10, +-5,4, +-1,0, +-3,4, +-6,2, +1,3, +-4,2, +0,-3, +12,4, +1,-3, +-8,2, +8,-2, +3,3, +-12,3, +4,-1, +5,-2, +-8,-4, +3,1, +6,4, +-11,0, +4,3, +11,-3, +-5,-1, +2,-3, +8,3, +-6,-1, +1,-1, +1,1, +-7,0, +2,-1, +2,-1, +-6,0, +3,0, +3,0, +-6,0, +3,0, +3,0, +-6,0, +2,1, +2,1, +-7,0, +1,-1, +1,1, +-6,1, +8,-3, +2,3, +-5,1, +11,3, +4,-3, +-11,0, +6,-4, +3,-1, +-8,4, +5,2, +4,1, +-12,-3, +3,-3, +8,2, +-8,-2, +1,3, +12,-4, +0,3, +-4,-2, +1,-3, +-6,-2, +-3,-4, +-1,0, +-5,-4, +-4,-10, +1,5, +-3,-12, +5,-2, +3,-6, +-6,-2, +-5,-5, +-7,3, +0,-5, +3,4, +19,-13, +-4,15, +12,21, +8,-16, +-5,-7, +-16,-12, +-12,4, +-10,-8, +0,17, +16,-10, +-9,7, +-2,9, +1,22, +-21,-1, +19,-7, +18,-6, +-17,10, +7,3, +3,-8, +0,14, +22,-7, +-8,-7, +-11,-1, +-30,12, +-11,15, +-10,-7, +0,-19, +24,-6, +37,0, +14,8, +3,15, +-7,-2, +3,14, +-9,4, +10,5, +8,13, +-5,-26, +-3,17, +15,20, +10,11, +-9,-8, +38,12, +-20,-30, +2,23, +29,-19, +0,19, +-25,-23, +21,-34, +0,0, +-42,-15, +-2,33, +1,7, +20,-23, +-1,5, +11,-17, +13,22, +-5,-20, +22,10, +27,-18, +-6,34, +-10,26, +-28,-36, +-18,5, +-6,-34, +-28,40, +1,-8, +-13,19, +-18,-11, +-29,-12, +32,-7, +-23,19, +-12,-32, +-14,40, +-9,-25, +-25,17, +-13,-38, +41,16, +-5,26, +-3,-18, +-29,-63, +29,-22, +14,-17, +-33,-11, +17,5, +18,11, +-10,38, +-9,11, +32,-15, +-26,-30, +-58,4, +7,-13, +-10,-21, +-33,-24, +-21,48, +7,24, +-31,17, +-15,3, +-8,15, +39,36, +11,20, +-37,-2, +-4,5, +4,6, +20,-42, +1,-55, +-60,-18, +1,18, +12,-22, +-7,47, +-10,-45, +18,-34, +24,3, +-27,-48, +15,15, +-16,10, +1,12, +-5,-26, +-21,27, +-2,22, +-44,-4, +-4,1, +-50,-45, +3,-67, +-14,-9, +-12,10, +-23,30, +22,8, +-58,11, +-10,-27, +57,-9, +36,23, +-28,-4, +40,9, +60,-11, +-15,-9, +-1,-2, +-31,-27, +-43,20, +-7,-77, +-23,-6, +-50,-19, +51,-33, +22,6, +-34,-28, +50,16, +-31,-49, +-43,10, +-27,32, +-64,-7, +23,11, +-51,-51, +4,-31, +-19,-53, +36,-52, +50,75, +23,7, +40,-49, +-5,10, +-1,30, +-64,-11, +2,61, +-46,-95, +-9,-34, +-109,-16, +2,-101, +-16,82, +65,69, +6,-51, +32,-7, +-6,34, +-12,-3, +-57,14, +10,-76, +-28,-7, +9,-28, +53,45, +-11,-55, +11,-10, +-5,35, +-25,-2, +24,-10, +70,-25, +24,-18, +-21,-52, +-20,-51, +-54,-69, +-3,-32, +-62,-7, +-2,-6, +-1,-57, +94,23, +35,-38, +-22,-22, +-67,51, +11,7, +4,-101, +-60,-22, +-26,9, +19,19, +38,-9, +-44,-2, +25,-5, +-41,-4, +-33,-51, +3,-43, +-8,-32, +27,34, +-44,72, +36,100, +38,-33, +-42,6, +-26,26, +136,36, +107,24, +-54,1, +-8,14, +-37,-1, +19,-17, +30,-54, +-43,-38, +54,-51, +49,-30, +35,54, +80,-80, +-68,117, +-113,25, +12,-33, +159,103, +41,20, +-44,56, +-31,11, +114,-3, +23,50, +6,38, +9,17, +-91,-63, +33,-1, +-61,54, +-38,26, +-131,-1, +-108,-15, +-92,-60, +-59,-45, +-49,-8, +-76,41, +-74,-59, +-37,17, +35,-23, +-53,-45, +-43,-28, +-19,28, +70,93, +105,72, +-12,106, +-31,-1, +70,6, +57,-44, +25,44, +-15,42, +63,67, +-47,28, +-37,-39, +88,84, +44,-74, +39,33, +-42,-32, +17,14, +-9,96, +69,-96, +-34,-34, +-41,13, +-9,27, +28,-30, +-94,8, +15,-29, +-12,-41, +1,31, +30,-39, +-48,69, +0,-48, +-138,13, +-1,-71, +-99,11, +46,-136, +-13,-44, +6,12, +26,12, +8,-20, +-27,-48, +51,-19, +-1,-83, +68,29, +-26,-19, +101,-58, +-28,-45, +60,-2, +25,46, +-15,37, +-1,-21, +20,60, +-16,-4, +70,97, +36,-37, +164,3, +-66,-88, +-89,58, +-110,78, +-42,-101, +181,-39, +-39,28, +-64,-14, +-4,48, +-118,-4, +-21,1, +55,136, +-22,-4, +-6,-21, +40,121, +-73,-38, +102,80, +-130,31, +-38,52, +158,-14, +61,101, +-8,-2, +36,-25, +65,-5, +-45,-57, +-115,36, +-48,2, +-43,-46, +-49,56, +-23,61, +-50,-116, +-88,75, +168,-66, +-146,11, +12,-23, +113,14, +16,-72, +-42,-43, +-63,-10, +133,12, +88,88, +46,105, +-33,-110, +-32,-7, +-42,33, +-34,39, +-26,62, +113,15, +38,-8, +69,16, +-1,-113, +-57,18, +113,29, +16,212, +82,-13, +55,74, +-8,-30, +73,68, +0,-55, +-44,-34, +57,-96, +42,70, +-20,-45, +-59,58, +69,103, +97,34, +-87,168, +3,148, +-39,-135, +120,55, +114,-67, +86,50, +-32,-40, +1,-62, +26,-93, +-10,110, +153,65, +67,-233, +-129,4, +44,-66, +-141,-48, +-23,34, +42,-1, +11,180, +21,29, +2,-56, +-42,-86, +-82,-105, +-29,-6, +-52,-30, +-83,-100, +-77,-56, +14,111, +-39,-7, +-9,-70, +44,29, +8,-147, +-20,-110, +203,-102, +56,-123, +28,-50, +-3,-1, +-58,26, +52,-32, +-95,-71, +-12,-83, +-91,35, +-52,-104, +-1,52, +59,-177, +-220,-86, +61,-8, +-166,31, +137,-52, +146,33, +41,-103, +103,-6, +-143,-14, +-16,-8, +-61,73, +61,151, +85,114, +-101,-55, +2,71, +6,-166, +44,-41, +-25,86, +-71,-118, +-28,55, +-39,68, +-72,-161, +157,-89, +89,-4, +-10,160, +8,20, +27,-32, +45,39, +-19,66, +29,-125, +115,-11, +-170,-34, +-190,67, +7,-48, +161,-135, +-79,-6, +-25,-48, +-38,126, +27,-105, +-10,-85, +-42,31, +44,90, +8,-11, +-76,69, +71,76, +-28,-89, +83,0, +-92,107, +-105,58, +-54,-23, +110,114, +-98,-57, +69,10, +36,-44, +132,14, +-55,-8, +22,-107, +135,25, +-79,10, +-20,-229, +162,105, +-133,-25, +3,-29, +0,-11, +-82,177, +-112,15, +55,10, +17,-87, +-41,56, +-47,-33, +-48,44, +-49,-19, +-44,-37, +102,80, +42,-20, +15,-61, +-139,176, +164,-43, +78,-108, +20,-25, +20,228, +-71,115, +116,-20, +37,-120, +13,41, +-95,7, +40,-120, +-2,51, +-163,21, +-94,-175, +269,-69, +23,-8, +-36,87, +56,34, +-75,50, +63,55, +47,-43, +20,-67, +157,107, +-121,-11, +-64,-3, +-154,-86, +-116,-14, +10,187, +26,-47, +48,79, +3,-175, +119,-167, +-61,-12, +7,-91, +18,285, +124,-66, +89,135, +160,-56, +-123,29, +141,128, +31,94, +65,-69, +81,150, +-35,-71, +-53,16, +140,67, +98,-216, +114,-124, +219,-52, +56,28, +83,-74, +22,25, +-4,40, +-65,-5, +-17,66, +179,159, +35,4, +-9,70, +122,117, +165,18, +17,4, +-62,31, +-82,-110, +-232,-6, +148,111, +37,-35, +-91,214, +287,-25, +55,-52, +8,-101, +-82,-127, +-4,46, +177,13, +9,-28, +1,-45, +-86,-206, +211,-97, +-107,-59, +-44,154, +-190,-35, +-214,-42, +0,-101, +-68,29, +-114,95, +143,-111, +-52,-43, +129,40, +44,-7, +-16,-48, +-133,-80, +138,-6, +-217,-94, +-123,-170, +-175,58, +109,-98, +5,44, +121,7, +-53,-230, +-65,-23, +16,-15, +-126,39, +-89,68, +157,84, +-10,-16, +-48,-16, +-143,-160, +-58,-152, +39,-16, +92,229, +49,-167, +37,-159, +-23,158, +87,-95, +-94,76, +154,-96, +-72,162, +35,54, +-58,25, +-42,92, +68,87, +1,144, +-69,111, +150,-131, +23,-60, +-120,71, +18,-205, +-109,-148, +-27,56, +-100,52, +10,132, +-184,-194, +58,118, +-88,24, +-74,-105, +-8,26, +-184,67, +21,21, +76,190, +-172,66, +33,-96, +157,-21, +-15,-166, +-2,250, +-70,279, +-23,-131, +218,-31, +-124,-245, +-35,-8, +-108,-34, +30,-6, +-101,-1, +18,15, +-68,-53, +-77,-30, +150,-111, +110,43, +-65,-185, +85,70, +36,-127, +97,-15, +47,7, +78,6, +-59,-56, +-30,7, +172,-36, +78,51, +176,-32, +-44,262, +121,-1, +-61,205, +58,-46, +-135,10, +105,0, +21,-46, +1,96, +83,29, +-7,80, +-44,-68, +-30,118, +147,34, +-1,-66, +37,-100, +-161,113, +8,-58, +177,33, +-182,-166, +116,-117, +-78,41, +-29,78, +-84,-48, +-154,-101, +-12,88, +-5,-207, +104,-122, +-124,101, +-106,-30, +-224,-183, +-142,-142, +-92,8, +80,142, +103,38, +-12,17, +80,-10, +-18,212, +41,154, +-65,73, +128,159, +126,187, +25,232, +4,244, +-51,212, +-125,-93, +16,193, +111,-18, +16,85, +-164,7, +-19,-156, +-59,-116, +-34,-62, +-5,202, +-265,-162, +9,-326, +-74,-43, +-101,288, +-15,80, +-185,-62, +204,-195, +-90,-88, +83,-20, +231,-90, +8,91, +59,-60, +58,-68, +-77,256, +-40,-49, +42,-227, +-158,-234, +-99,-49, +134,141, +-109,-58, +-110,-112, +-220,35, +-93,116, +69,-180, +174,96, +32,138, +74,-66, +15,124, +-33,-16, +32,-38, +14,-85, +-146,119, +172,95, +208,15, +-24,12, +-111,79, +73,164, +24,-173, +57,-190, +34,-82, +110,147, +-41,-21, +125,190, +168,29, +149,88, +130,80, +88,-91, +-5,-200, +123,-37, +-63,47, +-98,-8, +107,42, +24,-72, +22,-66, +-79,-52, +207,26, +-5,98, +182,8, +-128,175, +-116,-72, +164,-42, +3,-87, +-207,-57, +-37,-179, +-16,276, +280,61, +135,237, +-12,-8, +222,123, +-260,51, +-46,173, +107,-136, +15,-37, +-41,-91, +-41,-178, +-84,-90, +300,19, +173,96, +-56,-58, +199,237, +-101,-82, +-124,232, +83,220, +16,-136, +97,91, +-60,-24, +132,-109, +8,-31, +58,38, +179,126, +-2,62, +213,101, +-104,101, +70,89, +79,-60, +-50,-143, +43,-142, +-30,38, +-56,-50, +14,-276, +103,94, +-2,144, +-120,23, +6,-48, +-142,181, +87,-60, +266,80, +129,94, +35,157, +6,-13, +-106,193, +-72,-40, +52,29, +43,97, +-188,-102, +139,101, +-6,5, +116,-47, +156,-99, +22,63, +68,19, +-171,-87, +103,104, +18,99, +210,131, +230,-127, +-38,-99, +-52,173, +59,37, +-125,-26, +-159,-81, +-52,-114, +-41,197, +-37,80, +-181,-12, +-115,74, +-29,222, +240,-47, +-32,52, +18,244, +144,115, +87,-117, +-115,-5, +-85,103, +-159,-166, +24,11, +86,78, +2,-33, +206,-102, +270,7, +112,216, +-152,-172, +-15,-64, +27,-23, +202,166, +-241,81, +165,-8, +-143,207, +97,-44, +-39,8, +78,-8, +42,244, +9,-28, +-205,80, +124,89, +-200,107, +318,73, +3,159, +-104,140, +-124,-72, +-75,-85, +183,-145, +-135,-60, +115,52, +-129,-156, +159,-51, +50,71, +-66,-273, +-84,209, +-136,248, +242,-87, +99,-31, +117,126, +124,-32, +-271,-174, +263,58, +-118,-70, +100,18, +0,-194, +-56,44, +-237,-101, +33,-57, +-14,88, +96,-71, +-138,-80, +-71,10, +14,98, +-146,-66, +-17,52, +-104,-141, +-51,-342, +139,-240, +124,47, +56,50, +-80,128, +-193,244, +29,256, +147,-178, +-87,54, +34,-140, +-51,-118, +0,197, +-49,-80, +-27,-140, +165,-29, +-44,-53, +-192,190, +-232,45, +120,-92, +-141,33, +41,-104, +-109,89, +129,234, +-32,175, +321,62, +-5,-139, +-159,-37, +-189,-163, +-1,-42, +228,-216, +-192,73, +93,73, +77,136, +6,53, +54,-38, +224,-23, +-74,-49, +189,43, +25,88, +103,61, +85,20, +-15,130, +104,36, +75,9, +-34,141, +50,-69, +-49,-284, +90,76, +-100,123, +60,-218, +23,39, +72,209, +72,-99, +-154,-47, +-77,137, +55,-125, +78,23, +140,164, +-32,-101, +56,-284, +-312,-105, +83,10, +-46,-136, +1,-207, +-58,315, +-24,126, +118,84, +-98,207, +-138,70, +-9,-47, +-43,55, +-85,-9, +6,0, +243,45, +-129,57, +75,-99, +281,-74, +-60,-129, +39,0, +115,-76, +13,-148, +-156,106, +-122,-36, +-126,-89, +-128,-208, +-130,-126, +68,36, +97,-71, +29,6, +-31,-18, +86,-55, +-171,21, +-70,58, +-58,91, +21,70, +144,20, +-79,-43, +34,-166, +75,-2, +124,-266, +9,-108, +-51,-21, +108,-13, +243,-137, +-71,94, +-173,33, +-88,31, +75,-44, +-52,161, +157,116, +-118,139, +14,130, +187,50, +-96,89, +84,-101, +-34,37, +137,61, +2,11, +60,-238, +94,-129, +94,-145, +74,96, +74,-185, +20,-27, +73,35, +46,61, +221,-4, +129,251, +-33,168, +-40,54, +118,-224, +69,152, +-111,-34, +195,-161, +26,44, +26,-239, +-15,-124, +-26,217, +142,-24, +320,29, +-134,241, +54,12, +-3,109, +-132,254, +-280,-145, +-54,221, +300,-89, +28,92, +10,-56, +-156,-263, +-23,-64, +15,-331, +-289,31, +-85,-25, +-55,139, +84,0, +-129,-241, +202,-106, +-49,107, +-21,-14, +-169,-26, +175,-201, +-111,-126, +-66,-79, +22,289, +-4,31, +124,66, +-223,95, +114,283, +-67,256, +8,-15, +-144,-30, +-55,-238, +36,143, +92,-242, +-19,-155, +308,115, +127,208, +-45,-154, +-164,56, +131,59, +-118,-69, +144,-24, +-169,-128, +90,2, +70,25, +-17,94, +-250,-7, +23,-201, +28,73, +-144,-92, +12,-17, +-317,-91, +-123,11, +188,-102, +-160,85, +-91,114, +-21,-43, +181,26, +183,-11, +-119,-51, +-11,-21, +-171,70, +57,39, +-86,177, +-102,-134, +-204,93, +-142,-199, +146,77, +166,36, +-108,206, +194,234, +97,-117, +89,-162, +-53,-4, +-334,69, +-54,-96, +-103,-145, +132,-33, +73,-183, +-300,-56, +108,166, +-51,121, +-41,136, +238,-17, +88,-54, +230,-42, +51,201, +-86,14, +106,45, +-92,32, +2,50, +-102,-78, +204,81, +-282,-53, +104,-109, +-82,-22, +-23,-160, +-183,-102, +-69,206, +64,13, +-132,-238, +185,5, +177,119, +-10,-7, +-257,28, +81,-75, +-67,-87, +114,-206, +223,-77, +-79,-34, +82,-120, +34,52, +44,-44, +106,-186, +44,-88, +-69,-111, +-128,147, +-19,108, +49,-98, +-117,13, +-94,-154, +-67,-149, +39,28, +-161,-31, +57,-31, +23,-11, +-126,8, +83,-183, +98,-95, +-86,-38, +-83,144, +104,6, +177,-216, +-13,-123, +-3,-80, +-123,-123, +44,89, +-62,179, +85,-79, +169,-20, +-124,-99, +-29,-324, +-120,106, +-118,76, +126,77, +-83,38, +-103,-230, +74,145, +129,-220, +92,79, +167,-24, +61,3, +69,-61, +-18,-86, +-20,102, +-46,-302, +-179,50, +2,-27, +177,-26, +135,126, +148,236, +48,-36, +26,194, +151,32, +27,142, +-154,11, +-192,-86, +-56,45, +117,-9, +-54,-27, +-47,226, +3,36, +45,-193, +147,168, +-151,225, +-127,-39, +140,-5, +-40,-79, +359,31, +29,-82, +46,23, +-5,66, +-188,-13, +-47,-80, +-96,29, +21,88, +75,-78, +51,-72, +-133,-157, +-23,130, +81,-82, +-83,94, +-73,-74, +-2,-19, +-89,-29, +21,4, +60,108, +191,-131, +173,5, +-151,55, +14,-125, +46,-170, +-71,85, +-154,16, +26,-24, +-148,89, +68,215, +-149,-63, +112,147, +137,-128, +41,2, +-169,73, +-106,1, +78,-108, +-17,78, +-239,22, +-156,9, +62,-13, +-13,-58, +120,71, +-66,40, +-229,-117, +140,124, +-3,-2, +-71,-116, +-53,-260, +31,-181, +6,-82, +30,63, +68,-161, +-156,10, +-95,204, +-178,40, +-1,-8, +-40,41, +8,-78, +283,-25, +-96,-35, +-135,17, +-182,53, +143,3, +-87,-44, +47,-86, +125,282, +152,152, +-109,-126, +-9,-49, +-56,148, +-245,-110, +17,81, +-93,214, +137,-59, +-33,26, +-25,214, +-31,-42, +-264,2, +-43,47, +137,125, +-77,-100, +-91,-52, +-27,81, +-54,-45, +6,37, +-143,143, +-130,-144, +-82,-96, +131,129, +1,176, +-211,216, +73,-71, +-81,-242, +-26,127, +148,-20, +128,141, +67,34, +80,54, +-187,-57, +37,36, +158,-131, +3,29, +107,-198, +12,-38, +52,-270, +-79,187, +118,248, +-19,-131, +54,76, +96,49, +-38,55, +-117,-9, +84,-123, +-292,83, +-21,76, +77,67, +82,-32, +-25,200, +48,75, +62,-192, +126,81, +37,-260, +-77,76, +-97,70, +110,180, +-65,-143, +92,-107, +80,-62, +22,117, +38,198, +136,-13, +71,109, +-154,25, +-106,74, +12,191, +7,206, +-104,-99, +-163,16, +-53,219, +-112,22, +43,-36, +-127,-242, +123,-30, +-207,12, +-52,-39, +-142,-50, +-111,111, +25,-28, +13,151, +98,149, +-10,14, +-217,-66, +18,-26, +27,-161, +-95,-128, +109,23, +154,-14, +-32,5, +88,-188, +15,-108, +231,90, +21,-84, +66,-82, +-88,136, +45,76, +37,-51, +104,-56, +73,-40, +-91,-31, +-116,-132, +31,-138, +-85,127, +237,-31, +-97,77, +67,96, +-81,-79, +-75,-104, +25,76, +-6,-102, +-70,67, +108,100, +-46,121, +163,70, +59,-12, +15,-110, +4,-12, +110,-28, +-4,-69, +120,48, +85,-37, +21,-26, +31,-186, +0,29, +-20,45, +-29,-179, +-7,-186, +-124,0, +-157,-185, +-77,-173, +3,11, +-47,-5, +11,56, +-122,74, +45,65, +-150,-42, +32,61, +-89,-23, +56,-207, +44,-28, +-7,152, +-195,-120, +16,80, +-79,92, +-67,10, +-16,146, +-121,28, +-178,99, +-18,-118, +5,7, +113,92, +-76,-3, +-193,98, +-79,66, +-3,-24, +14,-10, +-93,-140, +27,128, +146,52, +-9,-90, +80,-183, +-167,27, +80,-21, +78,-24, +-115,8, +82,-45, +93,127, +-76,2, +107,9, +-110,90, +-17,-127, +-26,180, +94,-110, +-92,-31, +4,81, +-155,-101, +-69,107, +-78,-77, +68,58, +-90,-151, +-85,-134, +-140,-51, +-13,-18, +-148,57, +146,22, +75,-85, +24,-25, +-60,143, +-63,-81, +-35,-30, +-160,-12, +157,92, +25,-68, +-33,201, +-151,-22, +97,-163, +-169,28, +-76,-113, +46,0, +16,-122, +140,108, +-62,26, +72,14, +-87,-191, +-3,14, +39,-32, +61,-73, +-111,187, +-6,34, +92,-34, +-18,-141, +-90,7, +-91,-202, +-110,-15, +-85,36, +153,-38, +-146,-158, +101,10, +-16,-164, +-63,34, +49,32, +-67,12, +136,-105, +-110,76, +73,-119, +79,91, +-50,61, +117,-32, +-60,42, +-62,2, +81,-1, +-63,40, +-124,-146, +-93,149, +86,71, +12,6, +22,-33, +-141,-38, +42,41, +81,-106, +8,-149, +79,-48, +36,31, +-9,103, +-26,-103, +-43,-118, +182,-79, +-20,-61, +87,-41, +102,-14, +-50,-101, +54,-36, +12,-101, +9,85, +-133,19, +-75,-17, +67,-94, +6,52, +-19,-148, +129,42, +4,-66, +16,-19, +-2,2, +-138,-51, +-131,-155, +-46,-72, +-94,-17, +-180,-27, +38,-18, +35,24, +-128,-17, +-106,45, +107,84, +-88,25, +-2,90, +18,12, +-98,35, +-20,5, +-10,75, +6,35, +125,113, +118,-73, +-66,44, +65,-11, +-42,-40, +-57,-4, +-26,-36, +41,-86, +33,148, +69,-62, +-30,126, +-2,-79, +-135,-70, +-53,-35, +34,18, +-88,82, +-40,65, +105,-39, +39,24, +-36,-42, +-23,109, +-11,56, +-17,140, +-127,-66, +-81,69, +105,89, +-60,28, +-96,8, +-44,-17, +-91,-28, +-23,-52, +39,-99, +76,86, +71,81, +87,-94, +-51,-10, +43,-58, +-24,-179, +-35,52, +-18,-94, +-74,45, +-181,-65, +156,5, +99,-109, +-45,-59, +32,-77, +74,-24, +124,44, +76,-84, +32,-111, +-18,55, +119,106, +38,-15, +81,39, +29,82, +-156,-32, +-31,74, +71,-17, +124,-27, +-110,-48, +58,28, +-164,46, +8,87, +34,2, +56,-22, +64,62, +-15,84, +80,-125, +9,-16, +-9,-99, +-72,7, +47,-24, +100,27, +-87,36, +51,40, +93,-17, +62,41, +-24,-39, +-196,69, +43,-8, +-106,74, +7,54, +-34,-9, +4,-15, +-3,-59, +72,93, +-6,94, +111,28, +-57,9, +-45,9, +-63,-77, +75,-3, +178,-52, +19,46, +-61,28, +-19,-143, +6,-39, +59,-18, +-7,-9, +-12,-36, +23,-49, +-59,-10, +12,26, +122,-1, +-95,-107, +37,-99, +106,54, +-14,-5, +3,-41, +101,122, +23,-141, +-14,-59, +28,-16, +13,-60, +-88,-7, +94,50, +125,93, +-8,-29, +-72,38, +50,-22, +-2,-5, +5,-148, +18,33, +-67,54, +9,82, +0,-51, +-20,-40, +58,6, +71,-150, +-1,-13, +-31,23, +-40,-1, +18,9, +-112,33, +-129,-44, +-58,-54, +38,73, +-19,-36, +28,-29, +-26,-46, +17,6, +30,72, +-54,-30, +1,-57, +65,-93, +-32,-32, +-13,45, +6,-40, +15,-91, +-18,19, +22,89, +-57,-8, +88,21, +28,-75, +54,36, +-3,-64, +12,-35, +8,-31, +-38,16, +-73,-17, +20,-8, +6,6, +-32,122, +-12,44, +68,-54, +-45,29, +-34,-29, +46,-54, +-58,13, +53,2, +-13,-19, +-9,-17, +-84,-16, +16,44, +10,11, +8,-28, +-8,-67, +-26,-3, +28,-57, +21,8, +-31,105, +-27,-5, +44,128, +-80,-32, +25,-39, +105,-13, +10,-6, +-25,62, +6,-8, +49,-39, +41,15, +-27,9, +-5,3, +16,-81, +-26,-66, +28,30, +96,33, +-38,24, +74,21, +52,35, +35,75, +7,47, +11,-2, +-59,-42, +6,-47, +-73,13, +37,-2, +-34,-7, +-31,66, +48,23, +-45,43, +16,59, +-63,5, +38,-34, +-71,3, +41,-11, +87,6, +-68,-48, +-20,-51, +-61,29, +-42,-4, +35,42, +20,18, +21,-53, +-4,23, +-52,-35, +-47,3, +-34,57, +-26,42, +38,-45, +32,-13, +-82,39, +-25,-5, +0,-6, +-13,-4, +-15,-7, +21,2, +-29,-41, +-30,14, +-22,-40, +-48,-33, +18,9, +18,9, +16,-50, +16,-21, +-69,32, +-35,5, +-4,22, +-11,33, +-6,-29, +-29,37, +-18,26, +-42,27, +-56,25, +18,-39, +-22,-14, +7,-38, +44,67, +-18,33, +-53,-8, +11,-21, +35,15, +-13,-54, +-39,-41, +-21,54, +-14,-69, +-11,21, +-1,-22, +11,27, +-15,-42, +27,21, +-3,-19, +21,11, +24,10, +17,21, +-36,80, +12,2, +20,11, +40,15, +28,-39, +-8,3, +-34,-30, +-27,31, +-11,20, +-34,-78, +12,-15, +15,-39, +-55,7, +-10,64, +43,-10, +43,17, +22,20, +-16,24, +10,-15, +-47,-50, +37,-31, +-11,8, +29,-23, +15,2, +-11,-37, +-10,9, +9,10, +-12,46, +5,9, +19,-55, +8,18, +-4,0, +-17,-19, +5,-28, +-27,-46, +11,12, +-16,-4, +-10,-15, +-20,-13, +23,-28, +13,27, +-21,1, +5,1, +-26,-25, +-4,39, +20,-26, +-13,-2, +-2,-14, +17,26, +28,32, +-36,27, +-16,-15, +-14,20, +8,-6, +-44,-28, +22,-7, +33,22, +33,-33, +30,18, +-8,-18, +24,14, +20,5, +11,-19, +-38,0, +-10,2, +-16,8, +6,-39, +10,27, +-13,1, +-28,1, +-3,-6, +15,15, +11,-37, +-24,-12, +-3,-10, +-45,-6, +-5,-4, +-12,-17, +-7,20, +28,21, +-22,5, +25,-38, +5,-16, +11,13, +18,-19, +7,13, +8,13, +9,20, +2,2, +0,-6, +-17,-1, +-17,17, +6,-1, +-8,6, +-3,-1, +10,10, +-22,0, +27,-6, +22,14, +-5,15, +3,9, +14,0, +-18,7, +-1,3, +-1,6, +-3,8, +-19,7, +-5,3, +-9,4, +8,2, +3,10, +-5,-10, +-1,9, +14,2, +0,1, +8,2, +15,-5, +-2,9, +4,-3, +1,-3, +1,-9, +1,-2, +2,8, +-9,9, +3,-4, +-4,-1, +-11,7, +-5,4, +3,-3, +-11,3, +3,-1, +7,3, +-4,-1, +5,-6, +4,0, +-7,-2, +2,1, +3,0, +-6,2, +1,1, +2,-2, +-10,-3, +-1,-1, +5,-3, +-6,-2, +2,1, +2,1, +-6,0, +2,1, +2,1, +-6,1, +3,0, +3,0, +-6,0, +3,0, +3,0, +-6,-1, +2,-1, +2,-1, +-6,0, +2,-1, +2,-1, +-6,2, +5,3, +-1,1, +-10,3, +2,2, +1,-1, +-6,-2, +3,0, +2,-1, +-7,2, +4,0, +5,6, +-4,1, +7,-3, +3,1, +-11,-3, +3,3, +-5,-4, +-11,-7, +-4,1, +3,4, +-9,-9, +2,-8, +1,2, +1,9, +1,3, +4,3, +-2,-9, +15,5, +8,-2, +0,-1, +14,-2, +-1,-9, +-5,10, +3,-10, +8,-2, +-9,-4, +-5,-3, +-19,-7, +-3,-8, +-1,-6, +-1,-3, +-18,-7, +14,0, +3,-9, +-5,-15, +22,-14, +27,6, +-22,0, +10,-10, +-3,1, +-8,-6, +6,1, +-17,-17, +-17,1, +0,6, +2,-2, +9,-20, +8,-13, +7,-13, +18,19, +11,-13, +5,16, +25,38, +-22,-5, +28,-21, +-7,-20, +-12,17, +-5,4, +-45,6, +-3,10, +-24,12, +11,37, +15,-15, +-3,6, +-28,-1, +-13,-1, +10,-27, +6,39, +-16,-8, +-10,-2, +-38,0, +11,19, +20,-5, +24,-14, +-8,18, +30,-18, +33,33, +33,-22, +22,7, +-44,28, +8,6, +-14,-20, +-16,15, +-36,-27, +28,-32, +17,-26, +-2,14, +-13,2, +20,26, +-4,-39, +-26,25, +5,-1, +-21,-1, +13,-27, +23,28, +-20,13, +-10,15, +-16,4, +11,-12, +-27,46, +5,28, +-17,19, +-4,0, +8,-18, +19,55, +5,-9, +-12,-46, +9,-10, +-10,-9, +-11,37, +15,-2, +29,23, +-11,-8, +37,31, +-47,50, +10,15, +-16,-24, +22,-20, +43,-17, +43,10, +-10,-64, +-55,-7, +15,39, +12,15, +-34,78, +-11,-20, +-27,-31, +-34,30, +-8,-3, +28,39, +40,-15, +20,-11, +12,-2, +-36,-80, +17,-21, +24,-10, +21,-11, +-3,19, +27,-21, +-15,42, +11,-27, +-1,22, +-11,-21, +-14,69, +-21,-54, +-39,41, +-13,54, +35,-15, +11,21, +-53,8, +-18,-33, +44,-67, +7,38, +-22,14, +18,39, +-56,-25, +-42,-27, +-18,-26, +-29,-37, +-6,29, +-11,-33, +-4,-22, +-35,-5, +-69,-32, +16,21, +16,50, +18,-9, +18,-9, +-48,33, +-22,40, +-30,-14, +-29,41, +21,-2, +-15,7, +-13,4, +0,6, +-25,5, +-82,-39, +32,13, +38,45, +-26,-42, +-34,-57, +-47,-3, +-52,35, +-4,-23, +21,53, +20,-18, +35,-42, +-42,4, +-61,-29, +-20,51, +-68,48, +87,-6, +41,11, +-71,-3, +38,34, +-63,-5, +16,-59, +-45,-43, +48,-23, +-31,-66, +-34,7, +37,2, +-73,-13, +6,47, +-59,42, +11,2, +7,-47, +35,-75, +52,-35, +74,-21, +-38,-24, +96,-33, +28,-30, +-26,66, +16,81, +-5,-3, +-27,-9, +41,-15, +49,39, +6,8, +-25,-62, +10,6, +105,13, +25,39, +-80,32, +44,-128, +-27,5, +-31,-105, +21,-8, +28,57, +-26,3, +-8,67, +8,28, +10,-11, +16,-44, +-84,16, +-9,17, +-13,19, +53,-2, +-58,-13, +46,54, +-34,29, +-45,-29, +68,54, +-12,-44, +-32,-122, +6,-6, +20,8, +-73,17, +-38,-16, +8,31, +12,35, +-3,64, +54,-36, +28,75, +88,-21, +-57,8, +22,-89, +-18,-19, +15,91, +6,40, +-13,-45, +-32,32, +65,93, +1,57, +-54,30, +30,-72, +17,-6, +-26,46, +28,29, +-19,36, +38,-73, +-58,54, +-129,44, +-112,-33, +18,-9, +-40,1, +-31,-23, +-1,13, +71,150, +58,-6, +-20,40, +0,51, +9,-82, +-67,-54, +18,-33, +5,148, +-2,5, +50,22, +-72,-38, +-8,29, +125,-93, +94,-50, +-88,7, +13,60, +28,16, +-14,59, +23,141, +101,-122, +3,41, +-14,5, +106,-54, +37,99, +-95,107, +122,1, +12,-26, +-59,10, +23,49, +-12,36, +-7,9, +59,18, +6,39, +-19,143, +-61,-28, +19,-46, +178,52, +75,3, +-63,77, +-45,-9, +-57,-9, +111,-28, +-6,-94, +72,-93, +-3,59, +4,15, +-34,9, +7,-54, +-106,-74, +43,8, +-196,-69, +-24,39, +62,-41, +93,17, +51,-40, +-87,-36, +100,-27, +47,24, +-72,-7, +-9,99, +9,16, +80,125, +-15,-84, +64,-62, +56,22, +34,-2, +8,-87, +-164,-46, +58,-28, +-110,48, +124,27, +71,17, +-31,-74, +-156,32, +29,-82, +81,-39, +38,15, +119,-106, +-18,-55, +32,111, +76,84, +124,-44, +74,24, +32,77, +-45,59, +99,109, +156,-5, +-181,65, +-74,-45, +-18,94, +-35,-52, +-24,179, +43,58, +-51,10, +87,94, +71,-81, +76,-86, +39,99, +-23,52, +-91,28, +-44,17, +-96,-8, +-60,-28, +105,-89, +-81,-69, +-127,66, +-17,-140, +-11,-56, +-23,-109, +-36,42, +39,-24, +105,39, +-40,-65, +-88,-82, +34,-18, +-53,35, +-135,70, +-2,79, +-30,-126, +69,62, +33,-148, +41,86, +-26,36, +-57,4, +-42,40, +65,11, +-66,-44, +118,73, +125,-113, +6,-35, +-10,-75, +-20,-5, +-98,-35, +18,-12, +-2,-90, +-88,-25, +107,-84, +-106,-45, +-128,17, +35,-24, +38,18, +-180,27, +-94,17, +-46,72, +-131,155, +-138,51, +-2,-2, +16,19, +4,66, +129,-42, +-19,148, +6,-52, +67,94, +-75,17, +-133,-19, +9,-85, +12,101, +54,36, +-50,101, +102,14, +87,41, +-20,61, +182,79, +-43,118, +-26,103, +-9,-103, +36,-31, +79,48, +8,149, +81,106, +42,-41, +-141,38, +22,33, +12,-6, +86,-71, +-93,-149, +-124,146, +-63,-40, +81,1, +-62,-2, +-60,-42, +117,32, +-50,-61, +79,-91, +73,119, +-110,-76, +136,105, +-67,-12, +49,-32, +-63,-34, +-16,164, +101,-10, +-146,158, +153,38, +-85,-36, +-110,15, +-91,202, +-90,-7, +-18,141, +92,34, +-6,-34, +-111,-187, +61,73, +39,32, +-3,-14, +-87,191, +72,-14, +-62,-26, +140,-108, +16,122, +46,0, +-76,113, +-169,-28, +97,163, +-151,22, +-33,-201, +25,68, +157,-92, +-160,12, +-35,30, +-63,81, +-60,-143, +24,25, +75,85, +146,-22, +-148,-57, +-13,18, +-140,51, +-85,134, +-90,151, +68,-58, +-78,77, +-69,-107, +-155,101, +4,-81, +-92,31, +94,110, +-26,-180, +-17,127, +-110,-90, +107,-9, +-76,-2, +93,-127, +82,45, +-115,-8, +78,24, +80,21, +-167,-27, +80,183, +-9,90, +146,-52, +27,-128, +-93,140, +14,10, +-3,24, +-79,-66, +-193,-98, +-76,3, +113,-92, +5,-7, +-18,118, +-178,-99, +-121,-28, +-16,-146, +-67,-10, +-79,-92, +16,-80, +-195,120, +-7,-152, +44,28, +56,207, +-89,23, +32,-61, +-150,42, +45,-65, +-122,-74, +11,-56, +-47,5, +3,-11, +-77,173, +-157,185, +-124,0, +-7,186, +-29,179, +-20,-45, +0,-29, +31,186, +21,26, +85,37, +120,-48, +-4,69, +110,28, +4,12, +15,110, +59,12, +163,-70, +-46,-121, +108,-100, +-70,-67, +-6,102, +25,-76, +-75,104, +-81,79, +67,-96, +-97,-77, +237,31, +-85,-127, +31,138, +-116,132, +-91,31, +73,40, +104,56, +37,51, +45,-76, +-88,-136, +66,82, +21,84, +231,-90, +15,108, +88,188, +-32,-5, +154,14, +109,-23, +-95,128, +27,161, +18,26, +-217,66, +-10,-14, +98,-149, +13,-151, +25,28, +-111,-111, +-142,50, +-52,39, +-207,-12, +123,30, +-127,242, +43,36, +-112,-22, +-53,-219, +-163,-16, +-104,99, +7,-206, +12,-191, +-106,-74, +-154,-25, +71,-109, +136,13, +38,-198, +22,-117, +80,62, +92,107, +-65,143, +110,-180, +-97,-70, +-77,-76, +37,260, +126,-81, +62,192, +48,-75, +-25,-200, +82,32, +77,-67, +-21,-76, +-292,-83, +84,123, +-117,9, +-38,-55, +96,-49, +54,-76, +-19,131, +118,-248, +-79,-187, +52,270, +12,38, +107,198, +3,-29, +158,131, +37,-36, +-187,57, +80,-54, +67,-34, +128,-141, +148,20, +-26,-127, +-81,242, +73,71, +-211,-216, +1,-176, +131,-129, +-82,96, +-130,144, +-143,-143, +6,-37, +-54,45, +-27,-81, +-91,52, +-77,100, +137,-125, +-43,-47, +-264,-2, +-31,42, +-25,-214, +-33,-26, +137,59, +-93,-214, +17,-81, +-245,110, +-56,-148, +-9,49, +-109,126, +152,-152, +125,-282, +47,86, +-87,44, +143,-3, +-182,-53, +-135,-17, +-96,35, +283,25, +8,78, +-40,-41, +-1,8, +-178,-40, +-95,-204, +-156,-10, +68,161, +30,-63, +6,82, +31,181, +-53,260, +-71,116, +-3,2, +140,-124, +-229,117, +-66,-40, +120,-71, +-13,58, +62,13, +-156,-9, +-239,-22, +-17,-78, +78,108, +-106,-1, +-169,-73, +41,-2, +137,128, +112,-147, +-149,63, +68,-215, +-148,-89, +26,24, +-154,-16, +-71,-85, +46,170, +14,125, +-151,-55, +173,-5, +191,131, +60,-108, +21,-4, +-89,29, +-2,19, +-73,74, +-83,-94, +81,82, +-23,-130, +-133,157, +51,72, +75,78, +21,-88, +-96,-29, +-47,80, +-188,13, +-5,-66, +46,-23, +29,82, +359,-31, +-40,79, +140,5, +-127,39, +-151,-225, +147,-168, +45,193, +3,-36, +-47,-226, +-54,27, +117,9, +-56,-45, +-192,86, +-154,-11, +27,-142, +151,-32, +26,-194, +48,36, +148,-236, +135,-126, +177,26, +2,27, +-179,-50, +-46,302, +-20,-102, +-18,86, +69,61, +61,-3, +167,24, +92,-79, +129,220, +74,-145, +-103,230, +-83,-38, +126,-77, +-118,-76, +-120,-106, +-29,324, +-124,99, +169,20, +85,79, +-62,-179, +44,-89, +-123,123, +-3,80, +-13,123, +177,216, +104,-6, +-83,-144, +-86,38, +98,95, +83,183, +-126,-8, +23,11, +57,31, +-161,31, +39,-28, +-67,149, +-94,154, +-117,-13, +49,98, +-19,-108, +-128,-147, +-69,111, +44,88, +106,186, +44,44, +34,-52, +82,120, +-79,34, +223,77, +114,206, +-67,87, +81,75, +-257,-28, +-10,7, +177,-119, +185,-5, +-132,238, +64,-13, +-69,-206, +-183,102, +-23,160, +-82,22, +104,109, +-282,53, +204,-81, +-102,78, +2,-50, +-92,-32, +106,-45, +-86,-14, +51,-201, +230,42, +88,54, +238,17, +-41,-136, +-51,-121, +108,-166, +-300,56, +73,183, +132,33, +-103,145, +-54,96, +-334,-69, +-53,4, +89,162, +97,117, +194,-234, +-108,-206, +166,-36, +146,-77, +-142,199, +-204,-93, +-102,134, +-86,-177, +57,-39, +-171,-70, +-11,21, +-119,51, +183,11, +181,-26, +-21,43, +-91,-114, +-160,-85, +188,102, +-123,-11, +-317,91, +12,17, +-144,92, +28,-73, +23,201, +-250,7, +-17,-94, +70,-25, +90,-2, +-169,128, +144,24, +-118,69, +131,-59, +-164,-56, +-45,154, +127,-208, +308,-115, +-19,155, +92,242, +36,-143, +-55,238, +-144,30, +8,15, +-67,-256, +114,-283, +-223,-95, +124,-66, +-4,-31, +22,-289, +-66,79, +-111,126, +175,201, +-169,26, +-21,14, +-49,-107, +202,106, +-129,241, +84,0, +-55,-139, +-85,25, +-289,-31, +15,331, +-23,64, +-156,263, +10,56, +28,-92, +300,89, +-54,-221, +-280,145, +-132,-254, +-3,-109, +54,-12, +-134,-241, +320,-29, +142,24, +-26,-217, +-15,124, +26,239, +26,-44, +195,161, +-111,34, +69,-152, +118,224, +-40,-54, +-33,-168, +129,-251, +221,4, +46,-61, +73,-35, +20,27, +74,185, +74,-96, +94,145, +94,129, +60,238, +2,-11, +137,-61, +-34,-37, +84,101, +-96,-89, +187,-50, +14,-130, +-118,-139, +157,-116, +-52,-161, +75,44, +-88,-31, +-173,-33, +-71,-94, +243,137, +108,13, +-51,21, +9,108, +124,266, +75,2, +34,166, +-79,43, +144,-20, +21,-70, +-58,-91, +-70,-58, +-171,-21, +86,55, +-31,18, +29,-6, +97,71, +68,-36, +-130,126, +-128,208, +-126,89, +-122,36, +-156,-106, +13,148, +115,76, +39,0, +-60,129, +281,74, +75,99, +-129,-57, +243,-45, +6,0, +79,35, +42,-79, +39,85, +123,-196, +-48,18, +122,38, +120,-102, +34,339, +105,-176, +59,90, +2,117, +157,239, +-230,-146, +53,79, +-5,163, +198,115, +15,-259, +-108,78, +155,42, +-87,80, +-248,171, +-37,-5, +1,146, +-141,-124, +-49,13, +-263,-44, +-118,20, +-4,17, +-39,284, +-137,51, +121,34, +-59,70, +111,-69, +3,215, +-40,168, +150,-4, +90,-66, +-298,133, +177,-76, +167,-8, +-111,-163, +-164,-53, +1,20, +-113,39, +-107,-221, +-11,-98, +-58,-33, +-55,103, +264,-40, +218,38, +-162,26, +27,204, +-36,-237, +36,-67, +140,-117, +214,34, +-87,22, +-91,215, +33,-192, +-93,40, +-1,-215, +18,134, +-8,-113, +-73,35, +-46,-68, +35,-264, +-208,18, +-67,-90, +217,47, +42,-77, +-76,-89, +22,41, +68,-53, +89,-4, +-160,-73, +-233,41, +-17,5, +67,225, +-1,-140, +-297,-106, +67,-151, +212,-96, +-83,-233, +-28,-58, +-76,-354, +-75,-29, +40,-262, +-19,71, +71,-16, +7,-103, +41,122, +10,29, +-152,-224, +-95,-188, +-84,-33, +56,-6, +-10,-192, +-303,-55, +102,-70, +-3,141, +6,16, +-22,208, +-124,112, +-24,269, +-39,18, +-259,-22, +-51,-239, +-227,91, +7,40, +-64,129, +138,-78, +-10,-197, +160,36, +190,-233, +-272,-112, +54,53, +49,-25, +-52,-118, +-15,-248, +-80,141, +-55,-56, +125,-4, +-7,-14, +214,-25, +118,234, +105,-8, +-35,-143, +100,101, +96,20, +-110,48, +-75,159, +112,-147, +153,-128, +60,280, +6,211, +-85,-33, +-137,12, +-62,-127, +-37,-33, +14,-44, +214,41, +115,-83, +47,95, +46,68, +31,48, +155,-59, +-29,-182, +-137,62, +93,236, +103,53, +-147,-209, +233,-18, +-53,-6, +-18,94, +10,-112, +249,-53, +143,12, +88,-76, +25,53, +210,149, +-198,-58, +-88,-24, +158,-160, +-122,-150, +172,-118, +-190,-29, +57,176, +-102,18, +-8,116, +-83,264, +105,253, +4,2, +-112,9, +179,-147, +-107,162, +-4,-4, +59,26, +-61,-157, +-82,113, +23,-211, +72,-328, +-50,-41, +-281,-84, +-7,-190, +129,65, +-120,-32, +-145,-103, +236,-26, +144,94, +169,89, +240,-146, +58,122, +-28,18, +-143,-11, +76,24, +-13,41, +148,-204, +-72,119, +193,-53, +120,38, +78,-176, +-190,22, +-53,27, +-148,-82, +184,201, +-138,99, +92,-63, +138,54, +-94,-106, +-38,5, +126,94, +152,193, +-8,-11, +23,134, +10,-142, +183,63, +-170,76, +1,84, +-21,-79, +-136,127, +79,-70, +-59,-54, +41,61, +106,-21, +53,39, +-180,-178, +116,8, +-132,-215, +93,-64, +22,33, +-44,16, +156,224, +-220,-88, +-53,105, +4,-118, +49,150, +34,-180, +201,-202, +-191,-177, +-204,-67, +19,-28, +-43,-33, +-146,-49, +24,-137, +-102,89, +40,-77, +-127,122, +23,186, +-92,12, +-64,33, +-59,-50, +-29,53, +-155,191, +29,284, +-121,199, +116,-253, +164,16, +-236,-191, +89,66, +-19,164, +-21,258, +-7,55, +-2,-180, +128,10, +-248,-49, +-61,135, +42,-116, +179,3, +-49,9, +-244,1, +-166,-73, +-206,-87, +68,54, +30,-29, +82,68, +87,46, +31,28, +-66,-137, +55,-109, +23,105, +105,173, +-201,110, +184,15, +-27,35, +-90,-203, +16,211, +-134,-176, +43,190, +91,-11, +-124,-26, +109,29, +92,1, +64,-4, +47,-160, +76,-34, +41,151, +-57,-25, +-135,-13, +163,45, +11,-46, +-243,54, +-77,-62, +101,-192, +-53,-18, +74,218, +9,-73, +-109,102, +48,-127, +51,65, +117,166, +144,65, +105,-46, +-142,59, +-36,59, +-101,97, +-223,-59, +63,101, +-144,-28, +52,-57, +44,144, +-145,-32, +8,-82, +45,252, +103,-95, +154,-22, +-71,142, +135,-54, +231,-156, +-56,-92, +41,53, +-283,121, +-129,-80, +164,26, +138,291, +1,9, +-18,-94, +-122,-108, +-39,204, +-75,118, +-101,56, +-36,-54, +-79,10, +31,150, +101,55, +-112,-18, +144,139, +-53,70, +12,-159, +-140,-30, +103,-33, +96,-65, +-16,-131, +257,-96, +-50,157, +-54,-166, +-53,-116, +109,83, +287,-21, +-26,-148, +119,113, +154,-19, +84,-48, +31,-222, +-161,97, +-22,32, +-113,-15, +-105,40, +-22,-25, +17,73, +131,67, +13,-5, +-79,10, +86,-37, +-187,-80, +-16,97, +-26,51, +-17,-89, +-15,63, +64,156, +-18,178, +240,67, +64,59, +-133,77, +226,151, +83,9, +-52,-5, +54,-74, +68,-186, +46,31, +22,177, +62,194, +-61,217, +162,-46, +77,-21, +-165,-19, +117,-43, +130,40, +-107,-12, +188,-101, +10,40, +-120,113, +-54,100, +-85,-115, +-148,22, +-50,-109, +134,-7, +152,80, +17,-4, +-119,25, +60,-20, +188,-163, +-87,86, +-70,-32, +-114,-49, +137,-14, +-22,-253, +178,-4, +55,18, +-76,96, +-94,78, +-129,205, +-4,88, +-12,-90, +158,104, +72,139, +-88,-24, +67,-22, +27,-70, +-246,19, +-45,123, +-94,113, +99,19, +-22,92, +106,18, +94,62, +153,-129, +127,20, +123,160, +113,9, +-17,118, +68,160, +-26,-84, +-76,16, +46,-21, +-80,-213, +-83,153, +-155,-30, +-37,-75, +86,-54, +91,49, +104,-48, +-16,134, +-122,65, +184,-114, +47,11, +-62,-80, +40,-137, +-21,-170, +169,2, +154,-46, +55,55, +-10,132, +57,104, +23,70, +84,-80, +56,-183, +-79,27, +-105,-82, +58,90, +73,-97, +-167,19, +-37,-154, +82,72, +8,97, +79,104, +7,-2, +58,-34, +-124,103, +43,-52, +108,175, +12,-24, +-73,-83, +-157,24, +-22,109, +-124,46, +204,-86, +222,30, +-135,34, +-31,-6, +-95,62, +61,-136, +71,185, +-7,25, +-9,-22, +-33,-116, +66,-70, +70,31, +-26,-56, +-147,72, +43,100, +-92,-56, +-33,29, +-31,-165, +-75,119, +-114,-236, +-43,128, +-8,-14, +-48,-45, +3,-10, +176,27, +109,22, +90,-28, +-61,226, +64,101, +-10,17, +-82,-23, +86,-30, +-67,-46, +58,-89, +-221,-92, +144,-21, +-174,-55, +25,-17, +108,-85, +18,-1, +1,-117, +-22,78, +-20,105, +-133,-58, +-59,-50, +152,89, +-31,-8, +96,27, +-109,66, +60,-247, +58,48, +-42,159, +-16,103, +8,43, +114,-168, +17,-50, +-90,-106, +37,22, +36,103, +122,6, +-73,-36, +73,-65, +-13,135, +28,-29, +186,51, +-34,81, +-46,-72, +-89,-101, +60,24, +-105,83, +115,-112, +-116,-70, +-97,75, +-59,28, +17,62, +122,31, +118,-13, +12,51, +6,160, +-40,67, +-100,90, +-177,-61, +17,-19, +-77,87, +-42,44, +59,19, +54,-91, +36,93, +-18,127, +-8,3, +-109,2, +75,-94, +-34,-160, +-5,49, +-118,-49, +-5,-34, +47,13, +4,-14, +135,54, +78,47, +2,110, +92,111, +-58,97, +-103,110, +186,27, +-25,68, +7,-40, +153,64, +55,-171, +-20,-84, +37,-29, +-101,39, +4,-12, +146,-1, +18,130, +-34,50, +73,-113, +128,14, +82,-128, +46,-77, +72,122, +-118,31, +-35,80, +-138,8, +1,25, +53,-181, +-84,58, +16,68, +-69,33, +-18,-18, +75,-52, +6,119, +-23,142, +5,-85, +-93,-111, +13,9, +8,-115, +118,-79, +2,109, +-51,-33, +-13,60, +10,62, +2,6, +-33,-9, +-35,4, +36,72, +56,53, +205,-42, +106,54, +-28,22, +-48,61, +-104,3, +-9,-16, +69,97, +22,44, +100,31, +37,-11, +24,103, +119,120, +144,-82, +-28,39, +-5,13, +33,-44, +12,-57, +10,17, +-49,-115, +-18,64, +45,1, +19,3, +17,107, +53,-57, +-39,-93, +8,0, +64,-88, +-27,-42, +-33,-27, +-134,90, +84,83, +-10,32, +-41,87, +-22,43, +31,164, +-59,-39, +-62,-128, +-4,124, +64,10, +-158,74, +-47,48, +67,16, +-122,-7, +-38,-88, +57,83, +26,-44, +27,54, +44,-20, +41,33, +41,-4, +-20,-85, +-22,-16, +132,-36, +68,-74, +-24,-2, +-105,-57, +87,5, +74,109, +64,56, +-22,-75, +-11,-89, +105,-102, +-63,105, +-148,40, +60,70, +33,50, +-58,-33, +68,127, +6,45, +31,-95, +-12,32, +18,-19, +29,-35, +-30,67, +11,-118, +51,-29, +-39,-52, +97,-82, +5,-4, +-37,17, +63,80, +73,57, +-3,55, +31,-29, +-81,-8, +89,-1, +33,-8, +8,43, +-77,0, +-44,-34, +7,-91, +25,-19, +-22,62, +2,-2, +24,-104, +18,60, +23,54, +-73,-27, +-50,60, +66,80, +-33,-44, +-17,48, +67,-11, +-47,-11, +95,30, +-83,-82, +52,-17, +-70,51, +33,-41, +61,45, +66,-59, +44,72, +-32,-3, +-74,-19, +0,8, +58,44, +-17,27, +28,40, +-2,-20, +-23,-24, +-45,-137, +7,-72, +15,-16, +-40,39, +21,73, +-27,-85, +59,-44, +-56,-18, +-37,74, +3,-54, +110,-13, +97,66, +-37,-84, +18,21, +-106,2, +-3,39, +12,19, +148,-77, +79,7, +-2,-47, +17,-16, +-29,-26, +41,-23, +61,-30, +27,16, +25,-67, +-38,40, +11,-45, +-55,-42, +-7,1, +1,-17, +-39,-80, +-58,-33, +-95,12, +-28,70, +-19,-10, +61,10, +-78,-41, +73,-19, +6,-41, +48,75, +3,-19, +-43,-28, +-34,77, +-62,-86, +13,11, +-61,7, +47,18, +3,15, +-39,24, +21,-49, +-7,18, +13,-22, +1,-46, +54,26, +-21,-22, +15,61, +-26,-15, +57,-3, +28,55, +49,50, +-15,-36, +-3,-3, +-27,32, +17,9, +27,20, +30,-36, +29,50, +-33,-89, +4,-26, +-3,12, +-72,58, +70,13, +-30,50, +-20,-29, +-14,51, +26,-6, +-21,-24, +26,-37, +9,55, +-5,43, +-19,48, +66,81, +-20,18, +-52,-9, +36,-35, +-25,15, +-38,12, +-9,-64, +-41,-57, +-77,60, +-44,0, +-15,-53, +17,23, +-50,3, +48,-34, +-1,38, +6,-20, +-41,10, +32,0, +55,3, +71,10, +30,-32, +20,8, +16,-38, +25,29, +-49,-49, +-45,54, +-13,-12, +-43,-18, +17,-11, +21,-10, +11,64, +-3,-12, +-15,40, +-7,69, +-12,7, +-12,-40, +42,54, +-39,-21, +-35,21, +15,6, +49,7, +9,-9, +-24,-13, +-32,17, +14,37, +33,-10, +-8,9, +8,46, +-6,23, +1,16, +-26,-7, +3,-21, +-29,-24, +8,-18, +55,-2, +34,15, +-12,31, +-21,24, +5,-19, +31,-17, +10,17, +-11,17, +3,2, +-6,6, +16,43, +40,12, +-30,34, +-12,-8, +34,5, +-28,-7, +-5,-27, +-41,9, +0,16, +11,-29, +-26,5, +-24,-7, +-24,36, +-1,22, +-31,-16, +11,25, +44,-26, +-30,-14, +-4,-39, +-23,-9, +15,-30, +26,-3, +46,1, +-1,-27, +32,5, +2,26, +2,-31, +-21,-3, +-13,-22, +-17,3, +5,7, +-29,-31, +-37,-14, +11,1, +11,5, +-9,3, +-3,3, +-2,12, +-6,-13, +-50,0, +4,-4, +-47,-24, +-12,12, +-12,17, +-20,0, +-25,-15, +11,-22, +-6,22, +25,-5, +-4,-30, +-9,-14, +-3,5, +7,14, +-14,-3, +2,-6, +-4,9, +-14,14, +16,0, +-19,-19, +-16,-8, +-9,11, +-2,-16, +3,-4, +-12,13, +14,-13, +-33,-2, +12,4, +3,-12, +8,-5, +-2,17, +1,15, +-25,-5, +2,9, +-1,-10, +13,-4, +-3,14, +2,20, +0,-3, +6,-6, +-14,2, +-10,-11, +-1,-5, +5,0, +-9,-13, +-3,-7, +-8,16, +3,-1, +1,-4, +2,-4, +-4,9, +12,3, +9,-3, +1,2, +-2,8, +6,-7, +3,2, +5,-3, +12,-3, +-8,-4, +1,-6, +1,-10, +-4,1, +-2,-1, +11,-5, +-4,-4, +4,-3, +8,0, +-8,3, +0,-3, +2,3, +2,6, +1,-6, +2,1, +-3,-1, +7,1, +0,1, +-3,1, +2,1, +5,1, +-6,1, +2,1, +3,0, +-6,1, +3,0, +3,0, +-6,0, +3,0, +3,0, +-6,-1, +3,0, +2,-1, +-6,-1, +5,-1, +2,-1, +-3,-1, +0,-1, +7,-1, +-3,1, +2,-1, +1,6, +2,-6, +2,-3, +0,3, +-8,-3, +8,0, +4,3, +-4,4, +11,5, +-2,1, +-4,-1, +1,10, +1,6, +-8,4, +12,3, +5,3, +3,-2, +6,7, +-2,-8, +1,-2, +9,3, +12,-3, +-4,-9, +2,4, +1,4, +3,1, +-8,-16, +-3,7, +-9,13, +5,0, +-1,5, +-10,11, +-14,-2, +6,6, +0,3, +2,-20, +-3,-14, +13,4, +-1,10, +2,-9, +-25,5, +1,-15, +-2,-17, +8,5, +3,12, +12,-4, +-33,2, +14,13, +-12,-13, +3,4, +-2,16, +-9,-11, +-16,8, +-19,19, +16,0, +-14,-14, +-4,-9, +2,6, +-14,3, +7,-14, +-3,-5, +-9,14, +-4,30, +25,5, +-6,-22, +11,22, +-25,15, +-20,0, +-12,-17, +-12,-12, +-47,24, +4,4, +-50,0, +-6,13, +-2,-12, +-3,-3, +-9,-3, +11,-5, +11,-1, +-37,14, +-29,31, +5,-7, +-17,-3, +-13,22, +-21,3, +2,31, +2,-26, +32,-5, +-1,27, +46,-1, +26,3, +15,30, +-23,9, +-4,39, +-30,14, +44,26, +11,-25, +-31,16, +-1,-22, +-24,-36, +-24,7, +-26,-5, +11,29, +0,-16, +-41,-9, +-5,27, +-28,7, +34,-5, +-12,8, +-30,-34, +40,-12, +16,-43, +-6,-6, +3,-2, +-11,-17, +10,-17, +31,17, +5,19, +-21,-24, +-12,-31, +34,-15, +55,2, +8,18, +-29,24, +3,21, +-26,7, +1,-16, +-6,-23, +8,-46, +-8,-9, +33,10, +14,-37, +-32,-17, +-24,13, +9,9, +49,-7, +15,-6, +-35,-21, +-39,21, +42,-54, +-12,40, +-12,-7, +-7,-69, +-15,-40, +-3,12, +11,-64, +21,10, +17,11, +-43,18, +-13,12, +-45,-54, +-49,49, +25,-29, +16,38, +20,-8, +30,32, +71,-10, +55,-3, +32,0, +-41,-10, +6,20, +-1,-38, +48,34, +-50,-3, +17,-23, +-15,53, +-44,0, +-77,-60, +-41,57, +-9,64, +-38,-12, +-25,-15, +36,35, +-52,9, +-20,-18, +66,-81, +-19,-48, +-5,-43, +9,-55, +26,37, +-21,24, +26,6, +-14,-51, +-20,29, +-30,-50, +70,-13, +-72,-58, +-3,-12, +4,26, +-33,89, +29,-50, +30,36, +27,-20, +17,-9, +-27,-32, +-3,3, +-15,36, +49,-50, +28,-55, +57,3, +-26,15, +15,-61, +-21,22, +54,-26, +1,46, +13,22, +-7,-18, +21,49, +-39,-24, +3,-15, +47,-18, +-61,-7, +13,-11, +-62,86, +-34,-77, +-43,28, +3,19, +48,-75, +6,41, +73,19, +-78,41, +61,-10, +-19,10, +-28,-70, +-95,-12, +-58,33, +-39,80, +1,17, +-7,-1, +-55,42, +11,45, +-38,-40, +25,67, +27,-16, +61,30, +41,23, +-29,26, +17,16, +-2,47, +79,-7, +148,77, +12,-19, +-3,-39, +-106,-2, +18,-21, +-37,84, +97,-66, +110,13, +3,54, +-37,-74, +-56,18, +59,44, +-27,85, +21,-73, +-40,-39, +15,16, +7,72, +-45,137, +-23,24, +-2,20, +28,-40, +-17,-27, +58,-44, +0,-8, +-74,19, +-32,3, +44,-72, +66,59, +61,-45, +33,41, +-70,-51, +52,17, +-83,82, +95,-30, +-47,11, +67,11, +-17,-48, +-33,44, +66,-80, +-50,-60, +-73,27, +23,-54, +18,-60, +24,104, +2,2, +-22,-62, +25,19, +7,91, +-44,34, +-77,0, +8,-43, +33,8, +89,1, +-81,8, +31,29, +-3,-55, +73,-57, +63,-80, +-37,-17, +5,4, +97,82, +-39,52, +51,29, +11,118, +-30,-67, +29,35, +18,19, +-12,-32, +31,95, +6,-45, +68,-127, +-58,33, +33,-50, +60,-70, +-148,-40, +-63,-105, +105,102, +-11,89, +-22,75, +64,-56, +74,-109, +87,-5, +-105,57, +-24,2, +68,74, +132,36, +-22,16, +-20,85, +41,4, +41,-33, +44,20, +27,-54, +26,44, +57,-83, +-38,88, +-122,7, +67,-16, +-47,-48, +-158,-74, +64,-10, +-4,-124, +-62,128, +-59,39, +31,-164, +-22,-43, +-41,-87, +-10,-32, +84,-83, +-134,-90, +-33,27, +-27,42, +64,88, +8,0, +-39,93, +53,57, +17,-107, +19,-3, +45,-1, +-18,-64, +-49,115, +10,-17, +12,57, +33,44, +-5,-13, +-28,-39, +144,82, +119,-120, +24,-103, +37,11, +100,-31, +22,-44, +69,-97, +-9,16, +-104,-3, +-48,-61, +-28,-22, +106,-54, +205,42, +56,-53, +36,-72, +-35,-4, +-33,9, +2,-6, +10,-62, +-13,-60, +-51,33, +2,-109, +118,79, +8,115, +13,-9, +-93,111, +5,85, +-23,-142, +6,-119, +75,52, +-18,18, +-69,-33, +16,-68, +-84,-58, +53,181, +1,-25, +-138,-8, +-35,-80, +-118,-31, +72,-122, +46,77, +82,128, +128,-14, +73,113, +-34,-50, +18,-130, +146,1, +4,12, +-101,-39, +37,29, +-20,84, +55,171, +153,-64, +7,40, +-25,-68, +186,-27, +-103,-110, +-58,-97, +92,-111, +2,-110, +78,-47, +135,-54, +4,14, +47,-13, +-5,34, +-118,49, +-5,-49, +-34,160, +75,94, +-109,-2, +-8,-3, +-18,-127, +36,-93, +54,91, +59,-19, +-42,-44, +-77,-87, +17,19, +-177,61, +-100,-90, +-40,-67, +6,-160, +12,-51, +118,13, +122,-31, +17,-62, +-59,-28, +-97,-75, +-116,70, +115,112, +-105,-83, +60,-24, +-89,101, +-46,72, +-34,-81, +186,-51, +28,29, +-13,-135, +73,65, +-73,36, +122,-6, +36,-103, +37,-22, +-90,106, +17,50, +114,168, +8,-43, +-16,-103, +-42,-159, +58,-48, +60,247, +-109,-66, +96,-27, +-31,8, +152,-89, +-59,50, +-133,58, +-20,-105, +-22,-78, +1,117, +18,1, +108,85, +25,17, +-174,55, +144,21, +-221,92, +58,89, +-67,46, +86,30, +-82,23, +-10,-17, +64,-101, +-61,-226, +90,28, +109,-22, +176,-27, +3,10, +-48,45, +-8,14, +-43,-128, +-114,236, +-75,-119, +-31,165, +-33,-29, +-92,56, +43,-100, +-147,-72, +-26,56, +70,-31, +66,70, +-33,116, +-9,22, +-7,-25, +71,-185, +61,136, +-95,-62, +-31,6, +-135,-34, +222,-30, +204,86, +-124,-46, +-22,-109, +-157,-24, +-73,83, +12,24, +108,-175, +43,52, +-124,-103, +58,34, +7,2, +79,-104, +8,-97, +82,-72, +-37,154, +-167,-19, +73,97, +58,-90, +-105,82, +-79,-27, +56,183, +84,80, +23,-70, +57,-104, +-10,-132, +55,-55, +154,46, +169,-2, +-21,170, +40,137, +-62,80, +47,-11, +184,114, +-122,-65, +-16,-134, +104,48, +91,-49, +86,54, +-37,75, +-155,30, +-83,-153, +-80,213, +46,21, +-76,-16, +-26,84, +68,-160, +-17,-118, +113,-9, +123,-160, +127,-20, +153,129, +94,-62, +106,-18, +-22,-92, +99,-19, +-94,-113, +-45,-123, +-246,-19, +27,70, +67,22, +-88,24, +72,-139, +158,-104, +-12,90, +-4,-88, +-129,-205, +-94,-78, +-76,-96, +55,-18, +178,4, +-22,253, +137,14, +-114,49, +-70,32, +-87,-86, +188,163, +60,20, +-119,-25, +17,4, +152,-80, +134,7, +-50,109, +-148,-22, +-85,115, +-54,-100, +-120,-113, +10,-40, +188,101, +-107,12, +130,-40, +117,43, +-165,19, +77,21, +162,46, +-61,-217, +62,-194, +22,-177, +46,-31, +68,186, +54,74, +-52,5, +83,-9, +226,-151, +-133,-77, +64,-59, +240,-67, +-18,-178, +64,-156, +-15,-63, +-17,89, +-26,-51, +-16,-97, +-187,80, +86,37, +-79,-10, +13,5, +131,-67, +17,-73, +-22,25, +-105,-40, +-113,15, +-22,-32, +-161,-97, +31,222, +84,48, +154,19, +119,-113, +-26,148, +287,21, +109,-83, +-53,116, +-54,166, +-50,-157, +257,96, +-16,131, +96,65, +103,33, +-140,30, +12,159, +-53,-70, +144,-139, +-112,18, +101,-55, +31,-150, +-79,-10, +-36,54, +-101,-56, +-75,-118, +-39,-204, +-122,108, +-18,94, +1,-9, +138,-291, +164,-26, +-129,80, +-283,-121, +41,-53, +-56,92, +231,156, +135,54, +-71,-142, +154,22, +103,95, +45,-252, +8,82, +-145,32, +44,-144, +52,57, +-144,28, +63,-101, +-223,59, +-101,-97, +-36,-59, +-142,-59, +105,46, +144,-65, +117,-166, +51,-65, +48,127, +-109,-102, +9,73, +74,-218, +-53,18, +101,192, +-77,62, +-243,-54, +11,46, +163,-45, +-135,13, +-57,25, +41,-151, +76,34, +47,160, +64,4, +92,-1, +109,-29, +-124,26, +91,11, +43,-190, +-134,176, +16,-211, +-90,203, +-27,-35, +184,-15, +-201,-110, +105,-173, +23,-105, +55,109, +-66,137, +31,-28, +87,-46, +82,-68, +30,29, +68,-54, +-206,87, +-166,73, +-244,-1, +-49,-9, +179,-3, +42,116, +-61,-135, +-248,49, +128,-10, +-2,180, +-7,-55, +-21,-258, +-19,-164, +89,-66, +-236,191, +164,-16, +116,253, +-121,-199, +29,-284, +-155,-191, +-29,-53, +-59,50, +-64,-33, +-92,-12, +23,-186, +-127,-122, +40,77, +-102,-89, +24,137, +-146,49, +-43,33, +19,28, +-204,67, +-191,177, +201,202, +34,180, +49,-150, +4,118, +-53,-105, +-220,88, +156,-224, +-44,-16, +22,-33, +93,64, +-132,215, +116,-8, +-180,178, +53,-39, +106,21, +41,-61, +-59,54, +79,70, +-136,-127, +-21,79, +1,-84, +-170,-76, +183,-63, +10,142, +23,-134, +-8,11, +152,-193, +126,-94, +-38,-5, +-94,106, +138,-54, +92,63, +-138,-99, +184,-201, +-148,82, +-53,-27, +-190,-22, +78,176, +120,-38, +193,53, +-72,-119, +148,204, +-13,-41, +76,-24, +-143,11, +-28,-18, +58,-122, +240,146, +169,-89, +144,-94, +236,26, +-145,103, +-120,32, +129,-65, +-7,190, +-281,84, +-50,41, +72,328, +23,211, +-82,-113, +-61,157, +59,-26, +-4,4, +-107,-162, +179,147, +-112,-9, +4,-2, +105,-253, +-83,-264, +-8,-116, +-102,-18, +57,-176, +-190,29, +172,118, +-122,150, +158,160, +-88,24, +-198,58, +210,-149, +25,-53, +88,76, +143,-12, +249,53, +10,112, +-18,-94, +-53,6, +233,18, +-147,209, +103,-53, +93,-236, +-137,-62, +-29,182, +155,59, +31,-48, +46,-68, +47,-95, +115,83, +214,-41, +14,44, +-37,33, +-62,127, +-137,-12, +-85,33, +6,-211, +60,-280, +153,128, +112,147, +-75,-159, +-110,-48, +96,-20, +100,-101, +-35,143, +105,8, +118,-234, +214,25, +-7,14, +125,4, +-55,56, +-80,-141, +-15,248, +-52,118, +49,25, +54,-53, +-272,112, +190,233, +160,-36, +-10,197, +138,78, +-64,-129, +7,-40, +-227,-91, +-51,239, +-259,22, +-39,-18, +-24,-269, +-124,-112, +-22,-208, +6,-16, +-3,-141, +102,70, +-303,55, +-10,192, +56,6, +-84,33, +-95,188, +-152,224, +10,-29, +41,-122, +7,103, +71,16, +-19,-71, +40,262, +-75,29, +-76,354, +-28,58, +-83,233, +212,96, +67,151, +-297,106, +-1,140, +67,-225, +-17,-5, +-233,-41, +-160,73, +89,4, +68,53, +22,-41, +-76,89, +42,77, +217,-47, +-67,90, +-208,-18, +35,264, +-46,68, +-73,-35, +-8,113, +18,-134, +-1,215, +-93,-40, +33,192, +-91,-215, +-87,-22, +214,-34, +140,117, +36,67, +-36,237, +27,-204, +-162,-26, +218,-38, +264,40, +-55,-103, +-58,33, +-11,98, +-107,221, +-113,-39, +1,-20, +-164,53, +-111,163, +167,8, +177,76, +-298,-133, +90,66, +150,4, +-40,-168, +3,-215, +111,69, +-59,-70, +121,-34, +-137,-51, +-39,-284, +-4,-17, +-118,-20, +-263,44, +-49,-13, +-141,124, +1,-146, +-37,5, +-248,-171, +-87,-80, +155,-42, +-108,-78, +15,259, +198,-115, +-5,-163, +53,-79, +-230,146, +157,-239, +2,-117, +59,-90, +105,176, +34,-339, +120,102, +122,-38, +-48,-18, +123,196, +39,-85, +42,79, +79,-35, +6,0, +146,245, +73,140, +-38,241, +22,-26, +-77,47, +30,-85, +38,86, +121,3, +112,134, +169,97, +-54,139, +-52,159, +-2,-91, +85,128, +-85,-72, +112,-2, +112,-263, +-25,313, +-31,-46, +-279,-128, +268,-53, +146,22, +272,-107, +254,174, +128,-192, +-252,232, +-143,-79, +-15,-107, +-51,-182, +-143,-296, +-47,-147, +110,97, +182,92, +180,32, +195,-2, +105,37, +265,149, +5,-266, +-95,9, +18,-116, +85,-17, +-52,9, +-52,27, +125,-179, +-39,61, +135,-6, +109,107, +-85,122, +136,-219, +46,156, +178,27, +-147,-95, +38,152, +72,152, +37,52, +155,283, +59,-195, +164,-85, +-31,4, +0,43, +149,105, +-64,-2, +-89,-7, +60,-55, +-68,-139, +-22,-39, +43,139, +-132,109, +-42,-156, +-17,-223, +261,4, +52,-91, +-46,-6, +39,-49, +-133,-193, +-117,79, +66,134, +281,297, +-130,-2, +15,146, +243,21, +-12,88, +-202,140, +-214,72, +-130,-142, +-29,-56, +59,11, +-58,270, +-93,119, +212,-292, +187,-136, +-242,-130, +-63,-266, +-235,118, +-28,-141, +179,105, +-214,30, +-65,-87, +-185,7, +53,176, +-26,160, +-123,-47, +133,-88, +147,-122, +108,-115, +118,-87, +60,62, +-8,28, +46,105, +59,87, +-232,243, +116,101, +-17,36, +-117,-105, +80,28, +-107,-57, +-161,234, +-9,-131, +115,156, +166,-43, +-52,-128, +55,-193, +-224,-2, +171,57, +-287,-43, +-178,147, +-81,-2, +-201,-173, +-258,-100, +-113,-56, +-75,-62, +-183,-235, +143,-266, +-158,39, +-137,71, +18,136, +-172,-128, +31,-43, +64,143, +-155,142, +-4,-146, +-11,-27, +183,-3, +76,89, +-160,171, +57,-92, +53,208, +27,-152, +-199,-139, +-61,92, +147,239, +13,-139, +-69,4, +-117,-252, +182,-14, +8,3, +40,201, +79,53, +156,-48, +-105,175, +-34,-197, +107,54, +-181,11, +-78,-103, +4,-53, +-57,58, +14,196, +36,-151, +246,-105, +75,-39, +-232,-50, +-24,222, +-28,59, +25,146, +-182,91, +177,-32, +15,19, +-36,-100, +-105,131, +1,-36, +110,-215, +-26,-119, +-202,-149, +-17,28, +-8,-124, +39,-81, +-72,191, +-66,173, +65,-81, +-61,-106, +-106,40, +-91,-136, +18,173, +345,-93, +44,-249, +216,-6, +196,-2, +-199,12, +166,-98, +47,-60, +-92,146, +130,-192, +-155,87, +127,86, +-118,21, +121,79, +131,74, +-58,-69, +40,136, +-30,59, +-161,-53, +91,-10, +-14,-153, +-24,-264, +-97,119, +46,51, +-171,69, +-147,-9, +-3,199, +25,-350, +-135,246, +188,-21, +-11,-30, +173,76, +115,-161, +-10,-39, +137,148, +-12,220, +-97,-76, +-123,-60, +112,-84, +-43,248, +28,76, +-62,24, +-76,68, +81,-269, +-71,-26, +-260,-194, +207,208, +-165,-102, +-70,121, +-264,-110, +-12,8, +-71,99, +88,36, +-89,128, +10,-95, +266,91, +-122,180, +-129,97, +73,160, +125,-71, +-88,43, +-45,148, +-101,15, +-120,-204, +-142,-21, +-171,80, +45,-121, +36,14, +135,-33, +-118,-92, +-19,-13, +-24,-169, +-185,-87, +93,32, +10,-5, +26,84, +-33,79, +35,-14, +-228,-157, +108,151, +39,71, +-157,-103, +106,213, +-31,120, +144,-128, +227,-86, +20,-6, +100,-186, +66,-94, +174,78, +52,-64, +-71,4, +-40,-129, +31,129, +-4,-53, +-37,-24, +195,10, +-57,-77, +-118,-72, +-96,-141, +-83,133, +-57,98, +-81,-23, +130,-144, +-93,-187, +157,-131, +194,-152, +-116,-143, +-65,-43, +-163,118, +137,-105, +-29,99, +-51,-13, +-113,-221, +-57,83, +131,-135, +-55,29, +-262,-9, +-5,-25, +-127,-31, +-241,62, +-41,-18, +-53,-84, +-60,-214, +106,119, +-41,-18, +106,-41, +-75,135, +-105,-8, +33,109, +104,101, +-10,36, +85,-149, +-33,-5, +-13,-116, +-40,-112, +50,150, +76,-14, +-145,32, +101,129, +-15,169, +-45,-22, +-185,160, +29,120, +-68,171, +-13,-138, +-24,117, +25,308, +159,3, +54,-179, +26,255, +29,-200, +16,37, +6,-6, +-43,121, +92,-62, +-148,-61, +36,-209, +39,185, +-251,-23, +-209,54, +136,48, +-2,81, +-14,-151, +86,94, +12,67, +-18,3, +-49,-168, +-13,1, +138,77, +-139,4, +-25,-106, +-118,-101, +77,-175, +91,-27, +211,-46, +-49,96, +-173,-67, +-225,79, +-119,55, +15,-29, +147,-134, +-45,99, +103,109, +-48,-151, +175,45, +-26,-10, +-124,14, +-37,-36, +-8,-39, +186,-99, +-138,-10, +-45,-73, +5,36, +0,26, +50,48, +71,-66, +-20,-134, +-127,129, +-57,7, +174,-149, +-40,4, +54,119, +150,32, +-62,-11, +110,79, +25,30, +121,21, +-10,-59, +72,-87, +125,32, +-22,101, +78,18, +172,-143, +-91,85, +-63,41, +128,-129, +18,-12, +-212,-53, +20,172, +83,79, +-86,-175, +-7,-213, +-27,100, +-97,35, +33,22, +131,-75, +-88,-145, +-144,-101, +-88,63, +-9,174, +-35,42, +-60,76, +-175,-39, +70,10, +-41,63, +71,-54, +-89,43, +-141,136, +-16,-95, +-169,47, +-98,-126, +93,13, +45,-40, +155,24, +-107,241, +-11,-128, +-131,-12, +30,-125, +148,51, +39,-133, +-65,-42, +-171,-118, +21,-11, +-49,-134, +53,-35, +21,15, +102,-29, +-155,-76, +-82,0, +-104,-134, +-52,-15, +-54,-56, +26,16, +76,-39, +58,-66, +-138,-253, +-85,54, +58,34, +-76,77, +29,4, +-55,-142, +-63,65, +151,-50, +-32,22, +9,75, +-207,63, +72,80, +-24,228, +-55,-49, +-87,186, +63,60, +29,-38, +-53,58, +-39,-189, +60,-141, +114,-7, +-13,-94, +135,-23, +-140,-57, +132,1, +-164,12, +74,-38, +189,88, +17,59, +-11,114, +91,-76, +-22,94, +-47,-84, +-63,-15, +-139,96, +-58,132, +-47,-19, +59,-109, +-31,65, +-138,214, +-49,-73, +140,-83, +88,35, +92,-33, +57,-51, +-39,-85, +22,5, +-13,-97, +15,7, +-34,85, +23,47, +53,-28, +-17,13, +-101,-107, +-45,-57, +48,98, +-4,6, +90,-43, +21,15, +-83,32, +-62,-68, +25,52, +-153,17, +24,52, +40,169, +-131,61, +-4,-25, +146,-105, +103,-61, +-122,44, +-24,30, +148,-161, +74,-49, +-42,-76, +18,-96, +-69,59, +101,33, +-30,-20, +129,72, +49,131, +-5,29, +-35,12, +39,-145, +-35,169, +-115,-119, +51,121, +-105,75, +-139,27, +-41,-11, +-121,-43, +74,9, +88,51, +-8,-29, +189,-133, +13,78, +150,-40, +74,-61, +15,-147, +26,153, +35,-31, +-91,30, +30,-20, +-84,-92, +45,72, +149,-36, +-121,-70, +-67,-59, +-143,-17, +-3,98, +-1,23, +-2,-54, +-104,-59, +1,-32, +-89,-153, +-28,-32, +-13,-10, +-5,105, +-45,-39, +-45,39, +-106,-58, +4,-70, +-121,-115, +-25,82, +-60,95, +36,6, +-177,-35, +75,-125, +39,58, +116,-20, +-47,151, +-67,8, +54,-74, +-149,-76, +82,-103, +31,-33, +16,-80, +30,-27, +-15,123, +14,-115, +26,-16, +-26,-85, +102,-42, +98,10, +57,-45, +-83,-166, +-100,-10, +-49,80, +-27,5, +104,-49, +-8,-9, +-107,-54, +-138,-9, +55,43, +96,-19, +47,-96, +-125,-31, +-4,104, +15,-40, +-1,-56, +-5,88, +-64,95, +100,-22, +37,48, +-87,106, +-28,-19, +12,12, +28,166, +34,-89, +22,74, +-1,71, +91,-3, +7,48, +-112,44, +18,18, +61,-122, +-45,-3, +-98,65, +63,-3, +39,33, +-51,6, +48,-91, +-79,21, +-45,-7, +-8,103, +-36,-82, +-26,-81, +84,32, +-84,25, +-10,91, +39,-71, +43,94, +-41,17, +-62,30, +71,-60, +9,-156, +20,-135, +-23,35, +59,53, +-88,124, +-65,0, +-88,-19, +-50,-106, +-12,40, +60,-41, +-11,67, +-84,-26, +-42,-74, +116,75, +-36,31, +-7,-47, +-7,70, +64,24, +-15,-109, +80,-134, +-32,8, +28,2, +-148,-23, +11,-39, +57,63, +47,-54, +-119,25, +103,36, +-76,-22, +36,70, +-14,64, +112,27, +120,-9, +-42,-31, +-33,4, +227,-45, +-18,-29, +12,-106, +119,70, +66,-15, +-38,-16, +94,-16, +-7,69, +-32,-31, +-27,-43, +-68,57, +-30,-39, +-5,52, +75,50, +13,-14, +70,-31, +-1,-15, +9,-33, +23,98, +-21,-37, +-14,-8, +-123,15, +32,-85, +25,-94, +-27,-39, +-4,-70, +13,-70, +-49,-54, +44,46, +-94,15, +-3,-89, +-38,-34, +-10,42, +62,-27, +-47,34, +26,-140, +-57,14, +-110,81, +-55,34, +-62,38, +-112,-28, +1,33, +85,-70, +-6,-25, +-1,-40, +-74,-83, +-21,22, +-2,28, +-11,44, +0,-35, +-10,12, +51,5, +-113,-50, +41,21, +31,88, +-80,51, +-51,-21, +-4,102, +-62,40, +-47,48, +84,85, +34,-81, +8,14, +23,24, +27,-38, +-10,8, +-52,-63, +55,21, +27,-7, +14,42, +-7,-28, +-34,-6, +-41,-52, +-62,-19, +5,6, +-11,-16, +-46,82, +17,-30, +-7,-40, +-15,-72, +-49,-58, +-26,-14, +70,-51, +17,-14, +-10,45, +14,34, +104,-77, +33,6, +19,41, +32,45, +-38,-26, +80,-22, +21,47, +-28,-73, +23,-42, +-40,-104, +63,48, +-35,-53, +47,9, +-125,-67, +-7,-1, +-36,31, +28,-52, +55,-24, +28,63, +51,-33, +-91,-10, +7,-37, +79,0, +50,15, +-39,53, +5,7, +-42,34, +9,87, +63,-47, +-65,34, +56,-15, +-71,-17, +69,-37, +1,-43, +37,-31, +-2,21, +-34,-49, +-86,23, +-12,3, +17,-20, +-1,-37, +23,13, +34,14, +-26,0, +35,50, +36,17, +3,-77, +3,91, +23,-64, +-61,2, +55,61, +-34,-37, +-54,22, +74,20, +-46,52, +-84,73, +19,30, +-8,67, +11,-54, +-24,-44, +-11,18, +-33,-18, +51,-1, +62,-12, +-31,-18, +-28,33, +-6,-33, +-16,-43, +-73,-10, +-26,27, +-19,6, +6,-28, +34,-25, +-59,38, +26,-2, +35,9, +-3,-48, +68,35, +20,-35, +8,-43, +-18,9, +-31,63, +-23,29, +16,-31, +63,19, +-54,-10, +-17,-43, +34,0, +-47,-16, +16,5, +-6,-6, +15,-1, +5,54, +42,-8, +26,11, +-52,26, +7,7, +-69,-60, +17,35, +37,29, +22,-31, +-39,-23, +-2,-10, +-14,23, +48,-5, +-9,-6, +32,-13, +20,48, +-39,29, +-5,-60, +18,20, +34,1, +-13,-28, +-16,21, +7,-36, +44,-35, +-20,14, +-35,-28, +-53,-1, +-24,-22, +9,-31, +-37,-50, +-31,-29, +13,-26, +6,-48, +12,-9, +1,-38, +-2,28, +-29,-40, +-37,17, +14,19, +-9,31, +29,-9, +-16,-31, +38,-2, +-23,-12, +-10,-2, +4,2, +27,-12, +22,5, +38,-26, +1,21, +11,6, +9,-4, +-10,25, +-29,23, +-8,18, +-20,16, +-9,-2, +30,-22, +29,8, +-9,0, +-1,-61, +5,21, +-8,-4, +24,-8, +-32,-3, +-4,-49, +-26,-5, +-36,16, +-15,25, +0,-4, +34,-13, +20,8, +-30,-1, +-4,-19, +7,-25, +14,-31, +12,6, +12,24, +-2,0, +25,-3, +11,14, +36,27, +-6,-26, +-12,-11, +-11,4, +-3,-5, +0,6, +-14,23, +-12,13, +-21,-26, +7,5, +22,-4, +-9,-8, +-14,7, +-2,-6, +-4,-7, +2,3, +6,2, +10,6, +-3,2, +-14,1, +3,20, +-4,2, +28,8, +7,8, +0,-4, +10,0, +-3,-3, +-4,22, +14,-7, +-16,4, +12,7, +16,3, +-20,7, +3,0, +2,1, +-6,-4, +0,4, +5,3, +-20,-8, +4,4, +-1,10, +3,12, +1,5, +2,13, +3,8, +4,4, +-4,0, +-16,-8, +-9,-3, +-2,2, +-2,-9, +-2,-7, +13,3, +-13,11, +6,7, +3,11, +-9,0, +-2,1, +7,-9, +-6,3, +6,4, +-5,-1, +-2,2, +2,0, +4,1, +-5,-1, +7,0, +4,1, +-5,3, +5,1, +2,1, +-5,0, +2,0, +3,-1, +-5,0, +4,0, +3,0, +-6,0, +3,0, +4,0, +-5,0, +3,1, +2,0, +-5,0, +2,-1, +5,-1, +-5,-3, +4,-1, +7,0, +-5,1, +4,-1, +2,0, +-2,-2, +-5,1, +6,-4, +-6,-3, +7,9, +-2,-1, +-9,0, +3,-11, +6,-7, +-13,-11, +13,-3, +-2,7, +-2,9, +-2,-2, +-9,3, +-16,8, +-4,0, +4,-4, +3,-8, +2,-13, +1,-5, +3,-12, +-1,-10, +4,-4, +-20,8, +5,-3, +0,-4, +-6,4, +2,-1, +3,0, +-20,-7, +16,-3, +12,-7, +-16,-4, +14,7, +-4,-22, +-3,3, +10,0, +0,4, +7,-8, +28,-8, +-4,-2, +3,-20, +-14,-1, +-3,-2, +10,-6, +6,-2, +2,-3, +-4,7, +-2,6, +-14,-7, +-9,8, +22,4, +7,-5, +-21,26, +-12,-13, +-14,-23, +0,-6, +-3,5, +-11,-4, +-12,11, +-6,26, +36,-27, +11,-14, +25,3, +-2,0, +12,-24, +12,-6, +14,31, +7,25, +-4,19, +-30,1, +20,-8, +34,13, +0,4, +-15,-25, +-36,-16, +-26,5, +-4,49, +-32,3, +24,8, +-8,4, +5,-21, +-1,61, +-9,0, +29,-8, +30,22, +-9,2, +-20,-16, +-8,-18, +-29,-23, +-10,-25, +9,4, +11,-6, +1,-21, +38,26, +22,-5, +27,12, +4,-2, +-10,2, +-23,12, +38,2, +-16,31, +29,9, +-9,-31, +14,-19, +-37,-17, +-29,40, +-2,-28, +1,38, +12,9, +6,48, +13,26, +-31,29, +-37,50, +9,31, +-24,22, +-53,1, +-35,28, +-20,-14, +44,35, +7,36, +-16,-21, +-13,28, +34,-1, +18,-20, +-5,60, +-39,-29, +20,-48, +32,13, +-9,6, +48,5, +-14,-23, +-2,10, +-39,23, +22,31, +37,-29, +17,-35, +-69,60, +7,-7, +-52,-26, +26,-11, +42,8, +5,-54, +15,1, +-6,6, +16,-5, +-47,16, +34,0, +-17,43, +-54,10, +63,-19, +16,31, +-23,-29, +-31,-63, +-18,-9, +8,43, +20,35, +68,-35, +-3,48, +35,-9, +26,2, +-59,-38, +34,25, +6,28, +-19,-6, +-26,-27, +-73,10, +-16,43, +-6,33, +-28,-33, +-31,18, +62,12, +51,1, +-33,18, +-11,-18, +-24,44, +11,54, +-8,-67, +19,-30, +-84,-73, +-46,-52, +74,-20, +-54,-22, +-34,37, +55,-61, +-61,-2, +23,64, +3,-91, +3,77, +36,-17, +35,-50, +-26,0, +34,-14, +23,-13, +-1,37, +17,20, +-12,-3, +-86,-23, +-34,49, +-2,-21, +37,31, +1,43, +69,37, +-71,17, +56,15, +-65,-34, +63,47, +9,-87, +-42,-34, +5,-7, +-39,-53, +50,-15, +79,0, +7,37, +-91,10, +51,33, +28,-63, +55,24, +28,52, +-36,-31, +-7,1, +-125,67, +47,-9, +-35,53, +63,-48, +-40,104, +23,42, +-28,73, +21,-47, +80,22, +-38,26, +32,-45, +19,-41, +33,-6, +104,77, +14,-34, +-10,-45, +17,14, +70,51, +-26,14, +-49,58, +-15,72, +-7,40, +17,30, +-46,-82, +-11,16, +5,-6, +-62,19, +-41,52, +-34,6, +-7,28, +14,-42, +27,7, +55,-21, +-52,63, +-10,-8, +27,38, +23,-24, +8,-14, +34,81, +84,-85, +-47,-48, +-62,-40, +-4,-102, +-51,21, +-80,-51, +31,-88, +41,-21, +-113,50, +51,-5, +-10,-12, +0,35, +-11,-44, +-2,-28, +-21,-22, +-74,83, +-1,40, +-6,25, +85,70, +1,-33, +-112,28, +-62,-38, +-55,-34, +-110,-81, +-57,-14, +26,140, +-47,-34, +62,27, +-10,-42, +-38,34, +-3,89, +-94,-15, +44,-46, +-49,54, +13,70, +-4,70, +-27,39, +25,94, +32,85, +-123,-15, +-14,8, +-21,37, +23,-98, +9,33, +-1,15, +70,31, +13,14, +75,-50, +-5,-52, +-30,39, +-68,-57, +-27,43, +-32,31, +-7,-69, +94,16, +-38,16, +66,15, +119,-70, +12,106, +-18,29, +227,45, +-33,-4, +-42,31, +120,9, +112,-27, +-14,-64, +36,-70, +-76,22, +103,-36, +-119,-25, +47,54, +57,-63, +11,39, +-148,23, +28,-2, +-32,-8, +80,134, +-15,109, +64,-24, +-7,-70, +-7,47, +-36,-31, +116,-75, +-42,74, +-84,26, +-11,-67, +60,41, +-12,-40, +-50,106, +-88,19, +-65,0, +-88,-124, +59,-53, +-23,-35, +20,135, +9,156, +71,60, +-62,-30, +-41,-17, +43,-94, +39,71, +-10,-91, +-84,-25, +84,-32, +-26,81, +-36,82, +-8,-103, +-45,7, +-79,-21, +48,91, +-51,-6, +39,-33, +63,3, +-98,-65, +-45,3, +61,122, +18,-18, +-112,-44, +7,-48, +91,3, +-1,-71, +22,-74, +34,89, +28,-166, +12,-12, +-28,19, +-87,-106, +37,-48, +100,22, +-64,-95, +-5,-88, +-1,56, +15,40, +-4,-104, +-125,31, +47,96, +96,19, +55,-43, +-138,9, +-107,54, +-8,9, +104,49, +-27,-5, +-49,-80, +-100,10, +-83,166, +57,45, +98,-10, +102,42, +-26,85, +26,16, +14,115, +-15,-123, +30,27, +16,80, +31,33, +82,103, +-149,76, +54,74, +-67,-8, +-47,-151, +116,20, +39,-58, +75,125, +-177,35, +36,-6, +-60,-95, +-25,-82, +-121,115, +4,70, +-106,58, +-45,-39, +-45,39, +-5,-105, +-13,10, +-28,32, +-89,153, +1,32, +-104,59, +-2,54, +-1,-23, +-3,-98, +-143,17, +-67,59, +-121,70, +149,36, +45,-72, +-84,92, +30,20, +-91,-30, +35,31, +26,-153, +15,147, +74,61, +150,40, +13,-78, +189,133, +-8,29, +88,-51, +74,-9, +-121,43, +-41,11, +-139,-27, +-105,-75, +51,-121, +-115,119, +-35,-169, +39,145, +-35,-12, +-5,-29, +49,-131, +129,-72, +-30,20, +101,-33, +-69,-59, +18,96, +-42,76, +74,49, +148,161, +-24,-30, +-122,-44, +103,61, +146,105, +-4,25, +-131,-61, +40,-169, +24,-52, +-153,-17, +25,-52, +-62,68, +-83,-32, +21,-15, +90,43, +-4,-6, +48,-98, +-45,57, +-101,107, +-17,-13, +53,28, +23,-47, +-34,-85, +15,-7, +-13,97, +22,-5, +-39,85, +57,51, +92,33, +88,-35, +140,83, +-49,73, +-138,-214, +-31,-65, +59,109, +-47,19, +-58,-132, +-139,-96, +-63,15, +-47,84, +-22,-94, +91,76, +-11,-114, +17,-59, +189,-88, +74,38, +-164,-12, +132,-1, +-140,57, +135,23, +-13,94, +114,7, +60,141, +-39,189, +-53,-58, +29,38, +63,-60, +-87,-186, +-55,49, +-24,-228, +72,-80, +-207,-63, +9,-75, +-32,-22, +151,50, +-63,-65, +-55,142, +29,-4, +-76,-77, +58,-34, +-85,-54, +-138,253, +58,66, +76,39, +26,-16, +-54,56, +-52,15, +-104,134, +-82,0, +-155,76, +102,29, +21,-15, +53,35, +-49,134, +21,11, +-171,118, +-65,42, +39,133, +148,-51, +30,125, +-131,12, +-11,128, +-107,-241, +155,-24, +45,40, +93,-13, +-98,126, +-169,-47, +-16,95, +-141,-136, +-89,-43, +71,54, +-41,-63, +70,-10, +-175,39, +-60,-76, +-35,-42, +-9,-174, +-88,-63, +-144,101, +-88,145, +131,75, +33,-22, +-97,-35, +-27,-100, +-7,213, +-86,175, +83,-79, +20,-172, +-212,53, +18,12, +128,129, +-63,-41, +-91,-85, +172,143, +78,-18, +-22,-101, +125,-32, +72,87, +-10,59, +121,-21, +25,-30, +110,-79, +-62,11, +150,-32, +54,-119, +-40,-4, +174,149, +-57,-7, +-127,-129, +-20,134, +71,66, +50,-48, +0,-26, +5,-36, +-45,73, +-138,10, +186,99, +-8,39, +-37,36, +-124,-14, +-26,10, +175,-45, +-48,151, +103,-109, +-45,-99, +147,134, +15,29, +-119,-55, +-225,-79, +-173,67, +-49,-96, +211,46, +91,27, +77,175, +-118,101, +-25,106, +-139,-4, +138,-77, +-13,-1, +-49,168, +-18,-3, +12,-67, +86,-94, +-14,151, +-2,-81, +136,-48, +-209,-54, +-251,23, +39,-185, +36,209, +-148,61, +92,62, +-43,-121, +6,6, +16,-37, +29,200, +26,-255, +54,179, +159,-3, +25,-308, +-24,-117, +-13,138, +-68,-171, +29,-120, +-185,-160, +-45,22, +-15,-169, +101,-129, +-145,-32, +76,14, +50,-150, +-40,112, +-13,116, +-33,5, +85,149, +-10,-36, +104,-101, +33,-109, +-105,8, +-75,-135, +106,41, +-41,18, +106,-119, +-60,214, +-53,84, +-41,18, +-241,-62, +-127,31, +-5,25, +-262,9, +-55,-29, +131,135, +-57,-83, +-113,221, +-51,13, +-29,-99, +137,105, +-163,-118, +-65,43, +-116,143, +194,152, +157,131, +-93,187, +130,144, +-81,23, +-57,-98, +-83,-133, +-96,141, +-118,72, +-57,77, +195,-10, +-37,24, +-4,53, +31,-129, +-40,129, +-71,-4, +52,64, +174,-78, +66,94, +100,186, +20,6, +227,86, +144,128, +-31,-120, +106,-213, +-157,103, +39,-71, +108,-151, +-228,157, +35,14, +-33,-79, +26,-84, +10,5, +93,-32, +-185,87, +-24,169, +-19,13, +-118,92, +135,33, +36,-14, +45,121, +-171,-80, +-142,21, +-120,204, +-101,-15, +-45,-148, +-88,-43, +125,71, +73,-160, +-129,-97, +-122,-180, +266,-91, +10,95, +-89,-128, +88,-36, +-71,-99, +-12,-8, +-264,110, +-70,-121, +-165,102, +207,-208, +-260,194, +-71,26, +81,269, +-76,-68, +-62,-24, +28,-76, +-43,-248, +112,84, +-123,60, +-97,76, +-12,-220, +137,-148, +-10,39, +115,161, +173,-76, +-11,30, +188,21, +-135,-246, +25,350, +-3,-199, +-147,9, +-171,-69, +46,-51, +-97,-119, +-24,264, +-14,153, +91,10, +-161,53, +-30,-59, +40,-136, +-58,69, +131,-74, +121,-79, +-118,-21, +127,-86, +-155,-87, +130,192, +-92,-146, +47,60, +166,98, +-199,-12, +196,2, +216,6, +44,249, +345,93, +18,-173, +-91,136, +-106,-40, +-61,106, +65,81, +-66,-173, +-72,-191, +39,81, +-8,124, +-17,-28, +-202,149, +-26,119, +110,215, +1,36, +-105,-131, +-36,100, +15,-19, +177,32, +-182,-91, +25,-146, +-28,-59, +-24,-222, +-232,50, +75,39, +246,105, +36,151, +14,-196, +-57,-58, +4,53, +-78,103, +-181,-11, +107,-54, +-34,197, +-105,-175, +156,48, +79,-53, +40,-201, +8,-3, +182,14, +-117,252, +-69,-4, +13,139, +147,-239, +-61,-92, +-199,139, +27,152, +53,-208, +57,92, +-160,-171, +76,-89, +183,3, +-11,27, +-4,146, +-155,-142, +64,-143, +31,43, +-172,128, +18,-136, +-137,-71, +-158,-39, +143,266, +-183,235, +-75,62, +-113,56, +-258,100, +-201,173, +-81,2, +-178,-147, +-287,43, +171,-57, +-224,2, +55,193, +-52,128, +166,43, +115,-156, +-9,131, +-161,-234, +-107,57, +80,-28, +-117,105, +-17,-36, +116,-101, +-232,-243, +59,-87, +46,-105, +-8,-28, +60,-62, +118,87, +108,115, +147,122, +133,88, +-123,47, +-26,-160, +53,-176, +-185,-7, +-65,87, +-214,-30, +179,-105, +-28,141, +-235,-118, +-63,266, +-242,130, +187,136, +212,292, +-93,-119, +-58,-270, +59,-11, +-29,56, +-130,142, +-214,-72, +-202,-140, +-12,-88, +243,-21, +15,-146, +-130,2, +281,-297, +66,-134, +-117,-79, +-133,193, +39,49, +-46,6, +52,91, +261,-4, +-17,223, +-42,156, +-132,-109, +43,-139, +-22,39, +-68,139, +60,55, +-89,7, +-64,2, +149,-105, +0,-43, +-31,-4, +164,85, +59,195, +155,-283, +37,-52, +72,-152, +38,-152, +-147,95, +178,-27, +46,-156, +136,219, +-85,-122, +109,-107, +135,6, +-39,-61, +125,179, +-52,-27, +-52,-9, +85,17, +18,116, +-95,-9, +5,266, +265,-149, +105,-37, +195,2, +180,-32, +182,-92, +110,-97, +-47,147, +-143,296, +-51,182, +-15,107, +-143,79, +-252,-232, +128,192, +254,-174, +272,107, +146,-22, +268,53, +-279,128, +-31,46, +-25,-313, +112,263, +112,2, +-85,72, +85,-128, +-2,91, +-52,-159, +-54,-139, +169,-97, +112,-134, +121,-3, +38,-86, +30,85, +-77,-47, +22,26, +-38,-241, +73,-140, +146,-245, +11,0, +109,18, +77,126, +-128,73, +86,-14, +-70,129, +57,213, +-20,153, +83,-282, +-52,67, +-192,-76, +70,196, +144,-26, +52,-28, +-141,100, +211,-112, +249,15, +-214,-49, +10,14, +1,-76, +30,-188, +-47,-107, +331,36, +-208,3, +203,23, +-43,-30, +150,-130, +-78,187, +-88,-70, +-134,111, +-89,159, +-42,-2, +-113,85, +25,150, +183,-33, +12,-8, +-116,95, +-49,-236, +-105,127, +68,20, +-39,224, +64,104, +198,-100, +280,-208, +-30,58, +-103,130, +-70,8, +-13,-260, +32,-135, +10,314, +-55,-30, +-53,122, +132,-31, +193,63, +-111,-17, +-177,20, +61,-15, +157,293, +77,-104, +115,70, +90,48, +-141,-13, +116,-37, +115,40, +208,-195, +-280,-73, +100,-198, +-191,-160, +-163,19, +120,-225, +-98,229, +9,18, +-244,107, +-35,246, +-132,-186, +11,8, +74,178, +18,137, +162,-151, +-121,80, +-139,-65, +4,58, +147,129, +-46,-86, +-45,-100, +-86,-55, +-104,-98, +-102,-123, +71,-50, +116,76, +39,-85, +14,-208, +-34,2, +11,-105, +-130,194, +-25,-239, +35,-23, +-96,41, +153,-130, +32,137, +59,-72, +-113,81, +189,234, +42,-202, +39,20, +242,39, +171,110, +-32,114, +-28,46, +-151,-101, +-19,-109, +28,43, +22,-124, +-313,39, +161,102, +127,63, +-102,11, +112,-91, +61,73, +12,46, +115,-191, +84,48, +162,-214, +203,304, +41,-40, +-50,144, +-135,-320, +10,152, +-119,-60, +-92,-281, +-187,0, +-78,-143, +17,31, +47,-93, +37,95, +64,146, +65,119, +-109,25, +-3,-124, +-21,93, +-264,-240, +51,23, +-27,-25, +-94,257, +44,172, +-132,192, +-122,71, +-283,-49, +106,39, +-31,-30, +218,-64, +-265,54, +50,21, +79,-65, +130,-11, +-28,-139, +23,-42, +222,86, +-74,-90, +-234,16, +-123,107, +332,75, +-56,-221, +-112,88, +133,-155, +29,-33, +-65,-80, +128,68, +-22,-6, +117,-74, +144,30, +2,163, +-216,-51, +26,9, +111,-20, +-29,54, +-97,104, +17,91, +-292,81, +-96,15, +113,18, +-40,22, +-65,-213, +77,131, +-224,152, +-3,-109, +-62,259, +89,-112, +166,-55, +-10,-110, +-98,122, +-49,79, +-190,159, +-2,-48, +78,133, +65,147, +-86,138, +-175,-158, +-49,-167, +-45,48, +97,-33, +-182,-1, +93,-170, +-64,-173, +144,210, +161,13, +-176,-121, +-20,-54, +-83,164, +-149,-217, +96,42, +25,-101, +-49,-76, +81,-219, +56,-28, +244,109, +82,-41, +109,-83, +-107,-59, +-74,-225, +-138,192, +20,141, +6,-40, +-160,-109, +2,-78, +-67,-50, +-5,-60, +101,-135, +-92,-103, +57,-79, +187,41, +29,186, +43,-119, +-124,-88, +-174,-93, +93,258, +-80,-96, +85,-207, +71,-90, +49,117, +-99,19, +-65,-255, +-53,-354, +-107,-16, +49,112, +-126,241, +-29,27, +78,213, +-124,-32, +-63,-23, +195,122, +-13,171, +-61,35, +127,-140, +137,37, +-97,-10, +-36,-39, +-241,156, +86,-48, +-162,20, +-34,111, +-188,124, +68,193, +-68,13, +-170,-195, +-31,-166, +-4,-179, +34,-61, +73,130, +179,54, +-106,108, +-194,8, +-3,65, +-44,31, +38,-97, +145,96, +97,-50, +-260,-3, +87,52, +59,-53, +-12,68, +-97,-28, +247,45, +13,-11, +60,-16, +18,-104, +171,-2, +-176,-22, +-137,12, +4,90, +105,42, +76,299, +78,185, +153,-14, +-170,44, +53,-130, +-65,33, +-135,20, +-46,-73, +-116,-66, +-64,-14, +17,214, +-76,157, +14,-5, +76,34, +63,-9, +185,-67, +-13,-154, +244,-15, +58,-288, +-80,101, +58,168, +140,-128, +45,36, +-163,29, +-9,-164, +-29,-61, +91,-7, +97,-33, +11,59, +157,-25, +-187,70, +-231,-235, +17,-177, +-10,97, +-104,143, +77,33, +307,64, +-206,-140, +-81,215, +-47,34, +-178,-108, +36,-159, +-159,-39, +-155,-51, +-17,23, +37,-27, +49,-277, +-5,145, +-111,112, +23,-136, +149,-74, +149,151, +42,-21, +96,-39, +163,10, +-58,-123, +25,178, +77,-147, +-133,-109, +20,83, +-98,116, +18,-19, +43,41, +-73,67, +80,-15, +-183,-104, +115,33, +65,93, +30,139, +-156,-91, +-109,-68, +-62,-52, +1,-54, +52,48, +215,-90, +-2,-186, +37,-132, +-100,-20, +-32,-3, +-128,83, +173,78, +45,25, +63,6, +-63,190, +1,46, +-4,150, +69,50, +15,314, +2,81, +45,191, +-38,-11, +53,-221, +133,18, +78,-41, +-16,201, +213,5, +-119,-1, +154,125, +-5,0, +138,-45, +52,119, +75,-92, +29,-110, +19,-108, +7,40, +209,4, +28,220, +53,53, +87,-36, +110,138, +-182,-114, +-5,-23, +110,113, +99,38, +-140,113, +-6,3, +-41,-144, +-18,119, +-133,-150, +67,40, +127,206, +-46,77, +74,20, +193,21, +106,-146, +-22,17, +-144,82, +174,31, +-34,51, +-112,20, +18,11, +-92,12, +-155,6, +-232,-82, +56,14, +56,-68, +-68,201, +223,95, +119,-85, +-82,-71, +100,-85, +71,189, +38,89, +29,140, +-17,140, +122,66, +-2,-180, +10,-84, +70,121, +119,149, +164,-104, +-69,19, +-22,47, +88,17, +60,-1, +208,67, +-4,-157, +55,75, +185,-129, +-43,-32, +23,13, +125,81, +59,-3, +168,-1, +5,163, +-63,-87, +-39,234, +-158,117, +22,-137, +76,84, +-102,-70, +23,136, +-4,25, +56,31, +39,3, +39,-43, +42,60, +153,56, +-148,-151, +42,49, +14,-153, +64,-66, +100,-93, +97,-229, +0,154, +-43,67, +166,-68, +87,-44, +-6,-65, +-43,103, +-51,-85, +-43,45, +47,-47, +-64,44, +-15,-26, +-34,-50, +-38,95, +152,7, +-57,29, +-83,167, +-60,129, +-98,-117, +-57,71, +-110,92, +-199,5, +-55,140, +198,53, +61,78, +-35,-48, +21,49, +-128,-9, +-69,-149, +12,46, +-92,-5, +-135,-37, +8,109, +-6,-58, +-103,216, +-5,-103, +-217,24, +-43,-17, +-118,-62, +-13,-208, +-38,16, +91,-196, +-86,-31, +241,36, +-80,-64, +-2,-112, +73,-46, +-68,-37, +-58,-83, +-48,-35, +39,-83, +10,7, +-32,106, +194,99, +-1,7, +72,-181, +118,-147, +-36,-38, +-3,-48, +66,-123, +154,-63, +43,32, +28,-16, +19,107, +28,-76, +-47,-84, +-14,68, +70,-56, +-91,-15, +49,-13, +-28,-71, +62,-20, +-141,142, +-28,72, +133,15, +-30,-21, +-17,90, +-190,88, +-90,44, +23,68, +-165,-82, +38,37, +-30,-30, +42,142, +24,10, +-59,5, +45,68, +80,40, +-29,-93, +152,46, +-144,-14, +20,-5, +102,-22, +57,-163, +137,8, +-49,58, +96,-1, +-6,193, +17,46, +75,-41, +-97,97, +-5,37, +-84,67, +39,84, +-84,24, +67,175, +13,20, +20,-48, +-3,22, +-11,50, +23,152, +170,35, +-90,-9, +-155,53, +58,9, +143,81, +38,-39, +161,24, +57,131, +16,-27, +-127,7, +-16,100, +73,89, +83,56, +81,-26, +-133,30, +32,-87, +-9,-241, +-34,36, +47,-36, +30,-102, +-30,48, +93,22, +54,7, +-63,-109, +8,127, +-66,149, +10,4, +132,30, +80,52, +11,40, +29,-38, +-119,-100, +68,58, +-50,-72, +4,-52, +162,28, +-6,131, +-48,-71, +55,-53, +-59,8, +58,116, +68,-9, +42,71, +121,79, +-44,80, +-50,-49, +-99,50, +-1,53, +-12,35, +44,46, +-6,124, +22,-94, +69,136, +6,-26, +22,74, +161,42, +-166,71, +-58,34, +17,9, +21,-17, +184,26, +84,21, +142,9, +-10,35, +134,-29, +42,-9, +44,-15, +12,117, +46,4, +41,20, +29,-102, +-40,3, +-79,-44, +-104,76, +-58,56, +-4,91, +26,-25, +-74,-37, +-58,-66, +20,-78, +-9,-29, +117,114, +15,-27, +-85,8, +-8,-84, +80,74, +-31,-38, +12,-10, +96,42, +7,-123, +-74,26, +15,13, +-65,-21, +86,29, +-65,48, +-53,71, +67,31, +32,76, +-44,96, +-50,-7, +71,-29, +7,-36, +-40,32, +-113,56, +41,-56, +11,-81, +-82,-21, +-51,-104, +-72,13, +44,-54, +41,-123, +53,28, +-99,39, +95,108, +85,-60, +-8,-22, +-51,11, +-101,-114, +-63,-89, +116,24, +-62,98, +-1,-21, +46,53, +-102,52, +-49,-101, +38,-14, +-49,1, +3,64, +63,35, +8,-30, +-46,26, +-126,82, +14,97, +-77,-36, +-2,128, +28,23, +-2,-52, +64,44, +115,-37, +12,-51, +-80,6, +13,-82, +-2,-54, +-32,16, +30,-62, +-75,13, +43,-3, +106,84, +75,20, +98,42, +-7,28, +11,-104, +18,-35, +-38,24, +-20,76, +-25,-49, +10,86, +-5,40, +31,16, +-26,-57, +30,79, +-9,-24, +-6,-45, +20,-24, +-24,111, +24,-2, +-27,-16, +28,-6, +43,-73, +-13,-58, +81,70, +23,68, +-24,-39, +-55,44, +-103,-30, +-62,-88, +7,5, +57,-9, +86,-34, +27,-83, +-6,36, +31,-94, +-3,23, +36,-96, +-15,-15, +-19,68, +0,41, +-34,-42, +87,37, +65,39, +-46,-16, +31,-25, +37,-2, +66,-4, +30,-17, +109,-39, +-56,11, +-117,-43, +-94,-35, +-7,-13, +49,-4, +-18,48, +-114,-1, +11,28, +42,-38, +28,-7, +-102,-59, +22,-24, +19,77, +36,23, +-20,14, +-63,22, +-26,-29, +-30,29, +-25,1, +-15,-65, +-46,7, +-21,-24, +76,-14, +21,1, +-20,-73, +-76,-7, +4,17, +-11,59, +5,31, +25,84, +-76,-24, +-75,-4, +57,38, +-86,-19, +3,-11, +15,-26, +0,-52, +-63,8, +48,3, +15,49, +-19,33, +-56,-62, +-31,39, +32,-40, +-16,19, +-43,-21, +-40,-55, +22,-34, +75,32, +1,24, +33,-27, +3,-10, +54,-59, +20,-14, +-13,19, +-63,13, +51,40, +-26,16, +51,-76, +15,17, +7,-29, +3,-14, +-51,14, +28,11, +17,-36, +-4,-43, +43,-43, +28,6, +2,-19, +12,28, +-18,7, +11,-49, +17,-17, +29,60, +-25,6, +-10,23, +25,5, +-5,2, +-57,7, +32,20, +-48,-17, +-9,-2, +-3,41, +36,29, +-11,-108, +2,4, +-2,57, +-4,-1, +-17,-10, +-30,39, +4,30, +4,-38, +-1,23, +-1,-44, +-7,67, +-6,-18, +7,-40, +6,-59, +37,16, +60,-36, +24,-3, +37,17, +-46,-40, +3,-9, +-32,-25, +11,-12, +-13,2, +26,-5, +40,17, +6,13, +1,8, +-27,1, +18,-17, +-50,-26, +-24,-41, +-7,0, +-16,-14, +14,-16, +-59,-21, +72,24, +-9,25, +17,31, +-43,34, +7,-4, +-15,13, +11,27, +8,-14, +-27,10, +27,23, +27,-5, +-20,-6, +8,-36, +-10,24, +-17,-8, +-11,-21, +6,-18, +13,10, +23,22, +16,32, +-28,18, +14,7, +-3,10, +25,17, +13,-27, +-26,32, +25,7, +-12,-2, +-23,-6, +12,3, +-26,-15, +27,-14, +-22,15, +-23,-10, +-10,4, +7,25, +-2,2, +-23,-13, +-7,-11, +-8,-10, +-21,-16, +3,9, +7,8, +4,4, +10,-18, +-15,-7, +2,3, +6,23, +26,-4, +-8,-2, +-2,2, +4,-27, +26,-4, +10,-20, +-8,11, +21,-8, +-34,-7, +-5,-10, +-6,-20, +-34,14, +3,-17, +-4,33, +-8,4, +4,-12, +8,3, +-10,19, +16,1, +2,12, +15,13, +-6,-22, +1,-9, +1,20, +7,7, +-7,-6, +19,2, +4,-2, +3,-1, +-21,7, +-6,-9, +19,-12, +-4,9, +-12,9, +-4,15, +4,7, +9,-3, +15,-4, +-12,7, +4,-13, +-4,-6, +0,8, +3,2, +4,2, +3,1, +5,-9, +4,-3, +3,-1, +5,-10, +-4,0, +4,4, +-5,5, +-1,-7, +4,13, +-2,-6, +-3,6, +-4,2, +-4,-2, +0,-3, +1,4, +-4,-3, +2,6, +-1,4, +0,-8, +1,6, +0,5, +3,-8, +-3,0, +0,6, +0,-5, +3,0, +1,6, +0,-6, +0,0, +0,5, +0,-5, +0,0, +0,5, +0,-5, +0,0, +0,6, +1,-6, +3,0, +0,5, +0,-6, +-3,0, +3,8, +0,-5, +1,-6, +0,8, +-1,-4, +2,-6, +-4,3, +1,-4, +0,3, +-4,2, +-4,-2, +-3,-6, +-2,6, +4,-13, +-1,7, +-5,-5, +4,-4, +-4,0, +5,10, +3,1, +4,3, +5,9, +3,-1, +4,-2, +3,-2, +0,-8, +-4,6, +4,13, +-12,-7, +15,4, +9,3, +4,-7, +-4,-15, +-12,-9, +-4,-9, +19,12, +-6,9, +-21,-7, +3,1, +4,2, +19,-2, +-7,6, +7,-7, +1,-20, +1,9, +-6,22, +15,-13, +2,-12, +16,-1, +-10,-19, +8,-3, +4,12, +-8,-4, +-4,-33, +3,17, +-34,-14, +-6,20, +-5,10, +-34,7, +21,8, +-8,-11, +10,20, +26,4, +4,27, +-2,-2, +-8,2, +26,4, +6,-23, +2,-3, +-15,7, +10,18, +4,-4, +7,-8, +3,-9, +-21,16, +-8,10, +-7,11, +-23,13, +-2,-2, +7,-25, +-10,-4, +-23,10, +-22,-15, +27,14, +-26,15, +12,-3, +-23,6, +-12,2, +25,-7, +-26,-32, +13,27, +25,-17, +-3,-10, +14,-7, +-28,-18, +16,-32, +23,-22, +13,-10, +6,18, +-11,21, +-17,8, +-10,-24, +8,36, +-20,6, +27,5, +27,-23, +-27,-10, +8,14, +11,-27, +-15,-13, +7,4, +-43,-34, +17,-31, +-9,-25, +72,-24, +-59,21, +14,16, +-16,14, +-7,0, +-24,41, +-50,26, +18,17, +-27,-1, +1,-8, +6,-13, +40,-17, +26,5, +-13,-2, +11,12, +-32,25, +3,9, +-46,40, +37,-17, +24,3, +60,36, +37,-16, +6,59, +7,40, +-6,18, +-7,-67, +-1,44, +-1,-23, +4,38, +4,-30, +-30,-39, +-17,10, +-4,1, +-2,-57, +2,-4, +-11,108, +36,-29, +-3,-41, +-9,2, +-48,17, +32,-20, +-57,-7, +-5,-2, +25,-5, +-10,-23, +-25,-6, +29,-60, +17,17, +11,49, +-18,-7, +12,-28, +2,19, +28,-6, +43,43, +-4,43, +17,36, +28,-11, +-51,-14, +3,14, +7,29, +15,-17, +51,76, +-26,-16, +51,-40, +-63,-13, +-13,-19, +20,14, +54,59, +3,10, +33,27, +1,-24, +75,-32, +22,34, +-40,55, +-43,21, +-16,-19, +32,40, +-31,-39, +-56,62, +-19,-33, +15,-49, +48,-3, +-63,-8, +0,52, +15,26, +3,11, +-86,19, +57,-38, +-75,4, +-76,24, +25,-84, +5,-31, +-11,-59, +4,-17, +-76,7, +-20,73, +21,-1, +76,14, +-21,24, +-46,-7, +-15,65, +-25,-1, +-30,-29, +-26,29, +-63,-22, +-20,-14, +36,-23, +19,-77, +22,24, +-102,59, +28,7, +42,38, +11,-28, +-114,1, +-18,-48, +49,4, +-7,13, +-94,35, +-117,43, +-56,-11, +109,39, +30,17, +66,4, +37,2, +31,25, +-46,16, +65,-39, +87,-37, +-34,42, +0,-41, +-19,-68, +-15,15, +36,96, +-3,-23, +31,94, +-6,-36, +27,83, +86,34, +57,9, +7,-5, +-62,88, +-103,30, +-55,-44, +-24,39, +23,-68, +81,-70, +-13,58, +43,73, +28,6, +-27,16, +24,2, +-24,-111, +20,24, +-6,45, +-9,24, +30,-79, +-26,57, +31,-16, +-5,-40, +10,-86, +-25,49, +-20,-76, +-38,-24, +18,35, +11,104, +-7,-28, +98,-42, +75,-20, +106,-84, +43,3, +-75,-13, +30,62, +-32,-16, +-2,54, +13,82, +-80,-6, +12,51, +115,37, +64,-44, +-2,52, +28,-23, +-2,-128, +-77,36, +14,-97, +-126,-82, +-46,-26, +8,30, +63,-35, +3,-64, +-49,-1, +38,14, +-49,101, +-102,-52, +46,-53, +-1,21, +-62,-98, +116,-24, +-63,89, +-101,114, +-51,-11, +-8,22, +85,60, +95,-108, +-99,-39, +53,-28, +41,123, +44,54, +-72,-13, +-51,104, +-82,21, +11,81, +41,56, +-113,-56, +-40,-32, +7,36, +71,29, +-50,7, +-44,-96, +32,-76, +67,-31, +-53,-71, +-65,-48, +86,-29, +-65,21, +15,-13, +-74,-26, +7,123, +96,-42, +12,10, +-31,38, +80,-74, +-8,84, +-85,-8, +15,27, +117,-114, +-9,29, +20,78, +-58,66, +-74,37, +26,25, +-4,-91, +-58,-56, +-104,-76, +-79,44, +-40,-3, +29,102, +41,-20, +46,-4, +12,-117, +44,15, +42,9, +134,29, +-10,-35, +142,-9, +84,-21, +184,-26, +21,17, +17,-9, +-58,-34, +-166,-71, +161,-42, +22,-74, +6,26, +69,-136, +22,94, +-6,-124, +44,-46, +-12,-35, +-1,-53, +-99,-50, +-50,49, +-44,-80, +121,-79, +42,-71, +68,9, +58,-116, +-59,-8, +55,53, +-48,71, +-6,-131, +162,-28, +4,52, +-50,72, +68,-58, +-119,100, +29,38, +11,-40, +80,-52, +132,-30, +10,-4, +-66,-149, +8,-127, +-63,109, +54,-7, +93,-22, +-30,-48, +30,102, +47,36, +-34,-36, +-9,241, +32,87, +-133,-30, +81,26, +83,-56, +73,-89, +-16,-100, +-127,-7, +16,27, +57,-131, +161,-24, +38,39, +143,-81, +58,-9, +-155,-53, +-90,9, +170,-35, +23,-152, +-11,-50, +-3,-22, +20,48, +13,-20, +67,-175, +-84,-24, +39,-84, +-84,-67, +-5,-37, +-97,-97, +75,41, +17,-46, +-6,-193, +96,1, +-49,-58, +137,-8, +57,163, +102,22, +20,5, +-144,14, +152,-46, +-29,93, +80,-40, +45,-68, +-59,-5, +24,-10, +42,-142, +-30,30, +38,-37, +-165,82, +23,-68, +-90,-44, +-190,-88, +-17,-90, +-30,21, +133,-15, +-28,-72, +-141,-142, +62,20, +-28,71, +49,13, +-91,15, +70,56, +-14,-68, +-47,84, +28,76, +19,-107, +28,16, +43,-32, +154,63, +66,123, +-3,48, +-36,38, +118,147, +72,181, +-1,-7, +194,-99, +-32,-106, +10,-7, +39,83, +-48,35, +-58,83, +-68,37, +73,46, +-2,112, +-80,64, +241,-36, +-86,31, +91,196, +-38,-16, +-13,208, +-118,62, +-43,17, +-217,-24, +-5,103, +-103,-216, +-6,58, +8,-109, +-135,37, +-92,5, +12,-46, +-69,149, +-128,9, +21,-49, +-35,48, +61,-78, +198,-53, +-55,-140, +-199,-5, +-110,-92, +-57,-71, +-98,117, +-60,-129, +-83,-167, +-57,-29, +152,-7, +-38,-95, +-34,50, +-15,26, +-64,-44, +47,47, +-43,-45, +-51,85, +-43,-103, +-6,65, +87,44, +166,68, +-43,-67, +0,-154, +97,229, +100,93, +64,66, +14,153, +42,-49, +-148,151, +153,-56, +42,-60, +39,43, +39,-3, +56,-31, +-4,-25, +23,-136, +-102,70, +76,-84, +22,137, +-158,-117, +-39,-234, +-63,87, +5,-163, +168,1, +59,3, +125,-81, +23,-13, +-43,32, +185,129, +55,-75, +-4,157, +208,-67, +60,1, +88,-17, +-22,-47, +-69,-19, +164,104, +119,-149, +70,-121, +10,84, +-2,180, +122,-66, +-17,-140, +29,-140, +38,-89, +71,-189, +100,85, +-82,71, +119,85, +223,-95, +-68,-201, +56,68, +56,-14, +-232,82, +-155,-6, +-92,-12, +18,-11, +-112,-20, +-34,-51, +174,-31, +-144,-82, +-22,-17, +106,146, +193,-21, +74,-20, +-46,-77, +127,-206, +67,-40, +-133,150, +-18,-119, +-41,144, +-6,-3, +-140,-113, +99,-38, +110,-113, +-5,23, +-182,114, +110,-138, +87,36, +53,-53, +28,-220, +209,-4, +7,-40, +19,108, +29,110, +75,92, +52,-119, +138,45, +-5,0, +154,-125, +-119,1, +213,-5, +-16,-201, +78,41, +133,-18, +53,221, +-38,11, +45,-191, +2,-81, +15,-314, +69,-50, +-4,-150, +1,-46, +-63,-190, +63,-6, +45,-25, +173,-78, +-128,-83, +-32,3, +-100,20, +37,132, +-2,186, +215,90, +52,-48, +1,54, +-62,52, +-109,68, +-156,91, +30,-139, +65,-93, +115,-33, +-183,104, +80,15, +-73,-67, +43,-41, +18,19, +-98,-116, +20,-83, +-133,109, +77,147, +25,-178, +-58,123, +163,-10, +96,39, +42,21, +149,-151, +149,74, +23,136, +-111,-112, +-5,-145, +49,277, +37,27, +-17,-23, +-155,51, +-159,39, +36,159, +-178,108, +-47,-34, +-81,-215, +-206,140, +307,-64, +77,-33, +-104,-143, +-10,-97, +17,177, +-231,235, +-187,-70, +157,25, +11,-59, +97,33, +91,7, +-29,61, +-9,164, +-163,-29, +45,-36, +140,128, +58,-168, +-80,-101, +58,288, +244,15, +-13,154, +185,67, +63,9, +76,-34, +14,5, +-76,-157, +17,-214, +-64,14, +-116,66, +-46,73, +-135,-20, +-65,-33, +53,130, +-170,-44, +153,14, +78,-185, +76,-299, +105,-42, +4,-90, +-137,-12, +-176,22, +171,2, +18,104, +60,16, +13,11, +247,-45, +-97,28, +-12,-68, +59,53, +87,-52, +-260,3, +97,50, +145,-96, +38,97, +-44,-31, +-3,-65, +-194,-8, +-106,-108, +179,-54, +73,-130, +34,61, +-4,179, +-31,166, +-170,195, +-68,-13, +68,-193, +-188,-124, +-34,-111, +-162,-20, +86,48, +-241,-156, +-36,39, +-97,10, +137,-37, +127,140, +-61,-35, +-13,-171, +195,-122, +-63,23, +-124,32, +78,-213, +-29,-27, +-126,-241, +49,-112, +-107,16, +-53,354, +-65,255, +-99,-19, +49,-117, +71,90, +85,207, +-80,96, +93,-258, +-174,93, +-124,88, +43,119, +29,-186, +187,-41, +57,79, +-92,103, +101,135, +-5,60, +-67,50, +2,78, +-160,109, +6,40, +20,-141, +-138,-192, +-74,225, +-107,59, +109,83, +82,41, +244,-109, +56,28, +81,219, +-49,76, +25,101, +96,-42, +-149,217, +-83,-164, +-20,54, +-176,121, +161,-13, +144,-210, +-64,173, +93,170, +-182,1, +97,33, +-45,-48, +-49,167, +-175,158, +-86,-138, +65,-147, +78,-133, +-2,48, +-190,-159, +-49,-79, +-98,-122, +-10,110, +166,55, +89,112, +-62,-259, +-3,109, +-224,-152, +77,-131, +-65,213, +-40,-22, +113,-18, +-96,-15, +-292,-81, +17,-91, +-97,-104, +-29,-54, +111,20, +26,-9, +-216,51, +2,-163, +144,-30, +117,74, +-22,6, +128,-68, +-65,80, +29,33, +133,155, +-112,-88, +-56,221, +332,-75, +-123,-107, +-234,-16, +-74,90, +222,-86, +23,42, +-28,139, +130,11, +79,65, +50,-21, +-265,-54, +218,64, +-31,30, +106,-39, +-283,49, +-122,-71, +-132,-192, +44,-172, +-94,-257, +-27,25, +51,-23, +-264,240, +-21,-93, +-3,124, +-109,-25, +65,-119, +64,-146, +37,-95, +47,93, +17,-31, +-78,143, +-187,0, +-92,281, +-119,60, +10,-152, +-135,320, +-50,-144, +41,40, +203,-304, +162,214, +84,-48, +115,191, +12,-46, +61,-73, +112,91, +-102,-11, +127,-63, +161,-102, +-313,-39, +22,124, +28,-43, +-19,109, +-151,101, +-28,-46, +-32,-114, +171,-110, +242,-39, +39,-20, +42,202, +189,-234, +-113,-81, +59,72, +32,-137, +153,130, +-96,-41, +35,23, +-25,239, +-130,-194, +11,105, +-34,-2, +14,208, +39,85, +116,-76, +71,50, +-102,123, +-104,98, +-86,55, +-45,100, +-46,86, +147,-129, +4,-58, +-139,65, +-121,-80, +162,151, +18,-137, +74,-178, +11,-8, +-132,186, +-35,-246, +-244,-107, +9,-18, +-98,-229, +120,225, +-163,-19, +-191,160, +100,198, +-280,73, +208,195, +115,-40, +116,37, +-141,13, +90,-48, +115,-70, +77,104, +157,-293, +61,15, +-177,-20, +-111,17, +193,-63, +132,31, +-53,-122, +-55,30, +10,-314, +32,135, +-13,260, +-70,-8, +-103,-130, +-30,-58, +280,208, +198,100, +64,-104, +-39,-224, +68,-20, +-105,-127, +-49,236, +-116,-95, +12,8, +183,33, +25,-150, +-113,-85, +-42,2, +-89,-159, +-134,-111, +-88,70, +-78,-187, +150,130, +-43,30, +203,-23, +-208,-3, +331,-36, +-47,107, +30,188, +1,76, +10,-14, +-214,49, +249,-15, +211,112, +-141,-100, +52,28, +144,26, +70,-196, +-192,76, +-52,-67, +83,282, +-20,-153, +57,-213, +-70,-129, +86,14, +-128,-73, +77,-126, +109,-18}; +#endif + diff --git a/src/algorithms/libs/gps_sdr_signal_processing.cc b/src/algorithms/libs/gps_sdr_signal_processing.cc new file mode 100644 index 000000000..6f25a2fe6 --- /dev/null +++ b/src/algorithms/libs/gps_sdr_signal_processing.cc @@ -0,0 +1,387 @@ +#include "gps_sdr_signal_processing.h" + +#include +#include +#include + +/*! + * The SV ID is _prn=ID -1 + */ +void code_gen_conplex(std::complex* _dest, int32 _prn, unsigned int _chip_shift) { + + uint32 G1[1023]; + uint32 G2[1023]; + uint32 G1_register[10], G2_register[10]; + uint32 feedback1, feedback2; + uint32 lcv, lcv2; + uint32 delay; + int32 prn = _prn-1; //Move the PRN code to fit an array indices + + /* G2 Delays as defined in GPS-ISD-200D */ + int32 delays[51] = {5, 6, 7, 8, 17, 18, 139, 140, 141, 251, 252, 254 ,255, 256, 257, 258, 469, 470, 471, 472, + 473, 474, 509, 512, 513, 514, 515, 516, 859, 860, 861, 862, 145, 175, 52, 21, 237, 235, 886, 657, 634, 762, + 355, 1012, 176, 603, 130, 359, 595, 68, 386}; + + /* A simple error check */ + if((prn < 0) || (prn > 51)) + return; + + for(lcv = 0; lcv < 10; lcv++) + { + G1_register[lcv] = 1; + G2_register[lcv] = 1; + } + + /* Generate G1 & G2 Register */ + for(lcv = 0; lcv < 1023; lcv++) + { + G1[lcv] = G1_register[0]; + G2[lcv] = G2_register[0]; + + feedback1 = G1_register[7]^G1_register[0]; + feedback2 = (G2_register[8] + G2_register[7] + G2_register[4] + G2_register[2] + G2_register[1] + G2_register[0]) & 0x1; + + for(lcv2 = 0; lcv2 < 9; lcv2++) + { + G1_register[lcv2] = G1_register[lcv2+1]; + G2_register[lcv2] = G2_register[lcv2+1]; + } + + G1_register[9] = feedback1; + G2_register[9] = feedback2; + } + + /* Set the delay */ + delay = 1023 - delays[prn]; + delay+=_chip_shift; + delay %= 1023; + /* Generate PRN from G1 and G2 Registers */ + for(lcv = 0; lcv < 1023; lcv++) + { + _dest[lcv] = std::complex(G1[(lcv+_chip_shift)%1023]^G2[delay], 0); + if(_dest[lcv].real()==0.0) //javi + { + _dest[lcv].real(-1.0); + } + delay++; + delay %= 1023; + //std::cout<<_dest[lcv].real(); //OK + } + +} + + +/*----------------------------------------------------------------------------------------------*/ +/*! + * code_gen, generate the given prn code + * */ +int32 code_gen(CPX *_dest, int32 _prn) +{ + + uint32 G1[1023]; + uint32 G2[1023]; + uint32 G1_register[10], G2_register[10]; + uint32 feedback1, feedback2; + uint32 lcv, lcv2; + uint32 delay; + int32 prn = _prn-1; //Move the PRN code to fit an array indices + + /* G2 Delays as defined in GPS-ISD-200D */ + int32 delays[51] = {5, 6, 7, 8, 17, 18, 139, 140, 141, 251, 252, 254 ,255, 256, 257, 258, 469, 470, 471, 472, + 473, 474, 509, 512, 513, 514, 515, 516, 859, 860, 861, 862, 145, 175, 52, 21, 237, 235, 886, 657, 634, 762, + 355, 1012, 176, 603, 130, 359, 595, 68, 386}; + + /* A simple error check */ + if((prn < 0) || (prn > 51)) + return(0); + + for(lcv = 0; lcv < 10; lcv++) + { + G1_register[lcv] = 1; + G2_register[lcv] = 1; + } + + /* Generate G1 & G2 Register */ + for(lcv = 0; lcv < 1023; lcv++) + { + G1[lcv] = G1_register[0]; + G2[lcv] = G2_register[0]; + + feedback1 = G1_register[7]^G1_register[0]; + feedback2 = (G2_register[8] + G2_register[7] + G2_register[4] + G2_register[2] + G2_register[1] + G2_register[0]) & 0x1; + + for(lcv2 = 0; lcv2 < 9; lcv2++) + { + G1_register[lcv2] = G1_register[lcv2+1]; + G2_register[lcv2] = G2_register[lcv2+1]; + } + + G1_register[9] = feedback1; + G2_register[9] = feedback2; + } + + /* Set the delay */ + delay = 1023 - delays[prn]; + + /* Generate PRN from G1 and G2 Registers */ + for(lcv = 0; lcv < 1023; lcv++) + { + _dest[lcv].i = G1[lcv]^G2[delay]; + _dest[lcv].q = 0; + + delay++; + delay %= 1023; + } + + return(1); + +} +/*----------------------------------------------------------------------------------------------*/ + + + +/*! + * code_gen_complex_sampled, generate GPS L1 C/A code complex for the desired SV ID and sampled to specific sampling frequency + */ +void code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, int32 _fs, unsigned int _chip_shift) +{ + // This function is based on the GNU software GPS for MATLAB in the Kay Borre book + std::complex _code[1023]; + int32 _samplesPerCode,_codeValueIndex; + float _ts; + float _tc; + const int32 _codeFreqBasis=1023000; //Hz + const int32 _codeLength=1023; + + //--- Find number of samples per spreading code ---------------------------- + _samplesPerCode = round(_fs / (_codeFreqBasis / _codeLength)); + + //--- Find time constants -------------------------------------------------- + _ts = 1/(float)_fs; // Sampling period in sec + _tc = 1/(float)_codeFreqBasis; // C/A chip period in sec + code_gen_conplex(_code,_prn,_chip_shift); //generate C/A code 1 sample per chip + //std::cout<<"ts="<<_ts< upsample + } + //std::cout<<_codeValueIndex; + + } + +} + + + +/*----------------------------------------------------------------------------------------------*/ +/*! + * sine_gen, generate a full scale sinusoid of frequency f with sampling frequency fs for _samps samps and put it into _dest + * */ +void sine_gen(CPX *_dest, double _f, double _fs, signed int _samps) { + + signed int lcv; + signed short c, s; + float phase, phase_step; + + phase = 0; + phase_step = (float)TWO_PI*_f/_fs; + + for(lcv = 0; lcv < _samps; lcv++) { + c = (signed short)floor(16383.0*cos(phase)); + s = (signed short)floor(16383.0*sin(phase)); + _dest[lcv].i = c; + _dest[lcv].q = s; + + phase += phase_step; + } +} +/*----------------------------------------------------------------------------------------------*/ + +void sine_gen_complex(std::complex* _dest, double _f, double _fs, unsigned int _samps) { + + double phase, phase_step; + + phase_step = ((double)TWO_PI*_f)/_fs; + + for(unsigned int i = 0; i < _samps; i++) { + + //_dest[i] = std::complex(16383.0*cos(phase), 16383.0*sin(phase)); + _dest[i] = std::complex(cos(phase),sin(phase)); + + phase += phase_step; + } + +} + + +/*----------------------------------------------------------------------------------------------*/ +void sine_gen(CPX *_dest, double _f, double _fs, int32 _samps, double _p) +{ + + int32 lcv; + int16 c, s; + double phase, phase_step; + + phase = _p; + phase_step = (double)TWO_PI*_f/_fs; + + for(lcv = 0; lcv < _samps; lcv++) + { + c = (int16)floor(16383.0*cos(phase)); + s = (int16)floor(16383.0*sin(phase)); + _dest[lcv].i = c; + _dest[lcv].q = s; + + phase += phase_step; + } + +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +/*! + * wipeoff_gen, generate a full scale sinusoid of frequency f with sampling frequency fs for _samps samps and put it into _dest + * */ +void wipeoff_gen(MIX *_dest, double _f, double _fs, int32 _samps) +{ + + int32 lcv; + int16 c, s; + double phase, phase_step; + + phase = 0; + phase_step = (double)TWO_PI*_f/_fs; + + for(lcv = 0; lcv < _samps; lcv++) + { + c = (int16)floor(16383.0*cos(phase)); + s = (int16)floor(16383.0*sin(phase)); + _dest[lcv].i = _dest[lcv].ni = c; + _dest[lcv].q = s; + _dest[lcv].nq = -s; + + phase += phase_step; + } + +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +void downsample(CPX *_dest, CPX *_source, double _fdest, double _fsource, int32 _samps) +{ + + int32 lcv, k; + uint32 phase_step; + uint32 lphase, phase; + + phase_step = (uint32)floor((double)4294967296.0*_fdest/_fsource); + + k = lphase = phase = 0; + + for(lcv = 0; lcv < _samps; lcv++) + { + if(phase <= lphase) + { + _dest[k] = _source[lcv]; + k++; + } + + lphase = phase; + phase += phase_step; + } + +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +/*! + * Gather statistics and run AGC + * */ +int32 run_agc(CPX *_buff, int32 _samps, int32 _bits, int32 _scale) +{ + int32 lcv, num; + int16 max, *p; + int16 val; + + p = (int16 *)&_buff[0]; + + val = (1 << _scale - 1); + max = 1 << _bits; + num = 0; + + if(_scale) + { + for(lcv = 0; lcv < 2*_samps; lcv++) + { + p[lcv] += val; + p[lcv] >>= _scale; + if(abs(p[lcv]) > max) + num++; + } + } + else + { + for(lcv = 0; lcv < 2*_samps; lcv++) + { + if(abs(p[lcv]) > max) + num++; + } + } + + return(num); + +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +/*! + * Get a rough first guess of scale value to quickly initialize agc + * */ +void init_agc(CPX *_buff, int32 _samps, int32 bits, int32 *scale) +{ + int32 lcv; + int16 *p; + int32 max; + + p = (int16 *)&_buff[0]; + + max = 0; + for(lcv = 0; lcv < 2*_samps; lcv++) + { + if(p[lcv] > max) + max = p[lcv]; + } + + scale[0] = (1 << 14) / max; + +} +/*----------------------------------------------------------------------------------------------*/ diff --git a/src/algorithms/libs/gps_sdr_signal_processing.h b/src/algorithms/libs/gps_sdr_signal_processing.h new file mode 100644 index 000000000..7a002e023 --- /dev/null +++ b/src/algorithms/libs/gps_sdr_signal_processing.h @@ -0,0 +1,56 @@ +#ifndef GPS_SDR_SIGNAL_PROCESSING_H_ +#define GPS_SDR_SIGNAL_PROCESSING_H_ + +#include "gps_sdr_defines.h" + +#include +#include + +/* + * Signal processing functions from gps-sdr. + */ + +/*----------------------------------------------------------------------------------------------*/ +/*! @ingroup STRUCTS + * @brief Define the CPX structure, used in the Fine_Acquisition FFT */ +typedef struct CPX +{ + int16 i; //!< Real value + int16 q; //!< Imaginary value +} CPX; + +/*! \ingroup STRUCTS + * @brief Format of complex accumulations */ +typedef struct CPX_ACCUM { + + int32 i; //!< Inphase (real) + int32 q; //!< Quadrature (imaginary) + +} CPX_ACCUM; + + +/*! \ingroup STRUCTS + * + */ +typedef struct MIX { + + int16 i; //!< Inphase (real) + int16 nq; //!< Quadrature (imaginary) + int16 q; //!< Quadrature (imaginary) + int16 ni; //!< Inphase (real) + +} MIX; +/*----------------------------------------------------------------------------------------------*/ + +void code_gen_conplex(std::complex* _dest, int32 _prn, unsigned int _chip_shift); +void code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, int32 _fs, unsigned int _chip_shift); +int32 code_gen(CPX *_dest, int32 _prn); +void sine_gen(CPX *_dest, double _f, double _fs, int32 _samps); +void sine_gen_complex(std::complex* _dest, double _f, double _fs, unsigned int _samps); +void sine_gen(CPX *_dest, double _f, double _fs, int32 _samps, double _p); +void wipeoff_gen(MIX *_dest, double _f, double _fs, int32 _samps); +void downsample(CPX *_dest, CPX *_source, double _fdest, double _fsource, int32 _samps); +void init_agc(CPX *_buff, int32 _samps, int32 bits, int32 *scale); +int32 run_agc(CPX *_buff, int32 _samps, int32 bits, int32 scale); + +#endif /* GPS_SDR_SIGNAL_PROCESSING_H_ */ diff --git a/src/algorithms/libs/gps_sdr_simd.cc b/src/algorithms/libs/gps_sdr_simd.cc new file mode 100644 index 000000000..8049124d7 --- /dev/null +++ b/src/algorithms/libs/gps_sdr_simd.cc @@ -0,0 +1,1041 @@ +/*! \file SSE.cpp + SIMD functionality, mainly for 32 bit interleaved complex integer type (CPX) +*/ + +/************************************************************************************************ +Copyright 2008 Gregory W Heckler + +This file is part of the GPS Software Defined Radio (GPS-SDR) + +The GPS-SDR is free software; you can redistribute it and/or modify it under the terms of the +GNU General Public License as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GPS-SDR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License along with GPS-SDR; if not, +write to the: + +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +************************************************************************************************/ +#include "gps_sdr_simd.h" + +// __asm +// ( +// "mov eax, 0x1 \n\t" +// +// "mov eax, edx \n\t" +// "leave \n\t" +// "ret \n\t" +// ".att_syntax \n\t" +// ); + + +void sse_add(int16 *A, int16 *B, int32 cnt) +{ + + int32 cnt1; + int32 cnt2; + + cnt1 = cnt / 8; + cnt2 = (cnt - (8*cnt1)); + + if(((int)A%16) || ((int)B%16)) // unaligned version + { + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-12] \n\t" //Counter 1 + "jecxz Z%= \n\t" + "L%=: \n\t" + "movupd xmm0, [edi] \n\t" //Load from A + "movupd xmm1, [esi] \n\t" //Load from B + "paddw xmm0, xmm1 \n\t" //Multiply A*B + "movupd [edi], xmm0 \n\t" //Move into A + "add edi, 16 \n\t" + "add esi, 16 \n\t" + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" //Counter 2 + "jecxz ZZ%= \n\t" + "mov eax, 0 \n\t" + "LL%=: \n\t" //Really finish off loop with non SIMD instructions + "mov ax, [edi] \n\t" + "add ax, [esi] \n\t" + "mov [edi], ax \n\t" + "add esi, 2 \n\t" + "add edi, 2 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (cnt), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edi", "%esi" + ); + + } + else + { + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-12] \n\t" //Counter 1 + "jecxz Z%= \n\t" + "L%=: \n\t" + "movapd xmm0, [edi] \n\t" //Load from A + "paddw xmm0, [esi] \n\t" //Multiply A*B + "movapd [edi], xmm0 \n\t" //Move into A + "add edi, 16 \n\t" + "add esi, 16 \n\t" + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" //Counter 2 + "jecxz ZZ%= \n\t" + "mov eax, 0 \n\t" + "LL%=: \n\t" //Really finish off loop with non SIMD instructions + "mov ax, [edi] \n\t" + "add ax, [esi] \n\t" + "mov [edi], ax \n\t" + "add esi, 2 \n\t" + "add edi, 2 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (cnt), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edi", "%esi" + );//end __asm + + }//end if + +} + + +void sse_sub(int16 *A, int16 *B, int32 cnt) +{ + + int32 cnt1; + int32 cnt2; + + cnt1 = cnt / 8; + cnt2 = (cnt - (8*cnt1)); + + if(((int)A%16) || ((int)B%16)) // unaligned version + { + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-12] \n\t" //Counter 1 + "jecxz Z%= \n\t" + "L%=: \n\t" + "movupd xmm0, [edi] \n\t" //Load from A + "movupd xmm1, [esi] \n\t" //Load from B + "psubw xmm0, xmm1 \n\t" //Multiply A*B + "movupd [edi], xmm0 \n\t" //Move into A + "add edi, 16 \n\t" + "add esi, 16 \n\t" + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" //Counter 2 + "jecxz ZZ%= \n\t" + "mov eax, 0 \n\t" + "LL%=: \n\t" //Really finish off loop with non SIMD instructions + "mov ax, [edi] \n\t" + "sub ax, [esi] \n\t" + "mov [edi], ax \n\t" + "add esi, 2 \n\t" + "add edi, 2 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (cnt), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edi", "%esi" + ); + + } + else + { + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-12] \n\t" //Counter 1 + "jecxz Z%= \n\t" + "L%=: \n\t" + "movapd xmm0, [edi] \n\t" //Load from A + "psubw xmm0, [esi] \n\t" //Multiply A*B + "movapd [edi], xmm0 \n\t" //Move into A + "add edi, 16 \n\t" + "add esi, 16 \n\t" + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" //Counter 2 + "jecxz ZZ%= \n\t" + "mov eax, 0 \n\t" + "LL%=: \n\t" //Really finish off loop with non SIMD instructions + "mov ax, [edi] \n\t" + "sub ax, [esi] \n\t" + "mov [edi], ax \n\t" + "add esi, 2 \n\t" + "add edi, 2 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (cnt), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edi", "%esi" + );//end __asm + + }//end if + +} + +void sse_mul(int16 *A, int16 *B, int32 cnt) +{ + + int32 cnt1; + int32 cnt2; + + cnt1 = cnt / 8; + cnt2 = (cnt - (8*cnt1)); + + if(((int)A%16) || ((int)B%16)) // unaligned version + { + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-12] \n\t" //Counter 1 + "jecxz Z%= \n\t" + "L%=: \n\t" + "movupd xmm0, [edi] \n\t" //Load from A + "movupd xmm1, [esi] \n\t" //Load from B + "pmullw xmm0, xmm1 \n\t" //Multiply A*B + "movupd [edi], xmm0 \n\t" //Move into A + "add edi, 16 \n\t" + "add esi, 16 \n\t" + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" //Counter 2 + "jecxz ZZ%= \n\t" + "mov eax, 0 \n\t" + "LL%=: \n\t" //Really finish off loop with non SIMD instructions + "mov ax, [edi] \n\t" + "imul ax, [esi] \n\t" + "mov [edi], ax \n\t" + "add esi, 2 \n\t" + "add edi, 2 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (cnt), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edi", "%esi" + ); + + } + else + { + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-12] \n\t" //Counter 1 + "jecxz Z%= \n\t" + "L%=: \n\t" + "movapd xmm0, [edi] \n\t" //Load from A + "pmullw xmm0, [esi] \n\t" //Multiply A*B + "movapd [edi], xmm0 \n\t" //Move into A + "add edi, 16 \n\t" + "add esi, 16 \n\t" + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" //Counter 2 + "jecxz ZZ%= \n\t" + "mov eax, 0 \n\t" + "LL%=: \n\t" //Really finish off loop with non SIMD instructions + "mov ax, [edi] \n\t" + "imul ax, [esi] \n\t" + "mov [edi], ax \n\t" + "add esi, 2 \n\t" + "add edi, 2 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (cnt), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edi", "%esi" + );//end __asm + + }//end if + +} + + +int32 sse_dot(int16 *A, int16 *B, int32 cnt) +{ + + int32 cnt1; + int32 cnt2; + int32 temp; + + if(((int32)A%16) || ((int32)B%16)) //If the memory locations are not 16 byte aligned use slower movupd instruction + { + + cnt1 = cnt / 24; + cnt2 = (cnt - (24*cnt1)); + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "push ebx\n\t" + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-16] \n\t" //Counter 1 + "pxor xmm0, xmm0 \n\t" //Clear the running sum (accumulator) + "jecxz Z%= \n\t" + "L%=: \n\t" + "movupd xmm1, [esi] \n\t" //Load from A + "movupd xmm2, [esi+16] \n\t" //Load from A + "movupd xmm3, [esi+32] \n\t" //Load from A + "movupd xmm4, [edi] \n\t" //Load from B + "movupd xmm5, [edi+16] \n\t" //Load from B + "movupd xmm6, [edi+32] \n\t" //Load from B + "pmaddwd xmm1, xmm4 \n\t" //Multiply and accumulate + "pmaddwd xmm2, xmm5 \n\t" //Multiply and accumulate + "pmaddwd xmm3, xmm6 \n\t" //Multiply and accumulate + "paddd xmm1, xmm3 \n\t" //Add into accumulator (efficiently) + "paddd xmm0, xmm2 \n\t" + "paddd xmm0, xmm1 \n\t" + "add esi, 48 \n\t" + "add edi, 48 \n\t" + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "movd ebx, xmm0 \n\t" //right-hand word to ebx + "psrldq xmm0, 4 \n\t" //left-hand word to right side of xmm0 + "movd eax, xmm0 \n\t" //left-hand word into eax + "add eax, ebx \n\t" //running sum now in eax + "mov edx, eax \n\t" //move into edx + "psrldq xmm0, 4 \n\t" //left-hand word to right side of xmm0 + "movd ebx, xmm0 \n\t" //right-hand word to ebx + "psrldq xmm0, 4 \n\t" //left-hand word to right side of xmm0 + "movd eax, xmm0 \n\t" //left-hand word into eax + "add eax, ebx \n\t" //running sum now in eax + "add edx, eax \n\t" //add to edx + "mov ecx, [ebp-20] \n\t" + "jecxz ZZ%= \n\t" + "LL%=: \n\t" //Really finish off loop with non SIMD instructions + "mov bx, [edi] \n\t" //Move 16 bits into bx + "movsx ebx, bx \n\t" //Sign extend to 32 bits + "mov ax, [esi] \n\t" //Move 16 bits into ax + "movsx eax, ax \n\t" //Sign extend to 32 bits + "imul ebx, eax \n\t" //Multiply + "add edx, ebx \n\t" //Add into accumulator + "add esi, 2 \n\t" + "add edi, 2 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + "mov [ebp-24], edx \n\t" + "pop ebx\n\t" + ".att_syntax \n\t" + : "=m"(temp) + : "m" (A), "m" (B), "m" (cnt), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edx", "%edi", "%esi" + );//end __asm + } + else //use faster movapd instruction + { + + cnt1 = cnt / 56; + cnt2 = (cnt - (56*cnt1)); + + __asm + ( + //Set up for loop + ".intel_syntax noprefix \n\t" //Set up for loop + "push ebx\n\t" + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-16] \n\t" //Counter 1 + "pxor xmm0, xmm0 \n\t" //Clear the running sum (accumulator) + "jecxz Z%= \n\t" + "L%=: \n\t" + "movapd xmm1, [esi] \n\t" //Load from A + "movapd xmm2, [esi+16] \n\t" //Load from A + "movapd xmm3, [esi+32] \n\t" //Load from A + "movapd xmm4, [esi+48] \n\t" //Load from A + "movapd xmm5, [esi+64] \n\t" //Load from A + "movapd xmm6, [esi+80] \n\t" //Load from A + "movapd xmm7, [esi+96] \n\t" //Load from A + "pmaddwd xmm1, [edi] \n\t" + "pmaddwd xmm2, [edi+16] \n\t" + "pmaddwd xmm3, [edi+32] \n\t" + "pmaddwd xmm4, [edi+48] \n\t" + "pmaddwd xmm5, [edi+64] \n\t" + "pmaddwd xmm6, [edi+80] \n\t" + "pmaddwd xmm7, [edi+96] \n\t" + "paddd xmm0, xmm7 \n\t" + "paddd xmm1, xmm2 \n\t" + "paddd xmm3, xmm4 \n\t" + "paddd xmm5, xmm6 \n\t" + "paddd xmm1, xmm3 \n\t" + "paddd xmm0, xmm5 \n\t" + "paddd xmm0, xmm1 \n\t" + "add esi, 112 \n\t" + "add edi, 112 \n\t" + "loop L%= \n\t" // Loop if not done + "Z%=: \n\t" + "movd ebx, xmm0 \n\t" // right-hand word to ebx + "psrldq xmm0, 4 \n\t" // left-hand word to right side of xmm0 + "movd eax, xmm0 \n\t" // left-hand word into eax + "add eax, ebx \n\t" // running sum now in eax + "mov edx, eax \n\t" // move into temp + "psrldq xmm0, 4 \n\t" + "movd ebx, xmm0 \n\t" // right-hand word to ebx + "psrldq xmm0, 4 \n\t" // left-hand word to right side of xmm0 + "movd eax, xmm0 \n\t" // left-hand word into eax + "add eax, ebx \n\t" // running sum now in eax + "add edx, eax \n\t" // add into temp + "mov ecx, [ebp-20] \n\t" + "jecxz ZZ%= \n\t" + "LL%=: \n\t" //Really finish off loop with non SIMD instructions + "mov bx, [edi] \n\t" //Move 16 bits into bx + "movsx ebx, bx \n\t" //Sign extend to 32 bits + "mov ax, [esi] \n\t" //Move 16 bits into ax + "movsx eax, ax \n\t" //Sign extend to 32 bits + "imul ebx, eax \n\t" //Multiply + "add edx, ebx \n\t" //Add into accumulator + "add esi, 2 \n\t" + "add edi, 2 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + "mov [ebp-24], edx \n\t" + "pop ebx\n\t" + ".att_syntax \n\t" + : "=m"(temp) + : "m" (A), "m" (B), "m" (cnt), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edx", "%edi", "%esi" + ); + } + + return(temp); + +} + +void sse_conj(CPX *A, int32 cnt) +{ + + int32 cnt1; + int32 cnt2; + int32 temp = 0xffff0001; //[1, -1] + + cnt1 = cnt/4; + cnt2 = cnt-4*cnt1; + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A source1 + "mov ecx, [ebp-8] \n\t" //Counter + "movd mm7, [ebp-16] \n\t" + "punpckldq mm7, mm7 \n\t" + "movd xmm7, [ebp-16] \n\t" + "punpckldq xmm7, xmm7 \n\t" + "punpckldq xmm7, xmm7 \n\t" + "jecxz Z%= \n\t" + "L%=: \n\t" + " movupd xmm0, [edi] \n\t" //Load from A + " pmullw xmm0, xmm7 \n\t" //Multiply to get [Re -Im Re -Im] + " movupd [edi], xmm0 \n\t" //Move into A + " add edi, 16 \n\t" //Move in array + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-12] \n\t" + "jecxz ZZ%= \n\t" + "LL%=: \n\t" + " movd mm0, [edi] \n\t" //Load from A + " pmullw mm0, mm7 \n\t" //Multiply to get [Re -Im Re -Im] + " movd [edi], mm0 \n\t" //Move into A + " add edi, 4 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (cnt), "m" (cnt1), "m" (cnt2), "m" (temp) + : "%ecx", "%edx", "%edi" + ); + +} + +void sse_cmul(CPX *A, CPX *B, int32 cnt) +{ + + int32 cnt1; + int32 cnt2; + + volatile int32 M[4] = {0xffff0001, 0x00010001, 0xffff0001, 0x00010001}; //{1,-1,1,1,1,-1,1,1}; + + cnt1 = cnt/4; + cnt2 = cnt-4*cnt1; + + cnt1 = 0; + cnt2 = cnt; + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-12] \n\t" //Counter 1 + "movupd xmm7,[ebp-32] \n\t" // Move the multiply thingie + "jecxz Z%= \n\t" + "L%=: \n\t" + "movlpd xmm0, [edi] \n\t" //Copy from A + "movlpd xmm1, [edi+8] \n\t" //Copy from A + "movlpd xmm3, [esi] \n\t" //Copy from B + "movlpd xmm4, [esi+8] \n\t" //Copy from B + "punpckldq xmm0, xmm0 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm1, xmm1 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm3, xmm3 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm4, xmm4 \n\t" //Copy low 32 bits to high 32 bits + "pshuflw xmm3, xmm3, 0x14 \n\t" //Shuffle Low 64 bits to get [Re Im Im Re] + "pshuflw xmm4, xmm4, 0x14 \n\t" //Shuffle Low 64 bits to get [Re Im Im Re] + "pshufhw xmm3, xmm3, 0x14 \n\t" //Shuffle High 64 bits to get [Re Im Im Re] + "pshufhw xmm4, xmm4, 0x14 \n\t" //Shuffle High 64 bits to get [Re Im Im Re] + "pmullw xmm3, xmm7 \n\t" //Multiply to get [Re Im -Im Re] + "pmullw xmm4, xmm7 \n\t" //Multiply to get [Re Im -Im Re] + "pmaddwd xmm0, xmm3 \n\t" //Complex multiply and add + "pmaddwd xmm1, xmm4 \n\t" //Complex multiply and add + "packssdw xmm0, xmm0 \n\t" //Get into low 64 bits + "packssdw xmm1, xmm1 \n\t" //Get into low 64 bits + "movsd [edi], xmm0 \n\t" //Move into A + "movsd [edi+8], xmm1 \n\t" //Move into A + "add edi, 16 \n\t" //Move in array + "add esi, 16 \n\t" //Move in array + "loop L%= \n\t" // Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" + "jecxz ZZ%= \n\t" + "LL%=: \n\t" + "movlpd xmm0, [edi] \n\t" //Copy from A + "movlpd xmm1, [esi] \n\t" //Copy from B + "punpckldq xmm0, xmm0 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm1, xmm1 \n\t" //Copy low 32 bits to high 32 bits + "pshuflw xmm1, xmm1, 0x14\n\t" //Shuffle Low 64 bits to get [Re Im Im Re] + "pmullw xmm1, xmm7 \n\t" //Multiply to get [Re Im -Im Re] + "pmaddwd xmm0, xmm1 \n\t" //Complex multiply and add + "packssdw xmm0, xmm0 \n\t" //Get into low 32 bits + "movd [edi], xmm0 \n\t" //Move into A + "add edi, 4 \n\t" + "add esi, 4 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (cnt), "m" (cnt1), "m" (cnt2) + : "%ecx", "%edi", "%esi" + ); + +} + + +void sse_cmuls(CPX *A, CPX *B, int32 cnt, int32 shift) +{ + + int32 cnt1; + int32 cnt2; + int32 round; + + volatile int32 M[4] = {0xffff0001, 0x00010001, 0xffff0001, 0x00010001}; //{1,-1,1,1,1,-1,1,1}; + + cnt1 = cnt/4; + cnt2 = cnt-4*cnt1; + + round = 1 << (shift-1); + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-12] \n\t" //Counter 1 + "movupd xmm7,[ebp-36] \n\t" //Move the multiply thingie + "movss xmm6, [ebp+20] \n\t" //Move the round thingie + "movss xmm5, [ebp-20] \n\t" //Move the round thingie + "punpckldq xmm5, xmm5 \n\t" + "punpcklqdq xmm5, xmm5 \n\t" + "jecxz Z%= \n\t" + "L%=: \n\t" + "movlpd xmm0, [edi] \n\t" //Copy from A + "movlpd xmm1, [edi+8] \n\t" //Copy from A + "movlpd xmm3, [esi] \n\t" //Copy from B + "movlpd xmm4, [esi+8] \n\t" //Copy from B + "punpckldq xmm0, xmm0 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm1, xmm1 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm3, xmm3 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm4, xmm4 \n\t" //Copy low 32 bits to high 32 bits + "pshuflw xmm3, xmm3, 0x14 \n\t" //Shuffle Low 64 bits to get [Re Im Im Re] + "pshuflw xmm4, xmm4, 0x14 \n\t" //Shuffle Low 64 bits to get [Re Im Im Re] + "pshufhw xmm3, xmm3, 0x14 \n\t" //Shuffle High 64 bits to get [Re Im Im Re] + "pshufhw xmm4, xmm4, 0x14 \n\t" //Shuffle High 64 bits to get [Re Im Im Re] + "pmullw xmm3, xmm7 \n\t" //Multiply to get [Re Im -Im Re] + "pmullw xmm4, xmm7 \n\t" //Multiply to get [Re Im -Im Re] + "pmaddwd xmm0, xmm3 \n\t" //Complex multiply and add + "pmaddwd xmm1, xmm4 \n\t" //Complex multiply and add + "paddd xmm0, xmm5 \n\t" //Add in 2^(shift-1) + "paddd xmm1, xmm5 \n\t" //Add in 2^(shift-1) + "psrad xmm0, xmm6 \n\t" //Shift by X bits + "psrad xmm1, xmm6 \n\t" //Shift by X bits + "packssdw xmm0, xmm0 \n\t" //Get into low 64 bits + "packssdw xmm1, xmm1 \n\t" //Get into low 64 bits + "movlpd [edi], xmm0 \n\t" //Move into A + "movlpd [edi+8], xmm1 \n\t" //Move into A + "add edi, 16 \n\t" //Move in array + "add esi, 16 \n\t" //Move in array + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" + "jecxz ZZ%= \n\t" + "LL%=: \n\t" + "movlpd xmm0, [edi] \n\t" //Copy from A + "movlpd xmm1, [esi] \n\t" //Copy from B + "punpckldq xmm0, xmm0 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm1, xmm1 \n\t" //Copy low 32 bits to high 32 bits + "pshuflw xmm1, xmm1, 0x14\n\t" //Shuffle Low 64 bits to get [Re Im Im Re] + "pmullw xmm1, xmm7 \n\t" //Multiply to get [Re Im -Im Re] + "pmaddwd xmm0, xmm1 \n\t" //Complex multiply and add + "paddd xmm0, xmm5 \n\t" //Add in 2^(shift-1) + "psrad xmm0, xmm6 \n\t" //Shift by X bits + "packssdw xmm0, xmm0 \n\t" //Get into low 32 bits + "movd [edi], xmm0 \n\t" //Move into A + "add edi, 4 \n\t" + "add esi, 4 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (cnt), "m" (cnt1), "m" (cnt2), "m" (shift), "m" (round) + : "%ecx", "%edi", "%esi" + ); + +} + +void sse_cmulsc(CPX *A, CPX *B, CPX *C, int32 cnt, int32 shift) +{ + int32 cnt1; + int32 cnt2; + int32 round; + + volatile int32 M[4] = {0xffff0001, 0x00010001, 0xffff0001, 0x00010001}; //{1,-1,1,1,1,-1,1,1}; + + cnt1 = cnt/4; + cnt2 = cnt-4*cnt1; + + round = 1 << (shift-1); + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov eax, [ebp+16] \n\t" //Address of C + "mov ecx, [ebp-12] \n\t" //Counter 1 + "movupd xmm7,[ebp-36] \n\t" //Move the multiply thingie + "movss xmm6, [ebp+24] \n\t" //Move the round thingie + "movss xmm5, [ebp-20] \n\t" //Move the round thingie + "punpckldq xmm5, xmm5 \n\t" + "punpcklqdq xmm5, xmm5 \n\t" + "jecxz Z%= \n\t" + "L%=: \n\t" + "movlpd xmm0, [edi] \n\t" //Copy from A + "movlpd xmm1, [edi+8] \n\t" //Copy from A + "movlpd xmm3, [esi] \n\t" //Copy from B + "movlpd xmm4, [esi+8] \n\t" //Copy from B + "punpckldq xmm0, xmm0 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm1, xmm1 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm3, xmm3 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm4, xmm4 \n\t" //Copy low 32 bits to high 32 bits + "pshuflw xmm3, xmm3, 0x14 \n\t" //Shuffle Low 64 bits to get [Re Im Im Re] + "pshuflw xmm4, xmm4, 0x14 \n\t" //Shuffle Low 64 bits to get [Re Im Im Re] + "pshufhw xmm3, xmm3, 0x14 \n\t" //Shuffle High 64 bits to get [Re Im Im Re] + "pshufhw xmm4, xmm4, 0x14 \n\t" //Shuffle High 64 bits to get [Re Im Im Re] + "pmullw xmm3, xmm7 \n\t" //Multiply to get [Re Im -Im Re] + "pmullw xmm4, xmm7 \n\t" //Multiply to get [Re Im -Im Re] + "pmaddwd xmm0, xmm3 \n\t" //Complex multiply and add + "pmaddwd xmm1, xmm4 \n\t" //Complex multiply and add + "paddd xmm0, xmm5 \n\t" //Add in 2^(shift-1) + "paddd xmm1, xmm5 \n\t" //Add in 2^(shift-1) + "psrad xmm0, xmm6 \n\t" //Shift by X bits + "psrad xmm1, xmm6 \n\t" //Shift by X bits + "packssdw xmm0, xmm0 \n\t" //Get into low 64 bits + "packssdw xmm1, xmm1 \n\t" //Get into low 64 bits + "movlpd [eax], xmm0 \n\t" //Move into A + "movlpd [eax+8], xmm1 \n\t" //Move into A + "add edi, 16 \n\t" //Move in array + "add esi, 16 \n\t" //Move in array + "add eax, 16 \n\t" + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" + "jecxz ZZ%= \n\t" + "LL%=: \n\t" + "movlpd xmm0, [edi] \n\t" //Copy from A + "movlpd xmm1, [esi] \n\t" //Copy from B + "punpckldq xmm0, xmm0 \n\t" //Copy low 32 bits to high 32 bits + "punpckldq xmm1, xmm1 \n\t" //Copy low 32 bits to high 32 bits + "pshuflw xmm1, xmm1, 0x14\n\t" //Shuffle Low 64 bits to get [Re Im Im Re] + "pmullw xmm1, xmm7 \n\t" //Multiply to get [Re Im -Im Re] + "pmaddwd xmm0, xmm1 \n\t" //Complex multiply and add + "paddd xmm0, xmm5 \n\t" //Add in 2^(shift-1) + "psrad xmm0, xmm6 \n\t" //Shift by X bits + "packssdw xmm0, xmm0 \n\t" //Get into low 32 bits + "movd [eax], xmm0 \n\t" //Move into A + "add edi, 4 \n\t" + "add esi, 4 \n\t" + "add eax, 4 \n\t" + "loop LL%= \n\t" + "ZZ%=: \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (C), "m" (cnt), "m" (cnt1), "m" (cnt2), "m" (shift), "m" (round) + : "%eax", "%ecx", "%edi", "%esi" + ); + +} + + +void sse_cacc(CPX *A, MIX *B, int32 cnt, int32 *iaccum, int32 *baccum) +{ + + int32 cnt1; + int32 cnt2; + + if(((int)A%16) || ((int)B%16)) + { + + cnt1 = cnt / 6; + cnt2 = (cnt - (6*cnt1)); + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-12] \n\t" //Counter 1 + "pxor xmm0, xmm0 \n\t" //Clear the running sum + "pxor mm0, mm0 \n\t" //Clear the running sum + "jecxz Z%= \n\t" + "L%=: \n\t" + " movlpd xmm1, [edi] \n\t" //load IF data + " movlpd xmm2, [edi+8] \n\t" //load IF data + " movlpd xmm3, [edi+16] \n\t" //load IF data + " movupd xmm4, [esi] \n\t" //load Sine data + " movupd xmm5, [esi+16] \n\t" //load Sine data + " movupd xmm6, [esi+32] \n\t" //load Sine data + " punpckldq xmm1, xmm1 \n\t" //copies bits 0..31 to 32..63 and bits 32..63 to 64..95 and 65..127 + " punpckldq xmm2, xmm2 \n\t" //copies bits 0..63 to 64..127 + " punpckldq xmm3, xmm3 \n\t" //copies bits 0..63 to 64..127 + " pmaddwd xmm1, xmm4 \n\t" //multiply and add, result in xmm1 + " pmaddwd xmm2, xmm5 \n\t" //multiply and add, result in xmm2 + " pmaddwd xmm3, xmm6 \n\t" //multiply and add, result in xmm3 + " paddd xmm0, xmm3 \n\t" //Add into accumulator (efficiently) + " paddd xmm1, xmm2 \n\t" + " paddd xmm0, xmm1 \n\t" + " add edi, 24 \n\t" //move in complex sine by 24 bytes + " add esi, 48 \n\t" //move in IF array by 48 bytes + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" + "jecxz ZZ%= \n\t" + "LL%=: \n\t" + " movd mm1, [edi] \n\t" //load IF data + " movq mm2, [esi] \n\t" + " punpckldq mm1, mm1 \n\t" //copy bottom 32 bits of IF data into high 32 bits + " pmaddwd mm1, mm2 \n\t" //perform mmx complex multiply + " paddd mm0, mm1 \n\t" //add into accumulator + " add edi, 4 \n\t" //move in complex sine by 4 bytes + " add esi, 8 \n\t" //move in IF array by 8 bytes + "loop LL%= \n\t" + "ZZ%=: \n\t" + "movdq2q mm1, xmm0 \n\t" + "punpckhqdq xmm0, xmm0 \n\t" //move bits 64..127 of xmm0 into 0..63 of xmm0 + "movdq2q mm2, xmm0 \n\t" + "paddd mm0, mm1 \n\t" //add together + "paddd mm0, mm2 \n\t" //add" punpckldq xmm1, xmm1 \n\t" //copies bits 0..31 to 32..63 and bits 32..63 to 64..95 and 65..127 together + "mov eax, [ebp+20] \n\t" + "movd [eax], mm0 \n\t" + "punpckhdq mm0, mm0 \n\t" + "mov eax, [ebp+24] \n\t" + "movd [eax], mm0 \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (cnt), "m" (iaccum), "m" (baccum), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edi", "%esi" + );//end __asm + } + else + { + + cnt1 = cnt / 12; + cnt2 = (cnt - (12*cnt1)); + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "mov edi, [ebp+8] \n\t" //Address of A + "mov esi, [ebp+12] \n\t" //Address of B + "mov ecx, [ebp-12] \n\t" //Counter 1 + "pxor xmm0, xmm0 \n\t" //Clear the running sum + "pxor mm0, mm0 \n\t" //Clear the running sum + "jecxz AZ%= \n\t" + "AL%=: \n\t" + " movlpd xmm1, [edi] \n\t" //load IF data + " movlpd xmm2, [edi+8] \n\t" //load IF data + " movlpd xmm3, [edi+16] \n\t" //load IF data + " movlpd xmm4, [edi+24] \n\t" //load IF data + " movlpd xmm5, [edi+32] \n\t" //load IF data + " movlpd xmm6, [edi+40] \n\t" //load IF data + " punpckldq xmm1, xmm1 \n\t" //copies bits 0..31 to 32..63 and bits 32..63 to 64..95 and 65..127 + " punpckldq xmm2, xmm2 \n\t" //copies bits 0..63 to 64..127 + " punpckldq xmm3, xmm3 \n\t" //copies bits 0..63 to 64..127 + " punpckldq xmm4, xmm4 \n\t" //copies bits 0..63 to 64..127 + " punpckldq xmm5, xmm5 \n\t" //copies bits 0..63 to 64..127 + " punpckldq xmm6, xmm6 \n\t" //copies bits 0..63 to 64..127 + " pmaddwd xmm1, [esi] \n\t" //multiply and add, result in xmm1 + " pmaddwd xmm2, [esi+16] \n\t" //multiply and add, result in xmm2 + " pmaddwd xmm3, [esi+32] \n\t" //multiply and add, result in xmm3 + " pmaddwd xmm4, [esi+48] \n\t" //multiply and add, result in xmm4 + " pmaddwd xmm5, [esi+64] \n\t" //multiply and add, result in xmm5 + " pmaddwd xmm6, [esi+80] \n\t" //multiply and add, result in xmm6 + " paddd xmm1, xmm2 \n\t" //Add into accumulator (efficiently) + " paddd xmm3, xmm4 \n\t" + " paddd xmm5, xmm6 \n\t" + " paddd xmm1, xmm3 \n\t" + " paddd xmm0, xmm5 \n\t" + " paddd xmm0, xmm1 \n\t" + " add edi, 48 \n\t" //move in complex sine by 56 bytes + " add esi, 96 \n\t" //move in IF array by 112 bytes + "loop AL%= \n\t" // Loop if not done + "AZ%=: \n\t" + "mov ecx, [ebp-16] \n\t" + "jecxz AZZ%= \n\t" + "ALL%=: \n\t" + " movq mm1, [edi] \n\t" //load IF data + " punpckldq mm1, mm1 \n\t" //copy bottom 32 bits of IF data into high 32 bits + " pmaddwd mm1, [esi] \n\t" //perform mmx complex multiply + " paddd mm0, mm1 \n\t" //add into accumulator + " add edi, 4 \n\t" //move in complex sine by 4 bytes + " add esi, 8 \n\t" //move in IF array by 8 bytes + "loop ALL%= \n\t" + "AZZ%=: \n\t" + "movdq2q mm1, xmm0 \n\t" + "punpckhqdq xmm0, xmm0 \n\t" //move bits 64..127 of xmm0 into 0..63 of xmm0 + "movdq2q mm2, xmm0 \n\t" + "paddd mm0, mm1 \n\t" //add together + "paddd mm0, mm2 \n\t" //add together + "mov eax, [ebp+20] \n\t" + "movd [eax], mm0 \n\t" + "punpckhdq mm0, mm0 \n\t" + "mov eax, [ebp+24] \n\t" + "movd [eax], mm0 \n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (B), "m" (cnt), "m" (iaccum), "m" (baccum), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edi", "%esi" + );//end __asm + + }//end if + + +} + +//!< A must hold baseband data, E,P,L must hold PRN data +void sse_prn_accum(CPX *A, CPX *E, CPX *P, CPX *L, int32 cnt, CPX *accum) +{ + + int32 cnt1; + int32 cnt2; + + cnt1 = cnt / 2; + cnt2 = (cnt - (2*cnt1)); + cnt1 = 0; + cnt2 = cnt; + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "push ebx\n\t" + "mov esi, [ebp+8] \n\t" //Address of A + "mov eax, [ebp+12] \n\t" //Address of E + "mov ebx, [ebp+16] \n\t" //Address of P + "mov edx, [ebp+20] \n\t" //Address of L + "mov ecx, [ebp-12] \n\t" //Counter 1 + "pxor mm5, mm5 \n\t" //Clear the running sum for E + "pxor mm6, mm6 \n\t" //Clear the running sum for P + "pxor mm7, mm7 \n\t" //Clear the running sum for L + "jecxz Z%= \n\t" + "L%=: \n\t" + " movq mm0, [esi] \n\t" //load IF data + " movq mm1, [eax] \n\t" //load E data + " movq mm2, [ebx] \n\t" //load P data + " movq mm3, [edx] \n\t" //load L data + " movq mm4, mm0 \n\t" //load IF data + " pand mm0, mm1 \n\t" //mask it + " pandn mm1, mm4 \n\t" //mask it + " paddsw mm5, mm1 \n\t" //add + " psubsw mm5, mm0 \n\t" //subtract + " movq mm0, mm4 \n\t" //load IF data + " pand mm0, mm2 \n\t" //mask it + " pandn mm2, mm4 \n\t" //mask it + " paddsw mm6, mm2 \n\t" //add + " psubsw mm6, mm0 \n\t" //subtract + " movq mm0, mm4 \n\t" //load IF data + " pand mm0, mm3 \n\t" //mask it + " pandn mm3, mm4 \n\t" //mask it + " paddsw mm7, mm3 \n\t" //add + " psubsw mm7, mm0 \n\t" //subtract + " add esi, 8 \n\t" //move in complex sine by 24 bytes + " add eax, 8 \n\t" //move in IF array by 48 bytes + " add ebx, 8 \n\t" //move in IF array by 48 bytes + " add edx, 8 \n\t" //move in IF array by 48 bytes + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov ecx, [ebp-16] \n\t" + "jecxz ZZ%= \n\t" + "LL%=: \n\t" + " movd mm0, [esi] \n\t" //load IF data + " movd mm1, [eax] \n\t" //load E data + " movd mm2, [ebx] \n\t" //load P data + " movd mm3, [edx] \n\t" //load L data + " movq mm4, mm0 \n\t" //load IF data + " pand mm0, mm1 \n\t" //mask it + " pandn mm1, mm4 \n\t" //mask it + " paddsw mm5, mm1 \n\t" //add + " psubsw mm5, mm0 \n\t" //subtract + " movq mm0, mm4 \n\t" //load IF data + " pand mm0, mm2 \n\t" //mask it + " pandn mm2, mm4 \n\t" //mask it + " paddsw mm6, mm2 \n\t" //add + " psubsw mm6, mm0 \n\t" //subtract + " movq mm0, mm4 \n\t" //load IF data + " pand mm0, mm3 \n\t" //mask it + " pandn mm3, mm4 \n\t" //mask it + " paddsw mm7, mm3 \n\t" //add + " psubsw mm7, mm0 \n\t" //subtract + " add esi, 4 \n\t" //move in complex sine by 24 bytes + " add eax, 4 \n\t" //move in IF array by 48 bytes + " add ebx, 4 \n\t" //move in IF array by 48 bytes + " add edx, 4 \n\t" //move in IF array by 48 bytes + "loop LL%= \n\t" //Loop if not done + "ZZ%=: \n\t" + "mov esi, [ebp+28] \n\t" + "movq mm0, mm5 \n\t" + "punpckhdq mm0, mm0 \n\t" + "paddsw mm5, mm0 \n\t" + "movd [esi], mm5 \n\t" + "add esi, 4 \n\t" + "movq mm0, mm6 \n\t" + "punpckhdq mm0, mm0 \n\t" + "paddsw mm6, mm0 \n\t" + "movd [esi], mm6 \n\t" + "add esi, 4 \n\t" + "movq mm0, mm7 \n\t" + "punpckhdq mm0, mm0 \n\t" + "paddsw mm7, mm0 \n\t" + "movd [esi], mm7 \n\t" + "pop ebx\n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (E), "m" (P), "m" (L), "m" (cnt), "m" (accum), "m" (cnt1), "m" (cnt2) + : "%eax", "%ecx", "%edx", "%esi" + );//end __asm + +} + + + +//!< A must hold baseband data, E,P,L must hold PRN data +void sse_prn_accum_new(CPX *A, MIX *E, MIX *P, MIX *L, int32 cnt, CPX_ACCUM *accum) +{ + + __asm + ( + ".intel_syntax noprefix \n\t" //Set up for loop + "push ebx\n\t" + "mov esi, [ebp+8] \n\t" //Address of A + "mov eax, [ebp+12] \n\t" //Address of E + "mov ebx, [ebp+16] \n\t" //Address of P + "mov edx, [ebp+20] \n\t" //Address of L + "mov ecx, [ebp+24] \n\t" //Value of cnt + "pxor mm5, mm5 \n\t" //Clear the running sum for E + "pxor mm6, mm6 \n\t" //Clear the running sum for P + "pxor mm7, mm7 \n\t" //Clear the running sum for L + "jecxz Z%= \n\t" + "L%=: \n\t" + " movd mm0, [esi] \n\t" //load IF data + " movq mm1, [eax] \n\t" //load E data + " movq mm2, [ebx] \n\t" //load P data + " movq mm3, [edx] \n\t" //load L data + " punpckldq mm0, mm0 \n\t" //copy low 32 bits to high 32 pits + " pmaddwd mm1, mm0 \n\t" //complex multiply E by IF + " pmaddwd mm2, mm0 \n\t" //complex multiply P by IF + " pmaddwd mm3, mm0 \n\t" //complex multiply L by IF + " paddd mm5, mm1 \n\t" //add into E accumulator + " paddd mm6, mm2 \n\t" //add into E accumulator + " paddd mm7, mm3 \n\t" //add into E accumulator + " add esi, 4 \n\t" //move in baseband data by one sample (4 bytes) + " add eax, 8 \n\t" //move in PRN-E array by one sample (8 bytes) + " add ebx, 8 \n\t" //move in PRN-P array by one sample (8 bytes) + " add edx, 8 \n\t" //move in PRN-L array by one sample (8 bytes) + "loop L%= \n\t" //Loop if not done + "Z%=: \n\t" + "mov esi, [ebp+28] \n\t" + "movq [esi], mm5 \n\t" + "add esi, 8 \n\t" + "movq [esi], mm6 \n\t" + "add esi, 8 \n\t" + "movq [esi], mm7 \n\t" + "pop ebx\n\t" + "EMMS \n\t" + ".att_syntax \n\t" + : + : "m" (A), "m" (E), "m" (P), "m" (L), "m" (cnt), "m" (accum) + : "%eax", "%ecx", "%edx", "%esi" + );//end __asm + +} + + + + + diff --git a/src/algorithms/libs/gps_sdr_simd.h b/src/algorithms/libs/gps_sdr_simd.h new file mode 100644 index 000000000..2c8177ecc --- /dev/null +++ b/src/algorithms/libs/gps_sdr_simd.h @@ -0,0 +1,68 @@ +/*! \file SIMD.h + Contains prototpyes for all the SIMD functions +*/ + +/************************************************************************************************ +Copyright 2008 Gregory W Heckler + +This file is part of the GPS Software Defined Radio (GPS-SDR) + +The GPS-SDR is free software; you can redistribute it and/or modify it under the terms of the +GNU General Public License as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GPS-SDR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License along with GPS-SDR; if not, +write to the: + +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +************************************************************************************************/ + + +#ifndef SIMD_H_ +#define SIMD_H_ + + +//#ifdef GLOBALS_HERE +// #define EXTERN +//#else +// #define EXTERN extern +//#endif + +#include "gps_sdr_defines.h" +#include "gps_sdr_signal_processing.h" + +/* Found in CPUID.cpp */ +/*----------------------------------------------------------------------------------------------*/ +bool CPU_MMX(); //!< Does the CPU support MMX? +bool CPU_SSE(); //!< Does the CPU support SSE? +bool CPU_SSE2(); //!< Does the CPU support SSE2? +bool CPU_SSE3(); //!< Does the CPU support SSE3? +bool CPU_SSSE3(); //!< Does the CPU support SSSE3? No thats not a typo! +bool CPU_SSE41(); //!< Does the CPU support SSE4.1? +bool CPU_SSE42(); //!< Does the CPU support SSE4.2? +void Init_SIMD(); //!< Initialize the global function pointers +/*----------------------------------------------------------------------------------------------*/ + +/* Found in SSE.cpp */ +/*----------------------------------------------------------------------------------------------*/ +void sse_add(int16 *A, int16 *B, int32 cnt) __attribute__ ((noinline)); //!< Pointwise vector addition +void sse_sub(int16 *A, int16 *B, int32 cnt) __attribute__ ((noinline)); //!< Pointwise vector difference +void sse_mul(int16 *A, int16 *B, int32 cnt) __attribute__ ((noinline)); //!< Pointwise vector multiply +int32 sse_dot(int16 *A, int16 *B, int32 cnt) __attribute__ ((noinline)); //!< Compute vector dot product + +void sse_conj(CPX *A, int32 cnt) __attribute__ ((noinline)); //!< Pointwise vector conjugate +void sse_cacc(CPX *A, MIX *B, int32 cnt, int32 *iaccum, int32 *baccum) __attribute__ ((noinline)); //!< Compute dot product of cpx and a mix vector +void sse_cmul(CPX *A, CPX *B, int32 cnt) __attribute__ ((noinline)); //!< Pointwise vector multiply +void sse_cmuls(CPX *A, CPX *B, int32 cnt, int32 shift) __attribute__ ((noinline)); //!< Pointwise vector multiply with shift +void sse_cmulsc(CPX *A, CPX *B, CPX *C, int32 cnt, int32 shift) __attribute__ ((noinline)); //!< Pointwise vector multiply with shift, dump results into C +void sse_prn_accum(CPX *A, CPX *E, CPX *P, CPX *L, int32 cnt, CPX *accum) __attribute__ ((noinline)); //!< This is a long story +void sse_prn_accum_new(CPX *A, MIX *E, MIX *P, MIX *L, int32 cnt, CPX_ACCUM *accum) __attribute__ ((noinline)); //!< This is a long story +void sse_max(int32 *_A, int32 *_index, int32 *_magt, int32 _cnt) __attribute__ ((noinline)); +/*----------------------------------------------------------------------------------------------*/ + + +#endif /*SIMD_H_*/ diff --git a/src/algorithms/libs/gps_sdr_x86.cc b/src/algorithms/libs/gps_sdr_x86.cc new file mode 100644 index 000000000..7cd8eabb7 --- /dev/null +++ b/src/algorithms/libs/gps_sdr_x86.cc @@ -0,0 +1,493 @@ +/*! \file x86.cpp + Emulate SIMD functionality with plain x86 crap, for older processors +*/ +/************************************************************************************************ +Copyright 2008 Gregory W Heckler + +This file is part of the GPS Software Defined Radio (GPS-SDR) + +The GPS-SDR is free software; you can redistribute it and/or modify it under the terms of the +GNU General Public License as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GPS-SDR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License along with GPS-SDR; if not, +write to the: + +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +************************************************************************************************/ + +#include "gps_sdr_x86.h" +#include "gr_complex.h" +#include + +/*----------------------------------------------------------------------------------------------*/ +void x86_add(int16 *_A, int16 *_B, int32 _cnt) +{ + + int16 *a = _A; + int16 *b = _B; + int32 lcv; + + for(lcv = 0; lcv < _cnt; lcv++) + a[lcv] += b[lcv]; + +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +void x86_sub(int16 *_A, int16 *_B, int32 _cnt) +{ + + int16 *a = _A; + int16 *b = _B; + int32 lcv; + + for(lcv = 0; lcv < _cnt; lcv++) + a[lcv] -= b[lcv]; +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +void x86_mul(int16 *_A, int16 *_B, int32 _cnt) +{ + + int16 *a = _A; + int16 *b = _B; + int32 lcv; + + for(lcv = 0; lcv < _cnt; lcv++) + a[lcv] *= b[lcv]; +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +void x86_muls(int16 *_A, int16 *_B, int32 _cnt, int32 _shift) +{ + + int32 lcv; + + for(lcv = 0; lcv < _cnt; lcv++) + { + _A[lcv] *= *_B; + _A[lcv] >>= _shift; + } +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +int32 x86_dot(int16 *_A, int16 *_B, int32 _cnt) +{ + + int32 accum = 0; + int16 *a = _A; + int16 *b = _B; + int32 lcv; + + for(lcv = 0; lcv < _cnt; lcv++) + accum += (int32)a[lcv]*(int32)b[lcv]; + + return(accum); +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +void x86_conj(CPX *_A, int32 _cnt) +{ + int32 lcv; + + for(lcv = 0; lcv < _cnt; lcv++) + _A[lcv].q = -_A[lcv].q; + +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +void x86_cmul(CPX *_A, CPX *_B, int32 _cnt) +{ + + int32 lcv; + int32 ai, aq; + int32 bi, bq; + int32 ti, tq; + + for(lcv = 0; lcv < _cnt; lcv++) + { + + ai = _A[lcv].i; + aq = _A[lcv].q; + bi = _B[lcv].i; + bq = _B[lcv].q; + + ti = ai*bi-aq*bq; + tq = ai*bq+aq*bi; + + _A[lcv].i = (int16)(ti); + _A[lcv].q = (int16)(tq); + } + +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +void x86_cmuls(CPX *_A, CPX *_B, int32 _cnt, int32 _shift) +{ + + int32 lcv; + int32 ai, aq; + int32 bi, bq; + int32 ti, tq; + int32 shift; + int32 round; + + shift = _shift; + round = 1 << (shift-1); + + for(lcv = 0; lcv < _cnt; lcv++) + { + + ai = _A[lcv].i; + aq = _A[lcv].q; + bi = _B[lcv].i; + bq = _B[lcv].q; + + ti = ai*bi-aq*bq; + tq = ai*bq+aq*bi; + + ti += round; + tq += round; + + ti >>= shift; + tq >>= shift; + + _A[lcv].i = (int16)ti; + _A[lcv].q = (int16)tq; + } + +} +/*----------------------------------------------------------------------------------------------*/ + +void x86_cmulsc_complex(std::complex *_A, std::complex *_B, std::complex *_C, int32 _cnt) { + + for(int i = 0; i < _cnt; i++) { + + _C[i] = _A[i] * _B[i]; + } + +} + +/*----------------------------------------------------------------------------------------------*/ +void x86_cmulsc(CPX *_A, CPX *_B, CPX *_C, int32 _cnt, int32 _shift) +{ + + int32 lcv; + int32 ai, aq; + int32 bi, bq; + int32 ti, tq; + int32 shift; + int32 round; + + shift = _shift; + round = 1 << (shift-1); + + for(lcv = 0; lcv < _cnt; lcv++) + { + + ai = _A[lcv].i; + aq = _A[lcv].q; + bi = _B[lcv].i; + bq = _B[lcv].q; + + ti = ai*bi-aq*bq; + tq = ai*bq+aq*bi; + + ti += round; + tq += round; + + ti >>= shift; + tq >>= shift; + + _C[lcv].i = (int16)ti; + _C[lcv].q = (int16)tq; + } + +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +void x86_cacc(CPX *_A, MIX *_B, int32 _cnt, int32 *_iaccum, int32 *_qaccum) +{ + int32 lcv; + int32 ai, aq; + int32 ti, tq; + int32 iaccum; + int32 qaccum; + + iaccum = qaccum = 0; + + for(lcv = 0; lcv < _cnt; lcv++) + { + + ai = _A[lcv].i; + aq = _A[lcv].q; + + ti = ai*_B[lcv].i+aq*_B[lcv].nq; + tq = ai*_B[lcv].q+aq*_B[lcv].ni; + + iaccum += ti; + qaccum += tq; + + } + + *_iaccum = iaccum; + *_qaccum = qaccum; + +} +/*----------------------------------------------------------------------------------------------*/ +// _A=|abs(·)|^2 overwrite the input array +void x86_gr_complex_mag(gr_complex* _A, int32 _cnt) { + float* p = (float*)_A; + + for(int i=0;i<_cnt;i++) { + *p = _A[i].real()*_A[i].real() + _A[i].imag()*_A[i].imag(); + p++; + } +} + +/*----------------------------------------------------------------------------------------------*/ +void x86_cmag(CPX *_A, int32 _cnt) +{ + + int32 lcv, *p; + + p = (int32 *)_A; + + for(lcv = 0; lcv < _cnt; lcv++) + { + *p = _A[lcv].i*_A[lcv].i + _A[lcv].q*_A[lcv].q; + p++; + } + + +} +/*----------------------------------------------------------------------------------------------*/ +// Find the maximum float in _A[·] +void x86_float_max(float* _A, unsigned int* _index, float* _magt, unsigned int _cnt) { + + unsigned int index; + float mag; + + mag = index = 0; + + for(int i=0; i<_cnt; i++) { + if(_A[i] > mag) { + index = i; + mag = _A[i]; + } + } + + *_index = index; + *_magt = mag; +} + +/*----------------------------------------------------------------------------------------------*/ +void x86_max(unsigned int *_A, unsigned int *_index, unsigned int *_magt, unsigned int _cnt) +{ + + unsigned int lcv, mag, index; + + mag = index = 0; + + for(lcv = 0; lcv < _cnt; lcv++) + { + if(_A[lcv] > mag) + { + index = lcv; + mag = _A[lcv]; + } + } + + *_index = index; + *_magt = mag; + +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +void x86_prn_accum(CPX *A, CPX *E, CPX *P, CPX *L, int32 cnt, CPX *accum) //!< This is a long story +{ + + CPX Ea, Pa, La; + int32 lcv; + + Ea.i = 0; + Ea.q = 0; + Pa.i = 0; + Pa.q = 0; + La.i = 0; + La.q = 0; + + for(lcv = 0; lcv < cnt; lcv++) + { + if(E[lcv].i < 0) + { + Ea.i -= A[lcv].i; + Ea.q -= A[lcv].q; + } + else + { + Ea.i += A[lcv].i; + Ea.q += A[lcv].q; + } + + if(P[lcv].i < 0) + { + Pa.i -= A[lcv].i; + Pa.q -= A[lcv].q; + } + else + { + Pa.i += A[lcv].i; + Pa.q += A[lcv].q; + } + + if(L[lcv].i < 0) + { + La.i -= A[lcv].i; + La.q -= A[lcv].q; + } + else + { + La.i += A[lcv].i; + La.q += A[lcv].q; + } + } + + accum[0].i = Ea.i; + accum[0].q = Ea.q; + accum[1].i = Pa.i; + accum[1].q = Pa.q; + accum[2].i = La.i; + accum[2].q = La.q; + +} +/*----------------------------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------------------------*/ +void x86_prn_accum_new(CPX *A, MIX *E, MIX *P, MIX *L, int32 cnt, CPX_ACCUM *accum) +{ + + CPX_ACCUM Ea, Pa, La; + int32 lcv; + + Ea.i = 0; Ea.q = 0; + Pa.i = 0; Pa.q = 0; + La.i = 0; La.q = 0; + + for(lcv = 0; lcv < cnt; lcv++) + { + Ea.i += A[lcv].i*E[lcv].i; + Ea.q += A[lcv].q*E[lcv].ni; + Pa.i += A[lcv].i*P[lcv].i; + Pa.q += A[lcv].q*P[lcv].ni; + La.i += A[lcv].i*L[lcv].i; + La.q += A[lcv].q*L[lcv].ni; + } + + accum[0].i = Ea.i; + accum[0].q = Ea.q; + accum[1].i = Pa.i; + accum[1].q = Pa.q; + accum[2].i = La.i; + accum[2].q = La.q; + +} +/*----------------------------------------------------------------------------------------------*/ + + +//int32 x86_acc(int16 *_A, int32 _cnt) +//{ +// +// int32 accum = 0; +// int16 *a = _A; +// int32 lcv; +// +// for(lcv = 0; lcv < _cnt; lcv++) +// accum += a[lcv]; +// +// return(accum); +//} +//void x86_crot(CPX *_A, CPX *_B, int32 _cnt) +//{ +// +// int32 lcv; +// int32 ai, aq; +// int32 bi, bq; +// int32 ti, tq; +// +// bi = _B->i; +// bq = _B->q; +// +// for(lcv = 0; lcv < _cnt; lcv++) +// { +// +// ai = _A[lcv].i; +// aq = _A[lcv].q; +// +// ti = ai*bi-aq*bq; +// tq = ai*bq+aq*bi; +// +// _A[lcv].i = (int16)ti; +// _A[lcv].q = (int16)tq; +// } +//} +// +//void x86_crot(CPX *_A, CPX *_B, int32 _shift, int32 _cnt) +//{ +// +// int32 lcv; +// int32 ai, aq; +// int32 bi, bq; +// int32 ti, tq; +// int32 shift; +// int32 round; +// +// shift = _shift; +// round = 1 << (shift-1); +// +// bi = _B->i; +// bq = _B->q; +// +// for(lcv = 0; lcv < _cnt; lcv++) +// { +// +// ai = _A[lcv].i; +// aq = _A[lcv].q; +// +// ti = ai*bi-aq*bq; +// tq = ai*bq+aq*bi; +// +// ti += round; +// tq += round; +// +// ti >>= shift; +// tq >>= shift; +// +// _A[lcv].i = (int16)ti; +// _A[lcv].q = (int16)tq; +// } +// +//} diff --git a/src/algorithms/libs/gps_sdr_x86.h b/src/algorithms/libs/gps_sdr_x86.h new file mode 100644 index 000000000..50f5df3aa --- /dev/null +++ b/src/algorithms/libs/gps_sdr_x86.h @@ -0,0 +1,21 @@ +#include "gps_sdr_defines.h" +#include "gps_sdr_signal_processing.h" +#include "gr_complex.h" + +void x86_add(int16 *A, int16 *B, int32 cnt); //!< Pointwise vector addition +void x86_sub(int16 *A, int16 *B, int32 cnt); //!< Pointwise vector difference +void x86_mul(int16 *A, int16 *B, int32 cnt); //!< Pointwise vector multiply +void x86_muls(int16 *A, int16 *B, int32 cnt, int32 shift); //!< Pointwise vector multiply +int32 x86_dot(int16 *A, int16 *B, int32 cnt); //!< Compute vector dot product + +void x86_conj(CPX *A, int32 cnt); //!< Pointwise vector conjugate +void x86_cacc(CPX *A, MIX *B, int32 cnt, int32 *iaccum, int32 *baccum); //!< Compute dot product of cpx and a mix vector +void x86_cmul(CPX *A, CPX *B, int32 cnt); //!< Pointwise vector multiply +void x86_cmuls(CPX *A, CPX *B, int32 cnt, int32 shift); //!< Pointwise complex multiply with shift +void x86_cmulsc(CPX *A, CPX *B, CPX *C, int32 cnt, int32 shift); //!< Pointwise vector multiply with shift, dump results into C +void x86_cmag(CPX *A, int32 cnt); //!< Convert from complex to a power +void x86_prn_accum(CPX *A, CPX *E, CPX *P, CPX *L, int32 cnt, CPX *accum); //!< This is a long story +void x86_prn_accum_new(CPX *A, MIX *E, MIX *P, MIX *L, int32 cnt, CPX_ACCUM *accum); //!< This is a long story +void x86_max(unsigned int *_A, unsigned int *_index, unsigned int *_magt, unsigned int _cnt); +void x86_float_max(float* _A, unsigned int* _index, float* _magt, unsigned int _cnt); +void x86_gr_complex_mag(gr_complex* _A, int32 _cnt); diff --git a/src/algorithms/libs/jamfile.jam b/src/algorithms/libs/jamfile.jam new file mode 100644 index 000000000..2f62b3800 --- /dev/null +++ b/src/algorithms/libs/jamfile.jam @@ -0,0 +1,10 @@ +project : build-dir ../../../build ; + +obj gps_sdr_signal_processing : gps_sdr_signal_processing.cc ; +obj gnss_sdr_valve : gnss_sdr_valve.cc ; +obj pass_through : pass_through.cc ; +obj gps_sdr_fft : gps_sdr_fft.cc ; +obj gps_sdr_simd : gps_sdr_simd.cc ; +obj gps_sdr_x86 : gps_sdr_x86.cc ; + + diff --git a/src/algorithms/libs/pass_through.cc b/src/algorithms/libs/pass_through.cc new file mode 100644 index 000000000..c4b861d48 --- /dev/null +++ b/src/algorithms/libs/pass_through.cc @@ -0,0 +1,104 @@ +/*! + * \file pass_through.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#include "pass_through.h" + +#include + +#include + +#include +#include + +#include "configuration_interface.h" + +using google::LogMessage; + +PassThrough::PassThrough(ConfigurationInterface* configuration, std::string role, + unsigned int in_streams, + unsigned int out_streams) : + role_(role), + in_streams_(in_streams), + out_streams_(out_streams) +{ + + std::string default_item_type = "short"; + + item_type_ = configuration->property(role + ".item_type", default_item_type); + vector_size_ = configuration->property(role + ".vector_size", 1); + + if(item_type_.compare("float") == 0) + { + item_size_ = sizeof(float); + } + else if(item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + } + else if(item_type_.compare("short") == 0) + { + item_size_ = sizeof(short); + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ << " unrecognized item type. Using float"; + item_size_ = sizeof(float); + } + + kludge_copy_ = gr_make_kludge_copy(item_size_); + DLOG(INFO) << "kludge_copy(" << kludge_copy_->unique_id() << ")"; +} + +PassThrough::~PassThrough() +{} + +void PassThrough::connect(gr_top_block_sptr top_block) +{ + DLOG(INFO) << "nothing to connect internally"; +} + +void PassThrough::disconnect(gr_top_block_sptr top_block) +{ + // Nothing to disconnect +} + +gr_basic_block_sptr PassThrough::get_left_block() +{ + return kludge_copy_; +} + +gr_basic_block_sptr PassThrough::get_right_block() +{ + return kludge_copy_; +} diff --git a/src/algorithms/libs/pass_through.h b/src/algorithms/libs/pass_through.h new file mode 100644 index 000000000..303855cd6 --- /dev/null +++ b/src/algorithms/libs/pass_through.h @@ -0,0 +1,97 @@ +/*! + * \file pass_through.h + * \brief This class represent a block that just puts its input in its + * output. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + + +#ifndef PASS_THROUGH_H_ +#define PASS_THROUGH_H_ + +#include +#include +#include + +#include "gnss_block_interface.h" + +class ConfigurationInterface; + +class PassThrough : public GNSSBlockInterface +{ + +public: + PassThrough(ConfigurationInterface* configuration, + std::string role, + unsigned int in_stream, + unsigned int out_stream); + + virtual ~PassThrough(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "PassThrough"; + } + + std::string item_type() + { + return item_type_; + } + size_t vector_size() + { + return vector_size_; + } + size_t item_size() + { + return item_size_; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + +private: + + std::string item_type_; + size_t vector_size_; + std::string role_; + unsigned int in_streams_; + unsigned int out_streams_; + + gr_kludge_copy_sptr kludge_copy_; + size_t item_size_; +}; + +#endif /*PASS_THROUGH_H_*/ diff --git a/src/algorithms/observables/adapters/gps_l1_ca_observables.cc b/src/algorithms/observables/adapters/gps_l1_ca_observables.cc new file mode 100644 index 000000000..f212287eb --- /dev/null +++ b/src/algorithms/observables/adapters/gps_l1_ca_observables.cc @@ -0,0 +1,115 @@ +/*! + * \file gps_l1_ca_observables.cc + * \brief Brief description of the file here + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#include "gps_l1_ca_observables.h" + +#include "configuration_interface.h" + +#include "gps_l1_ca_observables_cc.h" + +#include +#include +#include + +#include +#include + +/* The extern keyword declares a variable or function and specifies + * that it has external linkage (its name is visible from files other + * than the one in which it's defined). When modifying a variable, + * extern specifies that the variable has static duration (it is allocated + * when the program begins and deallocated when the program ends). + * The variable is defined in main.cc + */ +extern concurrent_queue global_gps_nav_msg_queue; + +using google::LogMessage; + +GpsL1CaObservables::GpsL1CaObservables(ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams, + gr_msg_queue_sptr queue) : + role_(role), + in_streams_(in_streams), + out_streams_(out_streams), + queue_(queue) +{ + + std::string default_dump_filename = "./observables.dat"; + + DLOG(INFO) << "role " << role; + + dump_ = configuration->property(role + ".dump", false); + dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); + fs_in_ = configuration->property(role + ".fs_in", 0); + + observables_ = gps_l1_ca_make_observables_cc(in_streams_, queue_, dump_); + observables_->set_fs_in(fs_in_); + + DLOG(INFO) << "pseudorange(" << observables_->unique_id() << ")"; + // set the navigation msg queue; + + observables_->set_navigation_queue(&global_gps_nav_msg_queue); + + DLOG(INFO) << "global navigation message queue assigned to observables ("<< observables_->unique_id() << ")"; + +} + +GpsL1CaObservables::~GpsL1CaObservables() +{} + + +void GpsL1CaObservables::connect(gr_top_block_sptr top_block) +{ + // Nothing to connect internally + DLOG(INFO) << "nothing to connect internally"; +} + +void GpsL1CaObservables::disconnect(gr_top_block_sptr top_block) +{ + // Nothing to disconnect +} + + +gr_basic_block_sptr GpsL1CaObservables::get_left_block() +{ + return observables_; +} + +gr_basic_block_sptr GpsL1CaObservables::get_right_block() +{ + return observables_; +} + diff --git a/src/algorithms/observables/adapters/gps_l1_ca_observables.h b/src/algorithms/observables/adapters/gps_l1_ca_observables.h new file mode 100644 index 000000000..8f0450b0b --- /dev/null +++ b/src/algorithms/observables/adapters/gps_l1_ca_observables.h @@ -0,0 +1,94 @@ +/*! + * \file gps_l1_ca_observables.h + * \brief Brief description of the file here + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#ifndef GPS_L1_CA_OBSERVABLES_H_ +#define GPS_L1_CA_OBSERVABLES_H_ + +#include "observables_interface.h" + +#include "gps_l1_ca_observables_cc.h" + +#include + +class ConfigurationInterface; + +class GpsL1CaObservables : public ObservablesInterface +{ + +public: + + GpsL1CaObservables(ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams, + gr_msg_queue_sptr queue); + + virtual ~GpsL1CaObservables(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "observables"; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + + void reset() + { + return; + }; + // all blocks must have an intem_size() function implementation + size_t item_size() + { + return sizeof(gr_complex); + } + +private: + + gps_l1_ca_observables_cc_sptr observables_; + bool dump_; + unsigned int fs_in_; + std::string dump_filename_; + std::string role_; + unsigned int in_streams_; + unsigned int out_streams_; + gr_msg_queue_sptr queue_; +}; + +#endif diff --git a/src/algorithms/observables/adapters/jamfile.jam b/src/algorithms/observables/adapters/jamfile.jam new file mode 100644 index 000000000..d0815af78 --- /dev/null +++ b/src/algorithms/observables/adapters/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj gps_l1_ca_observables : gps_l1_ca_observables.cc ; \ No newline at end of file diff --git a/src/algorithms/observables/gnuradio_blocks/gps_l1_ca_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/gps_l1_ca_observables_cc.cc new file mode 100644 index 000000000..943f693d9 --- /dev/null +++ b/src/algorithms/observables/gnuradio_blocks/gps_l1_ca_observables_cc.cc @@ -0,0 +1,164 @@ + +/** + * Copyright notice + */ + +/** + * Author: Javier Arribas, 2011. jarribas(at)cttc.es + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +# include + +#include +#include "math.h" + +#include "gps_l1_ca_observables_cc.h" + +#include "control_message_factory.h" + +#include + +#include +#include + +using google::LogMessage; + +using namespace std; + + +gps_l1_ca_observables_cc_sptr +gps_l1_ca_make_observables_cc(unsigned int nchannels, gr_msg_queue_sptr queue, bool dump) { + + return gps_l1_ca_observables_cc_sptr(new gps_l1_ca_observables_cc(nchannels, queue, dump)); +} + + +gps_l1_ca_observables_cc::gps_l1_ca_observables_cc(unsigned int nchannels, gr_msg_queue_sptr queue, bool dump) : + gr_block ("gps_l1_ca_observables_cc", gr_make_io_signature (nchannels, nchannels, sizeof(gnss_synchro)), + gr_make_io_signature(1, 1, sizeof(gr_complex))) { + //TODO: change output channels to have Pseudorange GNURadio signature: nchannels input (float), nchannels output (float) + // initialize internal vars + d_queue = queue; + d_dump = dump; + d_nchannels = nchannels; + d_rinex_printer.set_headers("GNSS-SDR"); //TODO: read filename from config + +} + +gps_l1_ca_observables_cc::~gps_l1_ca_observables_cc() { + +} + +bool pairCompare( pair a, pair b) +{ + return a.second.last_preamble_index < b.second.last_preamble_index; +} + +int gps_l1_ca_observables_cc::general_work (int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { + + gnss_synchro **in = (gnss_synchro **) &input_items[0]; //Get the input samples pointer + + // CONSTANTS TODO: place in a file + const float code_length_s=0.001; //1 ms + const float C_m_ms= GPS_C_m_s/1000; // The speed of light, [m/ms] + + const float nav_sol_period_ms=1000; + //--- Find number of samples per spreading code ---------------------------- + const signed int codeFreqBasis=1023000; //Hz + const signed int codeLength=1023; + const unsigned int samples_per_code = round(d_fs_in/ (codeFreqBasis / codeLength)); + + map gps_words; + map::iterator gps_words_iter; + + map pseudoranges; + map::iterator pseudoranges_iter; + + + unsigned long int min_preamble_index; + + float prn_delay_ms; + float traveltime_ms; + float pseudorange_m; + + for (unsigned int i=0; i(in[i][0].satellite_PRN,in[i][0])); //record the word structure in a map for pseudoranges + } + } + + if(gps_words.size()>0) + { + // find the minimum index (nearest satellite, will be the reference) + gps_words_iter=min_element(gps_words.begin(),gps_words.end(),pairCompare); + min_preamble_index=gps_words_iter->second.last_preamble_index; + + //compute the pseudoranges + for(gps_words_iter = gps_words.begin(); gps_words_iter != gps_words.end(); gps_words_iter++) + { + prn_delay_ms=gps_words_iter->second.prn_delay/(float)samples_per_code; + traveltime_ms=(float)(1000*(gps_words_iter->second.last_preamble_index-min_preamble_index))/(float)samples_per_code+GPS_STARTOFFSET_ms+prn_delay_ms; + //cout<<"traveltime ms"<first<<" ="<(gps_words_iter->first,pseudorange_m)); //record the preamble index in a map + } + + // write the pseudoranges to RINEX OBS file + // 1- need a valid clock + if (d_last_nav_msg.d_satellite_PRN>0) + { + std::cout<<"d_inter_frame_sec_counter="<first<<","<second<<")"<try_pop(nav_msg)==true) + { + + cout<<"New ephemeris record has arrived!"< gps_l1_ca_observables_cc_sptr; +gps_l1_ca_observables_cc_sptr +gps_l1_ca_make_observables_cc(unsigned int n_channels, gr_msg_queue_sptr queue, bool dump); + + +class gps_l1_ca_observables_cc : public gr_block { + +private: + + friend gps_l1_ca_observables_cc_sptr + gps_l1_ca_make_observables_cc(unsigned int nchannels, gr_msg_queue_sptr queue, bool dump); + + gps_l1_ca_observables_cc(unsigned int nchannels, gr_msg_queue_sptr queue, bool dump); + + // class private vars + gr_msg_queue_sptr d_queue; + bool d_dump; + + unsigned int d_nchannels; + unsigned long int d_fs_in; + + std::string d_dump_filename; + std::ofstream d_dump_file; + + concurrent_queue *d_nav_queue; // Navigation ephemeris queue + + rinex_printer d_rinex_printer; // RINEX printer class + + double d_inter_frame_sec_counter; // counter for seconds between GPS frames + + gps_navigation_message d_last_nav_msg; //last navigation message + +public: + + ~gps_l1_ca_observables_cc (); + + void set_navigation_queue(concurrent_queue *nav_queue){d_nav_queue=nav_queue;} + + void set_fs_in(unsigned long int fs_in) {d_fs_in=fs_in;}; + + int general_work (int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); + +}; + +#endif diff --git a/src/algorithms/observables/gnuradio_blocks/jamfile.jam b/src/algorithms/observables/gnuradio_blocks/jamfile.jam new file mode 100644 index 000000000..ea107ba44 --- /dev/null +++ b/src/algorithms/observables/gnuradio_blocks/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj gps_l1_ca_observables_cc : gps_l1_ca_observables_cc.cc ; \ No newline at end of file diff --git a/src/algorithms/observables/jamfile.jam b/src/algorithms/observables/jamfile.jam new file mode 100644 index 000000000..426519164 --- /dev/null +++ b/src/algorithms/observables/jamfile.jam @@ -0,0 +1,3 @@ +build-project adapters ; +build-project gnuradio_blocks ; +build-project libs ; \ No newline at end of file diff --git a/src/algorithms/observables/libs/jamfile.jam b/src/algorithms/observables/libs/jamfile.jam new file mode 100644 index 000000000..17c357eeb --- /dev/null +++ b/src/algorithms/observables/libs/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj rinex_2_1_printer : rinex_2_1_printer.cc ; \ No newline at end of file diff --git a/src/algorithms/observables/libs/rinex_2_1_printer.cc b/src/algorithms/observables/libs/rinex_2_1_printer.cc new file mode 100644 index 000000000..f9eadecd3 --- /dev/null +++ b/src/algorithms/observables/libs/rinex_2_1_printer.cc @@ -0,0 +1,314 @@ +#include "rinex_2_1_printer.h" + + +void rinex_printer::set_headers(std::string file_name) +{ + + correccio_primera_obs=1; + + fp_rin = fopen((file_name+".09o").c_str(),"wt"); + fp_rin_end = ftell(fp_rin); + + fp_rin2 = fopen((file_name+".09n").c_str(),"wt"); + fp_rin_end2 = ftell(fp_rin2); + + // write RINEX headers + Rinex2ObsHeader(); + Rinex2NavHeader(); + +} + +rinex_printer::rinex_printer () +{ +} + +rinex_printer::~rinex_printer () +{ + fclose(fp_rin); + fclose(fp_rin2); +} + +void rinex_printer::Rinex2NavHeader() +{ + + if(fp_rin2 != NULL) + { + //calculate UTC_TIME + time_t tiempo; + char cad[80]; + struct tm *tmPtr; + tiempo = time(NULL); + tmPtr = gmtime(&tiempo); + strftime( cad, 20, "%d-%b-%y %H:%M", tmPtr ); + + fseek(fp_rin2, fp_rin_end2, SEEK_SET); + //fprintf(fp_rin2,"----|---1|0---|---2|0---|---3|0---|---4|0---|---5|0---|---6|0---|---7|0---|---8|\n\n"); + fprintf(fp_rin2," 2.10 NAVIGATION DATA RINEX VERSION / TYPE\n"); + fprintf(fp_rin2,"GNSS-SDR-mercurio CTTC %s PGM / RUN BY / DATE\n",cad); + //fprintf(fp_rin2,"CTTC MARKER NAME\n"); + //fprintf(fp_rin2,"0000 MARKERNUMBER\n"); + fp_rin_end2 = ftell(fp_rin2); + correccio_primera_obs=1; + } +} + +void rinex_printer::LogRinex2Nav(gps_navigation_message nav_msg){ + + + if(fp_rin2 != NULL) + { + //double decimalday,daydecimalhour,decimalhour,decimalmin,decimalsec; + //double day,hour,minutes,seconds,enterseconds,a; + double gpstime; + struct tm *tmPtr; + time_t temps; + //1-Calcul data i hora gps + //Calculo el any,mes i dia a partir de l'hora UTC + //calculate UTC_TIME + char cad1[80]; + char cad2[80]; + //calculate date of gps time: + double setmanes=nav_msg.d_GPS_week+1024; + //Days & weeks between 00h 1 Jan 1970 and 00h 6 Jan 1980 + //520 weeks and 12 days. + gpstime=nav_msg.d_master_clock; + temps=(520+setmanes)*7*24*3600+gpstime+17*24*3600; + + tmPtr = gmtime(&temps); + strftime( cad1, 20, "%y %m %d", tmPtr ); + //std::cout<<"gps_time="<tm_hour,(double)tmPtr->tm_min,(double)tmPtr->tm_sec); + + if(correccio_primera_obs==1){ + //Escriure CORRECCIO DE TEMPS GPS a0 i a1; + fseek(fp_rin2, fp_rin_end2, SEEK_SET); + char correction[256],correction2[256]; + double A0,A1; + /* 8.3819D-09 -7.4506D-09 -5.9605D-08 5.9605D-08 ION ALPHA + 8.8 064D+04 -3.2768D+04 -1.9661D+05 1.9661D+05 ION BETA + 5. 587935447693D-09 8.881784197001D-15 233472 1518 DELTA-UTC: A0,A1,T,W*/ + A0=587.935447693E-09; + A1=8.881784197001E-15; + sprintf(correction,"%19.12E",A0); + sprintf(correction2,"%19.12E",A1); + double alpha0,alpha1,alpha2,alpha3,beta0,beta1,beta2,beta3; + alpha0=8.3819E-09; + alpha1=-7.4506E-09; + alpha2=-5.9605E-08; + alpha3=5.9605E-08; + beta0=064E+04; + beta1=-3.2768E+04; + beta2=-1.9661E+05; + beta3= 1.9661E+05; + //Format(&correction[0],1); + //Format(&correction2[0],1); + //fp_rin_correction_time = ftell(fp_rin2); + // fprintf(fp_rin2," %12.4E%12.4E%12.4E%12.4E ION ALPHA\n",alpha0,alpha1,alpha2,alpha3); + // fprintf(fp_rin2," %12.4E%12.4E%12.4E%12.4E ION BETA\n",beta0,beta1,beta2,beta3); + fprintf(fp_rin2," %s%s%9.0f%9d DELTA-UTC: A0,A1,T,W\n",correction,correction2,gpstime,(int)nav_msg.d_GPS_week+1024); + fprintf(fp_rin2," 15 LEAP SECONDS\n"); + + fprintf(fp_rin2," END OF HEADER\n"); + fp_rin_end2 = ftell(fp_rin2); + correccio_primera_obs=0; + + } + + //preparacio lines de efemerides per imprimir!!! + char linia0[256],linia1[256],linia2[256],linia3[256],linia4[256],linia5[256],linia6[256],linia7[256]; + char idef[256]; + sprintf(idef,"%2.0d",nav_msg.d_satellite_PRN); + + sprintf(linia0,"%19.12E%19.12E%19.12E",nav_msg.d_A_f0,nav_msg.d_A_f1,nav_msg.d_A_f2); + + sprintf(linia1,"%19.12E%19.12E%19.12E%19.12E",nav_msg.d_IODE_SF2,nav_msg.d_Crs,nav_msg.d_Delta_n,nav_msg.d_M_0); + sprintf(linia2,"%19.12E%19.12E%19.12E%19.12E",nav_msg.d_Cuc,nav_msg.d_e_eccentricity,nav_msg.d_Cus,nav_msg.d_sqrt_A); + sprintf(linia3,"%19.12E%19.12E%19.12E%19.12E",nav_msg.d_Toe,nav_msg.d_Cic,nav_msg.d_OMEGA0,nav_msg.d_Cis); + sprintf(linia4,"%19.12E%19.12E%19.12E%19.12E",nav_msg.d_i_0,nav_msg.d_Crc,nav_msg.d_OMEGA,nav_msg.d_OMEGA_DOT); + + sprintf(linia5,"%19.12E%19.12E%19.12E%19.12E",nav_msg.d_IDOT,0.0,nav_msg.d_GPS_week+1024.0,0.0);//CodeL2, L2pData + sprintf(linia6,"%19.12E%19.12E%19.12E%19.12E",nav_msg.d_SV_accuracy,nav_msg.d_SV_health,nav_msg.d_TGD,nav_msg.d_IODC); + sprintf(linia7,"%19.12E%19.12E",nav_msg.d_TOW,0.0); //fit interval is set to 0 + + fseek(fp_rin2, fp_rin_end2, SEEK_SET); + + fprintf(fp_rin2,"%s %s %s%s\n",idef,cad1,cad2,linia0); + + fprintf(fp_rin2," %s\n",linia1); + + fprintf(fp_rin2," %s\n",linia2); + + fprintf(fp_rin2," %s\n",linia3); + + fprintf(fp_rin2," %s\n",linia4); + + fprintf(fp_rin2," %s\n",linia5); + + fprintf(fp_rin2," %s\n",linia6); + + fprintf(fp_rin2," %s\n",linia7); + fp_rin_end2 = ftell(fp_rin2); + } + +} + +void rinex_printer::Rinex2ObsHeader() +{ + //Clock_S *pClock = &tNav.master_clock; /* Clock solution */ + if(fp_rin != NULL) + { + //calculate UTC_TIME + time_t tiempo; + char cad[80]; + struct tm *tmPtr; + tiempo = time(NULL); + tmPtr = gmtime(&tiempo); + strftime( cad, 24, "%d/%m/%Y %H:%M:%S", tmPtr ); + + fseek(fp_rin, fp_rin_end, SEEK_SET); + //fprintf(fp_rin,"----|---1|0---|---2|0---|---3|0---|---4|0---|---5|0---|---6|0---|---7|0---|---8|\n\n"); + fprintf(fp_rin," 2.10 Observation G (GPS) RINEX VERSION / TYPE\n"); + fprintf(fp_rin,"GNSS-SDR-mercurio CTTC %s PGM / RUN BY / DATE\n",cad); + fprintf(fp_rin,"CTTC MARKER NAME\n"); + //fprintf(fp_rin,"0000 MARKERNUMBER\n"); + + fprintf(fp_rin,"JAVIER ARRIBAS CTTC OBSERVER / AGENCY\n"); + fprintf(fp_rin,"GNSS-SDR-mercurio SDR 1.0 REC # / TYPE / VERS\n"); + fprintf(fp_rin,"0000000000 CTTC00000.00 ANT # / TYPE\n"); + fprintf(fp_rin," 4797642.2790 166436.1500 4185504.6370 APPROX POSITION XYZ\n"); + fprintf(fp_rin," 0.0000 0.0000 0.0000 ANTENNA: DELTA H/E/N\n"); + fprintf(fp_rin," 1 0 WAVELENGTH FACT L1/2\n"); + fprintf(fp_rin," 2 C1 L1 # / TYPES OF OBSERV\n"); + + fprintf(fp_rin," 0.1000 INTERVAL\n"); + //INTRODUIR HORA PRIMERA OBSERVACIO + //ho escriure un cop hagi adquirit dades + //fprintf(fp_rin," 2001 3 24 13 10 36.0000000 TIME OF FIRST OBS\n"); + //fprintf(fp_rin," END OF HEADER\n"); + fp_rin_end = ftell(fp_rin); + temps_primera_obs=1; + } + +} + +void rinex_printer::LogRinex2Obs(gps_navigation_message nav_msg,double interframe_seconds, std::map pseudoranges) +{ + int ss; + char sat_vis[36]; + for(int i=0;i<36;i++) sat_vis[i]=' '; + char packet[80]; + int index=0; + char cad[2]; + double setmanes; + std::map::iterator pseudoranges_iter; + + //necessito + //1-Data i hora<--- de struct Clock_S + //2-#sat visibles, identificador dat visibles-----> de Com fa a LogNav() // (Chan_Packet_S *) &tChan[lcv]->sv + //3-pseudodistancia de cada satèl·lit ----> Com fa a LogPseudo(), tb es pot treure la carrier_phase. Serveix per algo?? + //4- El punt 1 i 2 s'han d'escriure a la mateixa línia. El punt 3 una línia per a cada satèl·lit. + if(fp_rin != NULL) + { + setmanes=nav_msg.d_GPS_week + 1024; + //1-Calcul data i hora gps + //Calculo el any,mes i dia a partir de l'hora UTC + //calculate UTC_TIME + time_t temps; + char cad1[80]; + char cad2[80]; + char cad3[80]; + char cad4[80]; + struct tm *tmPtr; + //Calculo hora, minut, segons a partir de pClocK.time =hora GPS + double decimalday,daydecimalhour,decimalhour,decimalmin,decimalsec; + double day,hour,minutes,seconds,enterseconds,a; + double gpstime; + gpstime=nav_msg.d_master_clock; + //calculate date of gps time: + //Days & weeks between 00h 1 Jan 1970 and 00h 6 Jan 1980 + //520 weeks and 12 days. + + temps=(520+setmanes)*7*24*3600+gpstime+17*24*3600; + tmPtr = gmtime(&temps); + strftime( cad1, 20, " %y %m %d", tmPtr ); + strftime( cad2, 20, " %Y %m %d", tmPtr ); + decimalday=((gpstime+interframe_seconds)/(24*3600));//Dies dins de la semana + daydecimalhour=modf(decimalday,&day);//day=#dies sencers, daydecimalhour=porcio de dia + daydecimalhour=daydecimalhour*24;//porcio de dia en hores + decimalhour=modf(daydecimalhour,&hour);//hour=hora del dia; decimalhour=porcio d'hora + decimalmin=decimalhour*60;//decimalmin=minuts del dia amb decimal + decimalsec=modf(decimalmin,&minutes);//minutes=minuts del dia enters,decimalsec=porcio de minuts + seconds=decimalsec*60;//seconds=segons del dia en decimal + + a=modf(seconds,&enterseconds); + sprintf(cad4,"%6.0f%6.0f%13.7f",hour,minutes,seconds); + sprintf(cad3," %2.0f %2.0f%11.7f",hour,minutes,seconds); + + //TODO: Include receiver clock offset + if(temps_primera_obs==1){ + //Escriure Hora Primera Observació + fseek(fp_rin, fp_rin_end, SEEK_SET); + fprintf(fp_rin,"%s%s GPS TIME OF FIRST OBS\n",cad2,cad4); + fprintf(fp_rin,"00000CTTC MARKER NUMBER\n"); + //fprintf(fp_rin,"Edited by .... COMMENT\n"); + fprintf(fp_rin," END OF HEADER\n"); + fp_rin_end = ftell(fp_rin); + temps_primera_obs=0; + } + + //2-Num sat visibles i identificador + signed long int nsvs = 0; + + //3-Escriure pseudodistancia + for(pseudoranges_iter = pseudoranges.begin(); + pseudoranges_iter != pseudoranges.end(); + pseudoranges_iter++) + { + //PER FORMAT RINEX2 + nsvs++; + sprintf(cad,"%2.0f",(double)pseudoranges_iter->first); //satellite PRN ID + int k=3*index; + sat_vis[k]='G'; + sat_vis[k+1]=cad[0]; + sat_vis[k+2]=cad[1]; + index++; + } + //sat_vis tinc vector de identif de sat visibles + //Per format RINEX2 + //sprintf(packet,"%s%s 0%3d%s%12.9f",cad1,cad3,nsvs,sat_vis,offset); + sprintf(packet,"%s%s 0%3d%s",cad1,cad3,nsvs,sat_vis); + packet[69]=packet[68]; + packet[68]=' '; + fseek(fp_rin, fp_rin_end, SEEK_SET); + fprintf(fp_rin,"%s\n",packet); + fp_rin_end = ftell(fp_rin); + + //3-Escriure pseudodistancia + for(pseudoranges_iter = pseudoranges.begin(); + pseudoranges_iter != pseudoranges.end(); + pseudoranges_iter++) + { + ss=signalstrength(54.00); // TODO: include estimated signal strength + fseek(fp_rin, fp_rin_end, SEEK_SET); + fprintf(fp_rin,"%14.3f %14.3f %d\n",pseudoranges_iter->second,0.0,ss); //TODO: include the carrier phase + fp_rin_end = ftell(fp_rin); + } + } + +} + +int rinex_printer::signalstrength( double snr) +{ + int ss; + if(snr<=12.00) ss=1; + else if(snr>12.00 && snr<=18.00) ss=2; + else if(snr>18.00 && snr<=24.00) ss=3; + else if(snr>24.00 && snr<=30.00) ss=4; + else if(snr>30.00 && snr<=36.00) ss=5; + else if(snr>36.00 && snr<=42.00) ss=6; + else if(snr>42.00 && snr<=48.00) ss=7; + else if(snr>48.00 && snr<=54) ss=8; + else if(snr>=54.00) ss=9; + return (ss); +} diff --git a/src/algorithms/observables/libs/rinex_2_1_printer.h b/src/algorithms/observables/libs/rinex_2_1_printer.h new file mode 100644 index 000000000..9c73d425a --- /dev/null +++ b/src/algorithms/observables/libs/rinex_2_1_printer.h @@ -0,0 +1,52 @@ +/** + * Copyright notice + */ + +/** + * Author: Javier Arribas, 2011. jarribas(at)cttc.es + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + */ + +#ifndef RINEX_PRINTER_H_ +#define RINEX_PRINTER_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gps_navigation_message.h" + +class rinex_printer +{ +private: + int temps_primera_obs; //per saber si he escrit el temps de la primera observació. + int correccio_primera_obs; //per saber si he escrit l correccio de temps de la primera observació. + int primeravegada;//per evitar problemes primera pseudodistancia + int PERMIS_RINEX; //PER DEIXAR ESCRIURE PER PRIMERA VEGADA AL RINEX + + FILE *fp_rin; //!< RINEX OBS FILE Output + FILE *fp_rin2; //!< RINEX NAV FILE Output + unsigned long int fp_rin_end; //!< Hold place of last RINEX OBS FILE pointer, minus the header + unsigned long int fp_rin_end2; //!< Hold place of last RINEX NAV FILE pointer, minus the header + + int signalstrength( double snr); + void Rinex2ObsHeader(); + void Rinex2NavHeader(); + +public: + + void set_headers(std::string file_name); + void LogRinex2Nav(gps_navigation_message nav_msg); + void LogRinex2Obs(gps_navigation_message nav_msg,double interframe_seconds, std::map pseudoranges); + rinex_printer(); + ~rinex_printer(); +}; + +#endif diff --git a/src/algorithms/output_filter/adapters/file_output_filter.cc b/src/algorithms/output_filter/adapters/file_output_filter.cc new file mode 100644 index 000000000..da1fb1b5c --- /dev/null +++ b/src/algorithms/output_filter/adapters/file_output_filter.cc @@ -0,0 +1,105 @@ +/*! + * \file file_output_filter.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#include "file_output_filter.h" + +#include +#include + +#include + +#include "configuration_interface.h" + +using google::LogMessage; + +FileOutputFilter::FileOutputFilter(ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams) : + role_(role), + in_streams_(in_streams), + out_streams_(out_streams) +{ + + std::string default_filename = "./data/signal.dat"; + std::string default_item_type = "short"; + + filename_ = configuration->property(role + ".filename", default_filename); + item_type_ = configuration->property(role + ".item_type", default_item_type); + + if(item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + } + else if(item_type_.compare("float") == 0) + { + item_size_ = sizeof(float); + } + else if(item_type_.compare("short") == 0) + { + item_size_ = sizeof(short); + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ << " Unrecognized item type. Using short."; + item_size_ = sizeof(short); + } + + file_sink_ = gr_make_file_sink(item_size_, filename_.c_str()); + + DLOG(INFO) << "file sink(" << file_sink_->unique_id() << ")"; +} + +FileOutputFilter::~FileOutputFilter() +{} + +void FileOutputFilter::connect(gr_top_block_sptr top_block) +{ + DLOG(INFO) << "nothing to connect internally"; +} + +void FileOutputFilter::disconnect(gr_top_block_sptr top_block) +{ + // Nothing to disconnect internally +} + +gr_basic_block_sptr FileOutputFilter::get_left_block() +{ + return file_sink_; +} + +gr_basic_block_sptr FileOutputFilter::get_right_block() +{ + return file_sink_; +} diff --git a/src/algorithms/output_filter/adapters/file_output_filter.h b/src/algorithms/output_filter/adapters/file_output_filter.h new file mode 100644 index 000000000..466957069 --- /dev/null +++ b/src/algorithms/output_filter/adapters/file_output_filter.h @@ -0,0 +1,86 @@ +/*! + * \file file_output_filter.h + * \brief This class represents an output filter that sends its output + * to a file without any change in the data format. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#ifndef GNSS_SDR_FILE_OUTPUT_FILTER_H_ +#define GNSS_SDR_FILE_OUTPUT_FILTER_H_ + +#include "gnss_block_interface.h" + +#include + +class ConfigurationInterface; + +class FileOutputFilter : public GNSSBlockInterface +{ + +public: + FileOutputFilter(ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams); + + virtual ~FileOutputFilter(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "FileOutputFilter"; + } + size_t item_size() + { + return item_size_; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + +private: + + gr_file_sink_sptr file_sink_; + size_t item_size_; + + std::string filename_; + std::string item_type_; + std::string role_; + unsigned int in_streams_; + unsigned int out_streams_; +}; + +#endif /*GNSS_SDR_FILE_OUTPUT_FILTER_H_*/ diff --git a/src/algorithms/output_filter/adapters/jamfile.jam b/src/algorithms/output_filter/adapters/jamfile.jam new file mode 100644 index 000000000..8bedf4aef --- /dev/null +++ b/src/algorithms/output_filter/adapters/jamfile.jam @@ -0,0 +1,4 @@ +project : build-dir ../../../../build ; + +obj file_output_filter : file_output_filter.cc ; +obj null_sink_output_filter : null_sink_output_filter.cc ; \ No newline at end of file diff --git a/src/algorithms/output_filter/adapters/null_sink_output_filter.cc b/src/algorithms/output_filter/adapters/null_sink_output_filter.cc new file mode 100644 index 000000000..8961b3237 --- /dev/null +++ b/src/algorithms/output_filter/adapters/null_sink_output_filter.cc @@ -0,0 +1,102 @@ +/*! + * \file null_sink_output_filter.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#include "null_sink_output_filter.h" + +#include +#include + +#include + +#include "configuration_interface.h" + +using google::LogMessage; + +NullSinkOutputFilter::NullSinkOutputFilter(ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams) : + role_(role), + in_streams_(in_streams), + out_streams_(out_streams) +{ + + std::string default_item_type = "short"; + item_type_ = configuration->property(role + ".item_type", default_item_type); + + if(item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + } + else if(item_type_.compare("short") == 0) + { + item_size_ = sizeof(short); + } + else if(item_type_.compare("float") == 0) + { + item_size_ = sizeof(float); + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ << " unrecognized item type. Usign float"; + item_size_ = sizeof(float); + } + + sink_ = gr_make_null_sink(item_size_); + DLOG(INFO) << "null_sink(" << sink_->unique_id() << ")"; +} + +NullSinkOutputFilter::~NullSinkOutputFilter() +{} + +void NullSinkOutputFilter::connect(gr_top_block_sptr top_block) +{ + DLOG(INFO) << "nothing to connect internally"; +} + +void NullSinkOutputFilter::disconnect(gr_top_block_sptr top_block) +{ + // Nothing to connect +} + +gr_basic_block_sptr NullSinkOutputFilter::get_left_block() +{ + return sink_; +} + +gr_basic_block_sptr NullSinkOutputFilter::get_right_block() +{ + LOG_AT_LEVEL(WARNING) << "Right block of a signal sink should not be retrieved"; + return gr_block_sptr(); +} diff --git a/src/algorithms/output_filter/adapters/null_sink_output_filter.h b/src/algorithms/output_filter/adapters/null_sink_output_filter.h new file mode 100644 index 000000000..1ee87f333 --- /dev/null +++ b/src/algorithms/output_filter/adapters/null_sink_output_filter.h @@ -0,0 +1,90 @@ +/*! + * \file null_sink_output_filter.h + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * This class represents an implementation of an output filter that + * sends its input to a null sink. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#ifndef NULL_SINK_OUTPUT_FILTER_H_ +#define NULL_SINK_OUTPUT_FILTER_H_ + +#include "gnss_block_interface.h" + +#include + +class ConfigurationInterface; + +class NullSinkOutputFilter : public GNSSBlockInterface +{ + +public: + NullSinkOutputFilter(ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams); + + virtual ~NullSinkOutputFilter(); + + std::string item_type() + { + return item_type_; + } + std::string role() + { + return role_; + } + std::string implementation() + { + return "NullSinkOutputFilter"; + } + size_t item_size() + { + return item_size_; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + +private: + + gr_block_sptr sink_; + size_t item_size_; + + std::string item_type_; + std::string role_; + + unsigned int in_streams_; + unsigned int out_streams_; +}; + +#endif /*NULL_SINK_OUTPUT_FILTER_H_*/ diff --git a/src/algorithms/output_filter/jamfile.jam b/src/algorithms/output_filter/jamfile.jam new file mode 100644 index 000000000..95bb4d61f --- /dev/null +++ b/src/algorithms/output_filter/jamfile.jam @@ -0,0 +1,2 @@ +build-project adapters ; +# build-project gnuradio_blocks ; diff --git a/src/algorithms/signal_source/adapters/file_signal_source.cc b/src/algorithms/signal_source/adapters/file_signal_source.cc new file mode 100644 index 000000000..9f05083d7 --- /dev/null +++ b/src/algorithms/signal_source/adapters/file_signal_source.cc @@ -0,0 +1,252 @@ +/*! + * \file file_signal_source.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Javier Arribas, 2011 jarribas(at)cttc.es + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "file_signal_source.h" + +#include "gnss_sdr_valve.h" +#include "configuration_interface.h" + +#include +#include + +#include +#include + +#include + +using google::LogMessage; + +FileSignalSource::FileSignalSource(ConfigurationInterface* configuration, + std::string role, unsigned int in_streams, unsigned int out_streams, + gr_msg_queue_sptr queue) : + role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_( + queue) +{ + + std::string default_filename = "./signal_samples/signal.dat"; + std::string default_item_type = "short"; + std::string default_dump_filename = "./data/signal_source.dat"; + + samples_ = configuration->property(role + ".samples", 0); + sampling_frequency_ = configuration->property(role + + ".sampling_frequency", 0); + filename_ = configuration->property(role + ".filename", default_filename); + item_type_ = configuration->property(role + ".item_type", + default_item_type); + repeat_ = configuration->property(role + ".repeat", false); + dump_ = configuration->property(role + ".dump", false); + dump_filename_ = configuration->property(role + ".dump_filename", + default_dump_filename); + enable_throttle_control_ = configuration->property(role + + ".enable_throttle_control", false); + + if (item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + } + else if (item_type_.compare("float") == 0) + { + item_size_ = sizeof(float); + } + else if (item_type_.compare("short") == 0) + { + item_size_ = sizeof(short); + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ + << " unrecognized item type. Using short."; + item_size_ = sizeof(short); + } + + file_source_ + = gr_make_file_source(item_size_, filename_.c_str(), repeat_); + DLOG(INFO) << "file_source(" << file_source_->unique_id() << ")"; + + // if samples != 0 then enable a flow valve to stop the process after n samples + if (samples_ != 0) + { + valve_ = gnss_sdr_make_valve(item_size_, samples_, queue_); + DLOG(INFO) << "valve(" << valve_->unique_id() << ")"; + } + + if (dump_) + { + sink_ = gr_make_file_sink(item_size_, dump_filename_.c_str()); + DLOG(INFO) << "file_sink(" << sink_->unique_id() << ")"; + } + + if (enable_throttle_control_) + { + throttle_ = gr_make_throttle(item_size_, sampling_frequency_); + } + DLOG(INFO) << "File source filename " << filename_; + DLOG(INFO) << "Samples " << samples_; + DLOG(INFO) << "Sampling frequency " << sampling_frequency_; + DLOG(INFO) << "Item type " << item_type_; + DLOG(INFO) << "Item size " << item_size_; + DLOG(INFO) << "Repeat " << repeat_; + DLOG(INFO) << "Dump " << dump_; + DLOG(INFO) << "Dump filename " << dump_filename_; + +} + +FileSignalSource::~FileSignalSource() +{ +} + +void FileSignalSource::connect(gr_top_block_sptr top_block) +{ + if (samples_ != 0) + { + if (enable_throttle_control_ == true) + { + top_block->connect(file_source_, 0, throttle_, 0); + DLOG(INFO) << "connected file source to throttle"; + top_block->connect(throttle_, 0, valve_, 0); + DLOG(INFO) << "connected throttle to valve"; + if (dump_) + { + top_block->connect(valve_, 0, sink_, 0); + DLOG(INFO) << "connected valve to file sink"; + } + } + else + { + top_block->connect(file_source_, 0, valve_, 0); + DLOG(INFO) << "connected file source to valve"; + if (dump_) + { + top_block->connect(valve_, 0, sink_, 0); + DLOG(INFO) << "connected valve to file sink"; + } + } + } + else + { + if (enable_throttle_control_ == true) + { + top_block->connect(file_source_, 0, throttle_, 0); + DLOG(INFO) << "connected file source to throttle"; + if (dump_) + { + top_block->connect(file_source_, 0, sink_, 0); + DLOG(INFO) << "connected file source to sink"; + } + } + else + { + if (dump_) + { + top_block->connect(file_source_, 0, sink_, 0); + DLOG(INFO) << "connected file source to sink"; + } + } + } +} + +void FileSignalSource::disconnect(gr_top_block_sptr top_block) +{ + if (samples_ != 0) + { + if (enable_throttle_control_ == true) + { + top_block->disconnect(file_source_, 0, throttle_, 0); + DLOG(INFO) << "disconnected file source to throttle"; + top_block->disconnect(throttle_, 0, valve_, 0); + DLOG(INFO) << "disconnected throttle to valve"; + if (dump_) + { + top_block->disconnect(valve_, 0, sink_, 0); + DLOG(INFO) << "disconnected valve to file sink"; + } + } + else + { + top_block->disconnect(file_source_, 0, valve_, 0); + DLOG(INFO) << "disconnected file source to valve"; + if (dump_) + { + top_block->disconnect(valve_, 0, sink_, 0); + DLOG(INFO) << "disconnected valve to file sink"; + } + } + } + else + { + if (enable_throttle_control_ == true) + { + top_block->disconnect(file_source_, 0, throttle_, 0); + DLOG(INFO) << "disconnected file source to throttle"; + if (dump_) + { + top_block->disconnect(file_source_, 0, sink_, 0); + DLOG(INFO) << "disconnected file source to sink"; + } + } + else + { + if (dump_) + { + top_block->disconnect(file_source_, 0, sink_, 0); + DLOG(INFO) << "disconnected file source to sink"; + } + } + } +} + +gr_basic_block_sptr FileSignalSource::get_left_block() +{ + LOG_AT_LEVEL(WARNING) + << "Left block of a signal source should not be retrieved"; + return gr_block_sptr(); +} + +gr_basic_block_sptr FileSignalSource::get_right_block() +{ + if (samples_ != 0) + { + return valve_; + } + else + { + if (enable_throttle_control_ == true) + { + return throttle_; + } + else + { + return file_source_; + } + } +} diff --git a/src/algorithms/signal_source/adapters/file_signal_source.h b/src/algorithms/signal_source/adapters/file_signal_source.h new file mode 100644 index 000000000..ceff45da4 --- /dev/null +++ b/src/algorithms/signal_source/adapters/file_signal_source.h @@ -0,0 +1,123 @@ +/*! + * \file file_signal_source.h + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * This class represents a file signal source. Internally it uses a GNU Radio's gr_file_source + * a a connector to the data. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef FILE_SIGNAL_SOURCE_H_ +#define FILE_SIGNAL_SOURCE_H_ + +#include "gnss_block_interface.h" + +#include +#include +#include +#include +#include + +class ConfigurationInterface; + +class FileSignalSource: public GNSSBlockInterface +{ + +public: + FileSignalSource(ConfigurationInterface* configuration, std::string role, + unsigned int in_streams, unsigned int out_streams, + gr_msg_queue_sptr queue); + + virtual ~FileSignalSource(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "FileSignalSource"; + } + size_t item_size() + { + return item_size_; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + + std::string filename() + { + return filename_; + } + std::string item_type() + { + return item_type_; + } + bool repeat() + { + return repeat_; + } + long sampling_frequency() + { + return sampling_frequency_; + } + long samples() + { + return samples_; + } + +private: + + long samples_; + long sampling_frequency_; + std::string filename_; + std::string item_type_; + bool repeat_; + bool dump_; + std::string dump_filename_; + + std::string role_; + + unsigned int in_streams_; + unsigned int out_streams_; + + gr_file_source_sptr file_source_; + gr_block_sptr valve_; + gr_block_sptr sink_; + gr_block_sptr throttle_; + + gr_msg_queue_sptr queue_; + size_t item_size_; + + // Throttle control + bool enable_throttle_control_; +}; + +#endif /*FILE_SIGNAL_SOURCE_H_*/ diff --git a/src/algorithms/signal_source/adapters/jamfile.jam b/src/algorithms/signal_source/adapters/jamfile.jam new file mode 100644 index 000000000..3930d7a67 --- /dev/null +++ b/src/algorithms/signal_source/adapters/jamfile.jam @@ -0,0 +1,4 @@ +project : build-dir ../../../../build ; + +obj file_signal_source : file_signal_source.cc ; +obj usrp1_signal_source : usrp1_signal_source.cc ; \ No newline at end of file diff --git a/src/algorithms/signal_source/adapters/usrp1_signal_source.cc b/src/algorithms/signal_source/adapters/usrp1_signal_source.cc new file mode 100644 index 000000000..67e9be80b --- /dev/null +++ b/src/algorithms/signal_source/adapters/usrp1_signal_source.cc @@ -0,0 +1,219 @@ +/*! + * \file usrp1_signal_source.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "usrp1_signal_source.h" + +#include +#include +#include + +#include "configuration_interface.h" +#include "gnss_sdr_valve.h" + +#include +#include + +using google::LogMessage; + +Usrp1SignalSource::Usrp1SignalSource(ConfigurationInterface* configuration, + std::string role, unsigned int in_stream, unsigned int out_stream, + gr_msg_queue_sptr queue) : + role_(role), in_stream_(in_stream), out_stream_(out_stream), + queue_(queue) +{ + + std::string empty = ""; + std::string default_dump_file = "./data/signal_source.dat"; + std::string default_item_type = "short"; + + which_board_ = configuration->property(role + ".which_board", 0); + decim_rate_ = configuration->property(role + ".decim_rate", 16); + nchan_ = configuration->property(role + ".nchan", 1); + mux_ = configuration->property(role + ".mux", -1); + mode_ = configuration->property(role + ".mode", 0); + fusb_block_size_ = configuration->property(role + ".fusb_block_size", 0); + fusb_nblocks_ = configuration->property(role + ".fusb_nblocks", 0); + fpga_filename_ = configuration->property(role + ".fpga_filename", empty); + firmware_filename_ = configuration->property(role + ".firmware_filename", + empty); + spec_side_ = configuration->property(role + ".spec_side", 0); + spec_subdev_ = configuration->property(role + ".spec_subdev", 0); + freq_ = configuration->property(role + ".freq", (double)1.57542e9); + gain_ = configuration->property(role + ".gain", (float)40.0); + item_type_ = configuration->property(role + ".item_type", + default_item_type); + samples_ = configuration->property(role + ".samples", 0); + dump_ = configuration->property(role + ".dump", false); + dump_filename_ = configuration->property(role + ".dump_filename", + default_dump_file); + + if (item_type_.compare("short") == 0) + { + item_size_ = sizeof(short); + usrp_source_ = usrp_make_source_s(which_board_, decim_rate_, nchan_, + mux_, mode_, fusb_block_size_, fusb_nblocks_, fpga_filename_, + firmware_filename_); + } + else if (item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + usrp_source_ = usrp_make_source_c(which_board_, decim_rate_, nchan_, + mux_, mode_, fusb_block_size_, fusb_nblocks_, fpga_filename_, + firmware_filename_); + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ + << " unrecognized item type. Using short."; + item_size_ = sizeof(short); + usrp_source_ = usrp_make_source_s(which_board_, decim_rate_, nchan_, + mux_, mode_, fusb_block_size_, fusb_nblocks_, fpga_filename_, + firmware_filename_); + } + + DLOG(INFO) << "usrp_source(" << usrp_source_->unique_id() << ")"; + + if (samples_ != 0) + { + DLOG(INFO) << "Send STOP signal after " << samples_ << " samples"; + valve_ = gnss_sdr_make_valve(item_size_, samples_, queue_); + DLOG(INFO) << "valve(" << valve_->unique_id() << ")"; + } + + if (dump_) + { + DLOG(INFO) << "Dumping output into file " << dump_filename_; + file_sink_ = gr_make_file_sink(item_size_, dump_filename_.c_str()); + DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; + } + + DLOG(INFO) << "Item size " << item_size_; + + db_base_sptr subdev = usrp_source_->selected_subdev(usrp_subdev_spec( + spec_side_, spec_subdev_)); + + DLOG(INFO) << "Subdevice name is " << subdev->side_and_name(); + DLOG(INFO) << "Subdevice frequency ranges from " << subdev->freq_min() + << " to " << subdev->freq_max(); + + mux_ = usrp_source_->determine_rx_mux_value(usrp_subdev_spec(spec_side_, + spec_subdev_)); + + DLOG(INFO) << "Mux is " << mux_; + + usrp_source_->set_mux(mux_); + + if (gain_ == -1) + { + gain_ = (subdev->gain_min() + subdev->gain_max()) / 2.0; + } + DLOG(INFO) << "Gain is " << gain_; + subdev->set_gain(gain_); + + usrp_tune_result r; + + bool ok = usrp_source_->tune(0, subdev, freq_, &r); //DDC 0 + if (!ok) + { + LOG_AT_LEVEL(FATAL) << "Could not set frequency " << freq_ + << " for USRP"; + } + DLOG(INFO) << "Frequency set to " << freq_; + DLOG(INFO) << "Decimation set to " << decim_rate_; +} + +Usrp1SignalSource::~Usrp1SignalSource() +{ +} + +void Usrp1SignalSource::connect(gr_top_block_sptr top_block) +{ + + if (samples_ != 0) + { + top_block->connect(usrp_source_, 0, valve_, 0); + DLOG(INFO) << "connected usrp source to valve"; + + if (dump_) + { + top_block->connect(valve_, 0, file_sink_, 0); + DLOG(INFO) << "connected valve to file sink"; + } + } + else + { + if (dump_) + { + top_block->connect(usrp_source_, 0, file_sink_, 0); + DLOG(INFO) << "connected usrp source to file sink"; + } + } +} + +void Usrp1SignalSource::disconnect(gr_top_block_sptr top_block) +{ + + if (samples_ != 0) + { + top_block->disconnect(usrp_source_, 0, valve_, 0); + + if (dump_) + { + top_block->disconnect(valve_, 0, file_sink_, 0); + } + } + else + { + if (dump_) + { + top_block->disconnect(usrp_source_, 0, file_sink_, 0); + } + } +} + +gr_basic_block_sptr Usrp1SignalSource::get_left_block() +{ + LOG_AT_LEVEL(WARNING) << "Trying to get signal source left block."; + return gr_basic_block_sptr(); +} + +gr_basic_block_sptr Usrp1SignalSource::get_right_block() +{ + if (samples_ != 0) + { + return valve_; + } + else + { + return usrp_source_; + } +} diff --git a/src/algorithms/signal_source/adapters/usrp1_signal_source.h b/src/algorithms/signal_source/adapters/usrp1_signal_source.h new file mode 100644 index 000000000..7dbbffaf5 --- /dev/null +++ b/src/algorithms/signal_source/adapters/usrp1_signal_source.h @@ -0,0 +1,106 @@ +/*! + * \file usrp1_signal_source.h + * \brief This class represents a USRP signal source + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef USRP1_SIGNAL_SOURCE_H_ +#define USRP1_SIGNAL_SOURCE_H_ + +#include + +#include +#include + +#include "gnss_block_interface.h" + +class ConfigurationInterface; +class usrp_source_base; +typedef boost::shared_ptr usrp_source_base_sptr; + +class Usrp1SignalSource: public GNSSBlockInterface +{ + +public: + Usrp1SignalSource(ConfigurationInterface* configuration, + std::string role, unsigned int in_stream, + unsigned int out_stream, gr_msg_queue_sptr queue); + + virtual ~Usrp1SignalSource(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "Usrp1SignalSource"; + } + size_t item_size() + { + return item_size_; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + +private: + + std::string role_; + unsigned int in_stream_; + unsigned int out_stream_; + + int which_board_; + unsigned int decim_rate_; + int nchan_; + int mux_; + int mode_; + int fusb_block_size_; + int fusb_nblocks_; + std::string fpga_filename_; + std::string firmware_filename_; + unsigned int spec_side_; + unsigned int spec_subdev_; + double freq_; + float gain_; + std::string item_type_; + size_t item_size_; + long samples_; + bool dump_; + std::string dump_filename_; + + usrp_source_base_sptr usrp_source_; + gr_block_sptr valve_; + gr_block_sptr file_sink_; + gr_msg_queue_sptr queue_; +}; + +#endif /*USRP1_SIGNAL_SOURCE_H_*/ diff --git a/src/algorithms/signal_source/jamfile.jam b/src/algorithms/signal_source/jamfile.jam new file mode 100644 index 000000000..95bb4d61f --- /dev/null +++ b/src/algorithms/signal_source/jamfile.jam @@ -0,0 +1,2 @@ +build-project adapters ; +# build-project gnuradio_blocks ; diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.cc new file mode 100644 index 000000000..e6b342eb1 --- /dev/null +++ b/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.cc @@ -0,0 +1,127 @@ +/*! + * \file gps_navigation.cc + * \brief Brief description of the file here + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#include "gps_l1_ca_telemetry_decoder.h" + +#include "configuration_interface.h" + +#include "gps_l1_ca_telemetry_decoder_cc.h" + +#include +#include +#include + +#include +#include + +/* The extern keyword declares a variable or function and specifies + * that it has external linkage (its name is visible from files other + * than the one in which it's defined). When modifying a variable, + * extern specifies that the variable has static duration (it is allocated + * when the program begins and deallocated when the program ends). + * The variable is defined in main.cc + */ +extern concurrent_queue global_gps_nav_msg_queue; + +using google::LogMessage; + +GpsL1CaTelemetryDecoder::GpsL1CaTelemetryDecoder(ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams, + gr_msg_queue_sptr queue) : + role_(role), + in_streams_(in_streams), + out_streams_(out_streams), + queue_(queue) +{ + + std::string default_item_type = "gr_complex"; + std::string default_dump_filename = "./navigation.dat"; + + DLOG(INFO) << "role " << role; + DLOG(INFO) << "vector length " << vector_length_; + + item_type_ = configuration->property(role + ".item_type", default_item_type); + + vector_length_ = configuration->property(role + ".vector_length", 2048); + dump_ = configuration->property(role + ".dump", false); + dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); //unused! + + + if(item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + telemetry_decoder_ = gps_l1_ca_make_telemetry_decoder_cc(satellite_, 0, 0, vector_length_, queue_, dump_); // TODO fix me + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ << " unknown navigation item type."; + } + + DLOG(INFO) << "telemetry_decoder(" << telemetry_decoder_->unique_id() << ")"; + + // set the navigation msg queue; + + telemetry_decoder_->set_navigation_queue(&global_gps_nav_msg_queue); + + DLOG(INFO) << "global navigation message queue assigned to telemetry_decoder ("<< telemetry_decoder_->unique_id() << ")"; +} + +GpsL1CaTelemetryDecoder::~GpsL1CaTelemetryDecoder() +{} + + +void GpsL1CaTelemetryDecoder::connect(gr_top_block_sptr top_block) +{ + // Nothing to connect internally + DLOG(INFO) << "nothing to connect internally"; +} + +void GpsL1CaTelemetryDecoder::disconnect(gr_top_block_sptr top_block) +{ + // Nothing to disconnect +} + + +gr_basic_block_sptr GpsL1CaTelemetryDecoder::get_left_block() +{ + return telemetry_decoder_; +} + +gr_basic_block_sptr GpsL1CaTelemetryDecoder::get_right_block() +{ + return telemetry_decoder_; +} + diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h new file mode 100644 index 000000000..592f1b461 --- /dev/null +++ b/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h @@ -0,0 +1,103 @@ +/*! + * \file gps_navigation.h + * \brief Brief description of the file here + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#ifndef GPS_L1_CA_TELEMETRY_DECODER_H_ +#define GPS_L1_CA_TELEMETRY_DECODER_H_ + +#include "telemetry_decoder_interface.h" + +#include "gps_l1_ca_telemetry_decoder_cc.h" + +#include + +class ConfigurationInterface; + +class GpsL1CaTelemetryDecoder : public TelemetryDecoderInterface +{ + +public: + + GpsL1CaTelemetryDecoder(ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams, + gr_msg_queue_sptr queue); + + virtual ~GpsL1CaTelemetryDecoder(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "TelemetryDecoder"; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + + void set_satellite(int satellite){telemetry_decoder_->set_satellite(satellite);}; + void set_channel(int channel){telemetry_decoder_->set_channel(channel);}; + + void reset() + { + return; + }; + + size_t item_size() + { + return item_size_; + } +private: + + gps_l1_ca_telemetry_decoder_cc_sptr telemetry_decoder_; + + int satellite_; + int channel_; + size_t item_size_; + unsigned int vector_length_; + std::string item_type_; + + bool dump_; + std::string dump_filename_; + + std::string role_; + unsigned int in_streams_; + unsigned int out_streams_; + gr_msg_queue_sptr queue_; +}; + +#endif diff --git a/src/algorithms/telemetry_decoder/adapters/jamfile.jam b/src/algorithms/telemetry_decoder/adapters/jamfile.jam new file mode 100644 index 000000000..04dc83a35 --- /dev/null +++ b/src/algorithms/telemetry_decoder/adapters/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj gps_l1_ca_telemetry_decoder : gps_l1_ca_telemetry_decoder.cc ; \ No newline at end of file diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc new file mode 100644 index 000000000..6ed358729 --- /dev/null +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -0,0 +1,239 @@ +/*! + * Navigation message demodulator based on the Kay Borre book MATLAB-based GPS receiver + */ + +/** + * Copyright notice + */ + +/** + * Author: Javier Arribas, 2011. jarribas(at)cttc.es + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gps_l1_ca_telemetry_decoder_cc.h" + +#include "control_message_factory.h" + +#include +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +gps_l1_ca_telemetry_decoder_cc_sptr +gps_l1_ca_make_telemetry_decoder_cc(unsigned int satellite, long if_freq, long fs_in, unsigned + int vector_length, gr_msg_queue_sptr queue, bool dump) { + + return gps_l1_ca_telemetry_decoder_cc_sptr(new gps_l1_ca_telemetry_decoder_cc(satellite, if_freq, + fs_in, vector_length, queue, dump)); +} + +void gps_l1_ca_telemetry_decoder_cc::forecast (int noutput_items, + gr_vector_int &ninput_items_required){ + for (unsigned i = 0; i < 3; i++) { + ninput_items_required[i] =d_samples_per_bit*8; //set the required sample history + } +} + + +gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc(unsigned int satellite, long if_freq, long fs_in, unsigned + int vector_length, gr_msg_queue_sptr queue, bool dump) : + gr_block ("gps_navigation_cc", gr_make_io_signature (3, 3, sizeof(float)), + gr_make_io_signature(1, 1, sizeof(gnss_synchro))) { + // initialize internal vars + d_queue = queue; + d_dump = dump; + d_satellite = satellite; + d_vector_length = vector_length; + d_samples_per_bit=20; // it is exactly 1000*(1/50)=20 + // set the preamble + unsigned short int preambles_bits[8]=GPS_PREAMBLE; + + memcpy((unsigned short int*)this->d_preambles_bits, (unsigned short int*)preambles_bits, 8* sizeof(unsigned short int)); + + // preamble bits to sampled symbols + d_preambles_symbols=(signed int*)malloc(sizeof(signed int)*8*d_samples_per_bit); + int n=0; + for (int i=0;i<8;i++) + { + for (unsigned int j=0;j7000){ + std::cout<<"lost of frame sync"<0){ //symbol to bit + d_GPS_frame_4bytes+=1; //insert the telemetry bit in LSB + } + d_symbol_accumulator=0; + d_symbol_accumulator_counter=0; + + //******* bits to words ****** + d_frame_bit_index++; + if (d_frame_bit_index==30) + { + d_frame_bit_index=0; + //parity check + //Each word in wordbuff is composed of: + // Bits 0 to 29 = the GPS data word + // Bits 30 to 31 = 2 LSBs of the GPS word ahead. + // prepare the extended frame [-2 -1 0 ... 30] + if (d_prev_GPS_frame_4bytes & 0x00000001) + { + d_GPS_frame_4bytes=d_GPS_frame_4bytes|0x40000000; + } + if (d_prev_GPS_frame_4bytes & 0x00000002) + { + d_GPS_frame_4bytes=d_GPS_frame_4bytes|0x80000000; + } + /* Check that the 2 most recently logged words pass parity. Have to first + invert the data bits according to bit 30 of the previous word. */ + if(d_GPS_frame_4bytes & 0x40000000) + { + d_GPS_frame_4bytes ^= 0x3FFFFFC0; // invert the data bits (using XOR) + } + if (gps_word_parityCheck(d_GPS_frame_4bytes)) { + memcpy(&d_GPS_FSM.d_GPS_frame_4bytes,&d_GPS_frame_4bytes,sizeof(char)*4); + d_GPS_FSM.Event_gps_word_valid(); + d_flag_parity=true; + }else{ + d_GPS_FSM.Event_gps_word_invalid(); + d_flag_parity=false; + } + d_prev_GPS_frame_4bytes=d_GPS_frame_4bytes; // save the actual frame + d_GPS_frame_4bytes=d_GPS_frame_4bytes & 0; + }else{ + d_GPS_frame_4bytes<<=1; //shift 1 bit left the telemetry word + } + } + + // output the frame + consume_each(1); //one by one + + if ((d_sample_counter%NAVIGATION_OUTPUT_RATE_MS)==0) + { + gps_synchro.valid_word=(d_flag_frame_sync==true and d_flag_parity==true); + gps_synchro.last_preamble_index=d_preamble_index; + gps_synchro.prn_delay=in[2][0]; + gps_synchro.satellite_PRN=d_satellite+1; + gps_synchro.channel_ID=d_channel; + *out[0]=gps_synchro; + return 1; + }else{ + return 0; + } +} + + +void gps_l1_ca_telemetry_decoder_cc::set_satellite(int satellite) { + d_satellite = satellite; + d_GPS_FSM.d_satellite_PRN=satellite; + LOG_AT_LEVEL(INFO) << "Navigation Satellite set to " << d_satellite; +} + +void gps_l1_ca_telemetry_decoder_cc::set_channel(int channel) { + d_channel = channel; + d_GPS_FSM.d_channel_ID=channel; + LOG_AT_LEVEL(INFO) << "Navigation channel set to " << channel; +} + diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h new file mode 100644 index 000000000..e62e7fa0f --- /dev/null +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h @@ -0,0 +1,97 @@ + +/** + * Copyright notice + */ + +/** + * Author: Javier Arribas, 2011. jarribas(at)cttc.es + */ + +#ifndef GPS_L1_CA_TELEMETRY_DECODER_CC_H +#define GPS_L1_CA_TELEMETRY_DECODER_CC_H + +#include + +#include +//#include +#include + +#include + +#include "GPS_L1_CA.h" +#include "gps_telemetry.h" +#include "gps_l1_ca_subframe_fsm.h" + +#include "concurrent_queue.h" + +class gps_l1_ca_telemetry_decoder_cc; +typedef boost::shared_ptr gps_l1_ca_telemetry_decoder_cc_sptr; +gps_l1_ca_telemetry_decoder_cc_sptr +gps_l1_ca_make_telemetry_decoder_cc(unsigned int satellite, long if_freq, long fs_in, unsigned + int vector_length, gr_msg_queue_sptr queue, bool dump); + + +class gps_l1_ca_telemetry_decoder_cc : public gr_block { + +private: + + friend gps_l1_ca_telemetry_decoder_cc_sptr + gps_l1_ca_make_telemetry_decoder_cc(unsigned int satellite, long if_freq, long fs_in,unsigned + int vector_length, gr_msg_queue_sptr queue, bool dump); + + gps_l1_ca_telemetry_decoder_cc(unsigned int satellite, long if_freq, long fs_in,unsigned + int vector_length, gr_msg_queue_sptr queue, bool dump); + + // constants + unsigned short int d_preambles_bits[8]; + + // class private vars + + signed int *d_preambles_symbols; + unsigned int d_samples_per_bit; + long unsigned int d_sample_counter; + long unsigned int d_preamble_index; + unsigned int d_stat; + bool d_flag_frame_sync; + + // symbols + int d_symbol_accumulator; + short int d_symbol_accumulator_counter; + + //bits and frame + unsigned short int d_frame_bit_index; + unsigned int d_GPS_frame_4bytes; + unsigned int d_prev_GPS_frame_4bytes; + bool d_flag_parity; + int d_word_number; + + // navigation message vars + gps_navigation_message d_nav; + GpsL1CaSubframeFsm d_GPS_FSM; + + + gr_msg_queue_sptr d_queue; + unsigned int d_vector_length; + bool d_dump; + int d_satellite; + int d_channel; + + std::string d_dump_filename; + std::ofstream d_dump_file; + +public: + + ~gps_l1_ca_telemetry_decoder_cc(); + + void set_satellite(int satellite); + void set_channel(int channel); + + void set_navigation_queue(concurrent_queue *nav_queue){d_GPS_FSM.d_nav_queue=nav_queue;} + + int general_work (int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); + void forecast (int noutput_items, gr_vector_int &ninput_items_required); + +}; + +#endif diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/jamfile.jam b/src/algorithms/telemetry_decoder/gnuradio_blocks/jamfile.jam new file mode 100644 index 000000000..6042cbcc9 --- /dev/null +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj gps_l1_ca_telemetry_decoder_cc : gps_l1_ca_telemetry_decoder_cc.cc ; \ No newline at end of file diff --git a/src/algorithms/telemetry_decoder/jamfile.jam b/src/algorithms/telemetry_decoder/jamfile.jam new file mode 100644 index 000000000..426519164 --- /dev/null +++ b/src/algorithms/telemetry_decoder/jamfile.jam @@ -0,0 +1,3 @@ +build-project adapters ; +build-project gnuradio_blocks ; +build-project libs ; \ No newline at end of file diff --git a/src/algorithms/telemetry_decoder/libs/gps_l1_ca_subframe_fsm.cc b/src/algorithms/telemetry_decoder/libs/gps_l1_ca_subframe_fsm.cc new file mode 100644 index 000000000..d876a55dd --- /dev/null +++ b/src/algorithms/telemetry_decoder/libs/gps_l1_ca_subframe_fsm.cc @@ -0,0 +1,184 @@ + +#include "gps_l1_ca_subframe_fsm.h" + +//************ GPS WORD TO SUBFRAME DECODER STATE MACHINE ********** + +struct Ev_gps_word_valid : sc::event {}; +struct Ev_gps_word_invalid : sc::event{}; +struct Ev_gps_word_preamble : sc::event{}; + +struct gps_subframe_fsm_S0: public sc::state { +public: + // sc::transition(evento,estado_destino) + typedef sc::transition< Ev_gps_word_preamble, gps_subframe_fsm_S1 > reactions; + gps_subframe_fsm_S0(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S0 "< { +public: + typedef mpl::list, + sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S2 > > reactions; + + gps_subframe_fsm_S1(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S1 "< { +public: + typedef mpl::list, + sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S3 > > reactions; + + gps_subframe_fsm_S2(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S2 "<().gps_word_to_subframe(0); + } +}; +struct gps_subframe_fsm_S3: public sc::state { +public: + typedef mpl::list, + sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S4 > > reactions; + + gps_subframe_fsm_S3(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S3 "<().gps_word_to_subframe(1); + } +}; +struct gps_subframe_fsm_S4: public sc::state { +public: + typedef mpl::list, + sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S5 > > reactions; + + gps_subframe_fsm_S4(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S4 "<().gps_word_to_subframe(2); + } +}; +struct gps_subframe_fsm_S5: public sc::state { +public: + typedef mpl::list, + sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S6 > > reactions; + + gps_subframe_fsm_S5(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S5 "<().gps_word_to_subframe(3); + } +}; +struct gps_subframe_fsm_S6: public sc::state { +public: + typedef mpl::list, + sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S7 > > reactions; + + gps_subframe_fsm_S6(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S6 "<().gps_word_to_subframe(4); + } +}; +struct gps_subframe_fsm_S7: public sc::state { +public: + typedef mpl::list, + sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S8 > > reactions; + + gps_subframe_fsm_S7(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S7 "<().gps_word_to_subframe(5); + } +}; +struct gps_subframe_fsm_S8: public sc::state { +public: + typedef mpl::list, + sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S9 > > reactions; + + gps_subframe_fsm_S8(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S8 "<().gps_word_to_subframe(6); + } +}; +struct gps_subframe_fsm_S9: public sc::state { +public: + typedef mpl::list, + sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S10 > > reactions; + + gps_subframe_fsm_S9(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S9 "<().gps_word_to_subframe(7); + } +}; +struct gps_subframe_fsm_S10: public sc::state { +public: + typedef mpl::list, + sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S11 > > reactions; + + gps_subframe_fsm_S10(my_context ctx): my_base( ctx ){ + std::cout<<"Enter S10 "<().gps_word_to_subframe(8); + } +}; +struct gps_subframe_fsm_S11: public sc::state { +public: + typedef sc::transition< Ev_gps_word_preamble, gps_subframe_fsm_S1 > reactions; + + gps_subframe_fsm_S11(my_context ctx): my_base( ctx ){ + std::cout<<"Completed GPS Subframe!"<().gps_word_to_subframe(9); + context< GpsL1CaSubframeFsm >().gps_subframe_to_nav_msg(); //decode the subframe + // DECODE SUBFRAME + std::cout<<"Enter S11"<d_subframe); //decode the subframe + + d_nav.d_satellite_PRN=d_satellite_PRN+1; + d_nav.d_channel_ID=d_channel_ID; + + //TODO: change to subframe 5 + if (subframe_ID==3) { // if the subframe is the 5th, then + if (d_nav.satellite_validation()) // if all the satellite ephemeris parameters are good, then + { + // compute the GPS master clock + d_nav.master_clock(); + // compute the satellite current ECEF position + d_nav.satpos(); + // compute the clock error including relativistic effects + d_nav.relativistic_clock_correction(); + // Send the procesed satellite ephemeris packet + d_nav_queue->push(d_nav); + } + } + +} + +void GpsL1CaSubframeFsm::Event_gps_word_valid() +{ + this->process_event(Ev_gps_word_valid()); +} + +void GpsL1CaSubframeFsm::Event_gps_word_invalid() +{ + this->process_event(Ev_gps_word_invalid()); +} + +void GpsL1CaSubframeFsm::Event_gps_word_preamble() +{ + this->process_event(Ev_gps_word_preamble()); +} + diff --git a/src/algorithms/telemetry_decoder/libs/gps_l1_ca_subframe_fsm.h b/src/algorithms/telemetry_decoder/libs/gps_l1_ca_subframe_fsm.h new file mode 100644 index 000000000..32847f827 --- /dev/null +++ b/src/algorithms/telemetry_decoder/libs/gps_l1_ca_subframe_fsm.h @@ -0,0 +1,76 @@ +/** + * Copyright notice + */ + +/** + * Author: Javier Arribas, 2011. jarribas(at)cttc.es + */ +//************ GPS WORD TO SUBFRAME DECODER STATE MACHINE ********** +#ifndef GPS_L1_CA_SUBFRAME_FSM_H +#define GPS_L1_CA_SUBFRAME_FSM_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "concurrent_queue.h" + +#include +#include + +#include "GPS_L1_CA.h" +#include "gps_telemetry.h" +#include "gps_navigation_message.h" + +namespace sc = boost::statechart; +namespace mpl = boost::mpl; + +struct gps_subframe_fsm_S0; +struct gps_subframe_fsm_S1; +struct gps_subframe_fsm_S2; +struct gps_subframe_fsm_S3; +struct gps_subframe_fsm_S4; +struct gps_subframe_fsm_S5; +struct gps_subframe_fsm_S6; +struct gps_subframe_fsm_S7; +struct gps_subframe_fsm_S8; +struct gps_subframe_fsm_S9; +struct gps_subframe_fsm_S10; +struct gps_subframe_fsm_S11; + +class GpsL1CaSubframeFsm : public sc::state_machine< GpsL1CaSubframeFsm, gps_subframe_fsm_S0 >{ +private: + +public: + + // channel and satellite info + int d_channel_ID; + int d_satellite_PRN; + + // ephemeris queue + concurrent_queue *d_nav_queue; + // navigation message class + gps_navigation_message d_nav; + + char d_subframe[GPS_SUBFRAME_LENGTH]; + char d_GPS_frame_4bytes[GPS_WORD_LENGTH]; + + void gps_word_to_subframe(int position); + void gps_subframe_to_nav_msg(); + + //FSM EVENTS + void Event_gps_word_valid(); + void Event_gps_word_invalid(); + void Event_gps_word_preamble(); + + GpsL1CaSubframeFsm(); + +}; + +#endif diff --git a/src/algorithms/telemetry_decoder/libs/jamfile.jam b/src/algorithms/telemetry_decoder/libs/jamfile.jam new file mode 100644 index 000000000..4f303ff84 --- /dev/null +++ b/src/algorithms/telemetry_decoder/libs/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj gps_l1_ca_subframe_fsm : gps_l1_ca_subframe_fsm.cc ; \ No newline at end of file diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc new file mode 100644 index 000000000..4e2b065e2 --- /dev/null +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc @@ -0,0 +1,147 @@ +/*! + * \file gnss_tracking_a.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Javier Arribas, 2011. jarribas(at)cttc.es + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "gps_l1_ca_dll_pll_tracking.h" + +#include "configuration_interface.h" + +#include + +#include +#include + +using google::LogMessage; + +GpsL1CaDllPllTracking::GpsL1CaDllPllTracking( + ConfigurationInterface* configuration, std::string role, + unsigned int in_streams, unsigned int out_streams, + gr_msg_queue_sptr queue) : + role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_( + queue) +{ + + std::string default_item_type = "gr_complex"; + std::string default_dump_filename = "./tracking.dat"; + + DLOG(INFO) << "role " << role; + DLOG(INFO) << "vector length " << vector_length_; + + item_type_ = configuration->property(role + ".item_type", + default_item_type); + vector_length_ = configuration->property(role + ".vector_length", 2048); + fs_in_ = configuration->property(role + ".fs_in", 2048000); + if_ = configuration->property(role + ".if", 0); + dump_ = configuration->property(role + ".dump", false); + dump_filename_ = configuration->property(role + ".dump_filename", + default_dump_filename); //unused! + + + if (item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + tracking_ = gps_l1_ca_dll_pll_make_tracking_cc(satellite_, if_, + fs_in_, vector_length_, queue_, dump_); + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ << " unknown tracking item type."; + } + + DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; +} + +GpsL1CaDllPllTracking::~GpsL1CaDllPllTracking() +{ +} + +void GpsL1CaDllPllTracking::start_tracking() +{ + tracking_->start_tracking(); +} + +void GpsL1CaDllPllTracking::set_satellite(unsigned int satellite) +{ + satellite_ = satellite; + tracking_->set_satellite(satellite); + DLOG(INFO) << "satellite set to " << satellite_; +} + +void GpsL1CaDllPllTracking::set_channel(unsigned int channel) +{ + channel_ = channel; + tracking_->set_channel(channel); +} + +void GpsL1CaDllPllTracking::set_channel_queue( + concurrent_queue *channel_internal_queue) +{ + channel_internal_queue_ = channel_internal_queue; + + tracking_->set_channel_queue(channel_internal_queue_); + +} +void GpsL1CaDllPllTracking::set_prn_code_phase(signed int phase) +{ + return tracking_->set_acq_code_phase((double)phase); +} + +void GpsL1CaDllPllTracking::set_doppler_freq_shift(float phase) +{ + return tracking_->set_acq_doppler(phase); +} + +void GpsL1CaDllPllTracking::set_acq_sample_stamp( + unsigned long int sample_stamp) +{ + return tracking_->set_acq_sample_stamp(sample_stamp); +} +void GpsL1CaDllPllTracking::connect(gr_top_block_sptr top_block) +{ + //nothing to connect, now the tracking uses gr_sync_decimator +} + +void GpsL1CaDllPllTracking::disconnect(gr_top_block_sptr top_block) +{ + //nothing to disconnect, now the tracking uses gr_sync_decimator +} + +gr_basic_block_sptr GpsL1CaDllPllTracking::get_left_block() +{ + return tracking_; +} + +gr_basic_block_sptr GpsL1CaDllPllTracking::get_right_block() +{ + return tracking_; +} + diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h new file mode 100644 index 000000000..d80f27dc2 --- /dev/null +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h @@ -0,0 +1,107 @@ +/*! + * \file gnss_correlator_a.h + * \brief Brief description of the file here + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#ifndef GPS_L1_CA_DLL_PLL_TRACKING_H_ +#define GPS_L1_CA_DLL_PLL_TRACKING_H_ + +#include "tracking_interface.h" + +#include "gps_l1_ca_dll_pll_tracking_cc.h" + +#include + +class ConfigurationInterface; + + +class GpsL1CaDllPllTracking : public TrackingInterface +{ + +public: + + GpsL1CaDllPllTracking(ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams, + gr_msg_queue_sptr queue); + + virtual ~GpsL1CaDllPllTracking(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "tracking"; + } + size_t item_size() + { + return item_size_; + } + + void connect(gr_top_block_sptr top_block); + void disconnect(gr_top_block_sptr top_block); + gr_basic_block_sptr get_left_block(); + gr_basic_block_sptr get_right_block(); + + void set_satellite(unsigned int satellite); + void set_channel(unsigned int channel); + void set_prn_code_phase(signed int phase); + void set_doppler_freq_shift(float phase); + void set_channel_queue(concurrent_queue *channel_internal_queue); + + void start_tracking(); + + void set_acq_sample_stamp(unsigned long int sample_stamp); + +private: + + gps_l1_ca_dll_pll_tracking_cc_sptr tracking_; + size_t item_size_; + std::string item_type_; + unsigned int vector_length_; + unsigned int satellite_; + unsigned int channel_; + long fs_in_; + long if_; + bool dump_; + std::string dump_filename_; + + std::string role_; + unsigned int in_streams_; + unsigned int out_streams_; + gr_msg_queue_sptr queue_; + concurrent_queue *channel_internal_queue_; +}; + +#endif // GPS_L1_CA_DLL_PLL_TRACKING_H_ diff --git a/src/algorithms/tracking/adapters/jamfile.jam b/src/algorithms/tracking/adapters/jamfile.jam new file mode 100644 index 000000000..c4cdeb803 --- /dev/null +++ b/src/algorithms/tracking/adapters/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj gps_l1_ca_dll_pll_tracking : gps_l1_ca_dll_pll_tracking.cc ; \ No newline at end of file diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc new file mode 100644 index 000000000..01433c874 --- /dev/null +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc @@ -0,0 +1,424 @@ +//! Single-delta GPS L1 CA DLL+PLL tracking +/*! + * Tracking based on the Kay Borre book MATLAB-based GPS receiver + */ + +/** + * Copyright notice + */ + +/** + * Author: Javier Arribas, 2011. jarribas(at)cttc.es + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gps_l1_ca_dll_pll_tracking_cc.h" +#include "gps_sdr_signal_processing.h" + +//#include "gps_sdr_signaldef.h" +#include "gps_sdr_simd.h" +#include "gps_sdr_x86.h" + +#include "control_message_factory.h" + +#include +#include +#include +#include "math.h" + +#include + + + +#include +#include + +using google::LogMessage; + +gps_l1_ca_dll_pll_tracking_cc_sptr +gps_l1_ca_dll_pll_make_tracking_cc(unsigned int satellite, long if_freq, long fs_in, unsigned + int vector_length, gr_msg_queue_sptr queue, bool dump) { + + return gps_l1_ca_dll_pll_tracking_cc_sptr(new gps_l1_ca_dll_pll_tracking_cc(satellite, if_freq, + fs_in, vector_length, queue, dump)); +} + + +gps_l1_ca_dll_pll_tracking_cc::gps_l1_ca_dll_pll_tracking_cc(unsigned int satellite, long if_freq, long fs_in, unsigned + int vector_length, gr_msg_queue_sptr queue, bool dump) : + gr_sync_decimator ("gps_l1_ca_dll_pll_tracking_cc", gr_make_io_signature (1, 1, sizeof(gr_complex)), + gr_make_io_signature(3, 3, sizeof(float)),vector_length) { + // initialize internal vars + d_queue = queue; + d_dump = dump; + d_satellite = satellite; + d_if_freq = if_freq; + d_fs_in = fs_in; + d_vector_length = vector_length; + + // Initialize tracking variables ========================================== + //TODO: Include this setting in configuration file + + //--- DLL variables -------------------------------------------------------- + d_early_late_spc = 0.5; // Define early-late offset (in chips) + d_pdi_code = 0.001;// Summation interval for code + d_dllnoisebandwidth=2.0; //Hz + d_dlldampingratio=0.7; + calculate_lopp_coef(&d_tau1_code, &d_tau2_code, d_dllnoisebandwidth, d_dlldampingratio,1.0);// Calculate filter coefficient values + + //--- PLL variables -------------------------------------------------------- + d_pdi_carr = 0.001;// Summation interval for carrier + d_plldampingratio=0.7; + d_pllnoisebandwidth=25; + + //Calculate filter coefficient values + calculate_lopp_coef(&d_tau1_carr, &d_tau2_carr, d_pllnoisebandwidth, d_plldampingratio,0.25);// Calculate filter coefficient values + + // Initialization of local code replica + + // Get a vector with the C/A code sampled 1x/chip + d_code_length=1023; + d_ca_code=(gr_complex*)malloc(sizeof(gr_complex)*(d_code_length+2)); + + // Get space for the resampled early / prompt / late local replicas + d_early_code=(gr_complex*)malloc(sizeof(gr_complex)*d_vector_length); + // Get space for the resampled early / prompt / late local replicas + d_prompt_code=(gr_complex*)malloc(sizeof(gr_complex)*d_vector_length); + // Get space for the resampled early / prompt / late local replicas + d_late_code=(gr_complex*)malloc(sizeof(gr_complex)*d_vector_length); + + d_carr_sign=(gr_complex*)malloc(sizeof(gr_complex)*d_vector_length); + d_bb_sign=(gr_complex*)malloc(sizeof(gr_complex)*d_vector_length); + + //--- Perform initializations ------------------------------ + + // define initial code frequency basis of NCO + d_code_freq = 1023000; //Hz + // define residual code phase (in chips) + d_rem_code_phase = 0.0; + // define carrier frequency which is used over whole tracking period + // it must be set with set_acq_code_phase() and set_acq_doppler() + + // define residual carrier phase + d_rem_carr_phase = 0.0; + + // code tracking loop parameters + d_old_code_nco = 0.0; + d_old_code_error = 0.0; + + // carrier/Costas loop parameters + d_old_carr_nco = 0.0; + d_old_carr_error = 0.0; + + d_absolute_code_phase_chips = 0; + + // sample synchronization + d_sample_counter=0; + d_acq_sample_stamp=0; + + d_dump_filename="./data/trk_epr.dat"; + d_enable_tracking=false; + d_last_seg=0; +} + +void gps_l1_ca_dll_pll_tracking_cc::calculate_lopp_coef(float* tau1,float* tau2, float lbw, float zeta, float k){ + // Solve natural frequency + float Wn; + Wn = lbw*8*zeta / (4*zeta*zeta + 1); + + // solve for t1 & t2 + *tau1 = k / (Wn * Wn); + *tau2 = (2.0 * zeta) / Wn; + //std::cout<<"Tau1= "<<*tau1<d_satellite<<" received "; + d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); + d_enable_tracking=true; + std::cout<<"Tracking start on channel "<d_satellite << std::endl; +} + +/*! Tracking signal processing + * Notice that this is a class derived from gr_sync_decimator, so each of the ninput_items has vector_length samples + */ +int gps_l1_ca_dll_pll_tracking_cc::work (int noutput_items,gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { + + d_sample_counter+=d_vector_length; //count for the processed samples + if (d_enable_tracking==true){ + float carr_error; + float carr_nco; + float code_error; + float code_nco; + float tmp_E,tmp_P,tmp_L; + + const gr_complex* in = (gr_complex*) input_items[0]; + + float **out = (float **) &output_items[0]; + + // Find the size of a "block" or code period in whole samples + + // Update the phasestep based on code freq (variable) and + // sampling frequency (fixed) + d_code_phase_step = d_code_freq / d_fs_in; + + // original variable block size (MATLAB) + //d_blk_size = ceil(((float)d_code_length-d_rem_code_phase) / d_code_phase_step); + + // fixed block size (Javi) + d_blk_size = ceil((float)d_code_length*(1/1023000.0)*(float)d_fs_in); + + this->update_local_code_refs(); + this->update_local_carrier(); + + d_E_I=0.0; + d_P_I=0.0; + d_L_I=0.0; + + d_E_Q=0.0; + d_P_Q=0.0; + d_L_Q=0.0; + + for(unsigned int i=0;ihandle(cmf->GetQueueMessage(200,0)); //send stop to the control_thread + delete cmf; + std::cout<<"stop sent from tracking" << std::endl; + } + } + } + //consume_each(1); //not necesary for gr_sync_block derivates + return 1; //one group of d_vector_lenght samples at time, and output one set of results ALWAYS even in the case of d_enable_tracking==false +} + + +void gps_l1_ca_dll_pll_tracking_cc::set_acq_code_phase(float code_phase) { + d_code_phase = code_phase; + LOG_AT_LEVEL(INFO) << "Tracking code phase set to " << d_code_phase; +} + +void gps_l1_ca_dll_pll_tracking_cc::set_acq_doppler(float doppler) { + d_carrier_doppler = doppler; + d_carr_freq_basis = doppler; + LOG_AT_LEVEL(INFO) << "Tracking carrier doppler set to " << d_carrier_doppler; +} + +void gps_l1_ca_dll_pll_tracking_cc::set_satellite(unsigned int satellite) { + d_satellite = satellite; + LOG_AT_LEVEL(INFO) << "Tracking Satellite set to " << d_satellite; +} + +void gps_l1_ca_dll_pll_tracking_cc::set_channel(unsigned int channel) { + d_channel = channel; + LOG_AT_LEVEL(INFO) << "Tracking Channel set to " << d_channel; +} diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.h new file mode 100644 index 000000000..36f62c8d8 --- /dev/null +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.h @@ -0,0 +1,189 @@ +/*! + * \file gps_l1_ca_dll_pll_tracking_cc.h + * \brief Brief description of the file here + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GPS_L1_CA_DLL_PLL_TRACKING_CC_H +#define GPS_L1_CA_DLL_PLL_TRACKING_CC_H + +#include + +#include +#include +#include + +#include "gps_sdr_signal_processing.h" + +#include +#include +#include +#include "concurrent_queue.h" + +// #include "gps_sdr_structs.h" +// #include "gps_sdr_channel.h" + +class gps_l1_ca_dll_pll_tracking_cc; +typedef boost::shared_ptr + gps_l1_ca_dll_pll_tracking_cc_sptr; + +gps_l1_ca_dll_pll_tracking_cc_sptr +gps_l1_ca_dll_pll_make_tracking_cc(unsigned int satellite, long if_freq, + long fs_in, unsigned + int vector_length, + gr_msg_queue_sptr queue, bool dump); + +class gps_l1_ca_dll_pll_tracking_cc: public gr_sync_decimator +{ + +private: + + friend gps_l1_ca_dll_pll_tracking_cc_sptr + gps_l1_ca_dll_pll_make_tracking_cc(unsigned int satellite, long if_freq, + long fs_in, unsigned + int vector_length, + gr_msg_queue_sptr queue, bool dump); + + gps_l1_ca_dll_pll_tracking_cc(unsigned int satellite, long if_freq, + long fs_in, unsigned + int vector_length, gr_msg_queue_sptr queue, + bool dump); + + void calculate_lopp_coef(float* tau1, float* tau2, float lbw, float zeta, + float k); + void update_local_code_refs(); + void update_local_carrier(); + + // class private vars + gr_msg_queue_sptr d_queue; + concurrent_queue *d_channel_internal_queue; + unsigned int d_vector_length; + bool d_dump; + unsigned int d_satellite; + unsigned int d_channel; //? + int d_last_seg; + long d_if_freq; + long d_fs_in; + float d_tau1_code; + float d_tau2_code; + + float d_tau1_carr; + float d_tau2_carr; + + float d_early_late_spc; + float d_pdi_code; + float d_pdi_carr; + float d_dllnoisebandwidth; + float d_dlldampingratio; + + float d_pllnoisebandwidth; + float d_plldampingratio; + + unsigned int d_code_length; + unsigned int d_blk_size; + float d_code_phase_step; + + gr_complex* d_ca_code; + + gr_complex* d_early_code; + gr_complex* d_late_code; + gr_complex* d_prompt_code; + + gr_complex* d_carr_sign; + gr_complex* d_bb_sign; + + float d_code_freq; + float d_rem_code_phase; + + float d_rem_carr_phase; + + float d_old_code_nco; + float d_old_code_error; + + float d_old_carr_nco; + float d_old_carr_error; + + float d_code_phase; + float d_carrier_doppler; + float d_carr_freq_basis; + + //std::complex d_E; + //std::complex d_P; + //std::complex d_L; + float d_E_I; + float d_E_Q; + float d_P_I; + float d_P_Q; + float d_L_I; + float d_L_Q; + + float d_absolute_code_phase_chips; + + unsigned long int d_sample_counter; + unsigned long int d_acq_sample_stamp; + bool d_enable_tracking; + + std::string d_dump_filename; + std::ofstream d_dump_file; + +public: + + ~gps_l1_ca_dll_pll_tracking_cc(); + + void set_satellite(unsigned int satellite); + void set_channel(unsigned int channel); + void set_acq_code_phase(float code_phase); + void set_acq_doppler(float doppler); + void start_tracking(); + + void set_acq_sample_stamp(unsigned long int sample_stamp) + { + d_acq_sample_stamp = sample_stamp; + } + + void set_channel_queue(concurrent_queue *channel_internal_queue) + { + d_channel_internal_queue = channel_internal_queue; + } + + /*! + * \brief just like gr_block::general_work, only this arranges to call consume_each for you + * + * The user must override work to define the signal processing code + */ + //virtual int work (int noutput_items, + // gr_vector_const_void_star &input_items, + // gr_vector_void_star &output_items) = 0; + + int work(int noutput_items, gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + +}; + +#endif //GPS_L1_CA_DLL_PLL_TRACKING_CC_H diff --git a/src/algorithms/tracking/gnuradio_blocks/jamfile.jam b/src/algorithms/tracking/gnuradio_blocks/jamfile.jam new file mode 100644 index 000000000..56b5be0ef --- /dev/null +++ b/src/algorithms/tracking/gnuradio_blocks/jamfile.jam @@ -0,0 +1,3 @@ +project : build-dir ../../../../build ; + +obj gps_l1_ca_dll_pll_tracking_cc : gps_l1_ca_dll_pll_tracking_cc.cc ; \ No newline at end of file diff --git a/src/algorithms/tracking/jamfile.jam b/src/algorithms/tracking/jamfile.jam new file mode 100644 index 000000000..86bceb14f --- /dev/null +++ b/src/algorithms/tracking/jamfile.jam @@ -0,0 +1,2 @@ +build-project adapters ; +build-project gnuradio_blocks ; diff --git a/src/core/interfaces/acquisition_interface.h b/src/core/interfaces/acquisition_interface.h new file mode 100644 index 000000000..8f544e551 --- /dev/null +++ b/src/core/interfaces/acquisition_interface.h @@ -0,0 +1,72 @@ +/*! + * \file acquisition_interface.h + * \brief Header file of the interface to an acquisition GNSS block. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * This header file contains the interface to an abstract class + * for acquisition algorithms. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_ACQUISITION_INTERFACE_H_ +#define GNSS_SDR_ACQUISITION_INTERFACE_H_ + +#include "gnss_block_interface.h" + +templateclass concurrent_queue; + +/*! \brief This abstract class represents an interface to an acquisition GNSS block. + * + * Abstract class for acquisition algorithms. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + */ +class AcquisitionInterface: public GNSSBlockInterface +{ + +public: + + //virtual void set_active(bool active) = 0; + virtual void set_satellite(unsigned int satellite) = 0; + virtual void set_channel(unsigned int channel) = 0; + virtual void set_threshold(float threshold) = 0; + virtual void set_doppler_max(unsigned int doppler_max) = 0; + virtual void set_doppler_step(unsigned int doppler_step) = 0; + virtual void set_channel_queue(concurrent_queue *channel_internal_queue) = 0; + virtual signed int prn_code_phase() = 0; + virtual float doppler_freq_shift() = 0; + virtual signed int mag() = 0; + virtual void reset() = 0; + virtual unsigned long int get_sample_stamp() = 0; + +}; + +#endif /* GNSS_SDR_ACQUISITION_INTERFACE */ diff --git a/src/core/interfaces/channel_interface.h b/src/core/interfaces/channel_interface.h new file mode 100644 index 000000000..8dd7f4981 --- /dev/null +++ b/src/core/interfaces/channel_interface.h @@ -0,0 +1,63 @@ +/*! + * \file channel_interface.h + * \brief This class represents an interface to a channel GNSS block. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Abstract class for channel blocks. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_CHANNEL_INTERFACE_H_ +#define GNSS_SDR_CHANNEL_INTERFACE_H_ + +#include "gnss_block_interface.h" + +/*! + * \brief This abstract class represents an interface to a channel GNSS block. + * + * Abstract class for channel blocks. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + */ + +class ChannelInterface: public GNSSBlockInterface +{ + +public: + + virtual unsigned int satellite() = 0; + virtual void start_acquisition() = 0; + virtual void set_satellite(unsigned int) = 0; + virtual void start() = 0; + virtual void stop() = 0; +}; + +#endif /* GNSS_SDR_CHANNEL_INTERFACE_H_ */ diff --git a/src/core/interfaces/configuration_interface.h b/src/core/interfaces/configuration_interface.h new file mode 100644 index 000000000..51dea61cc --- /dev/null +++ b/src/core/interfaces/configuration_interface.h @@ -0,0 +1,76 @@ +/*! + * \file configuration_interface.h + * \brief This class represents an interface to configuration parameters. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * The interface defines an accessor method that gets a parameter name as input + * and returns the value of this parameter, a string, as output. + * Property names are defined here. This is an abstract class for interfaces. + * Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_CONFIGURATION_INTERFACE_H_ +#define GNSS_SDR_CONFIGURATION_INTERFACE_H_ + +#include + +/*! + * \brief This abstract class represents an interface to configuration parameters. + * + * The interface defines an accessor method that gets a parameter name as input + * and returns the value of this parameter, a string, as output. + * Property names are defined here. This is an abstract class for interfaces. + * Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + */ +class ConfigurationInterface +{ + +public: + + virtual ~ConfigurationInterface() + {} + + virtual std::string property(std::string property_name, + std::string default_value) = 0; + virtual bool property(std::string property_name, bool default_value) = 0; + virtual long property(std::string property_name, long default_value) = 0; + virtual int property(std::string property_name, int default_value) = 0; + virtual unsigned int property(std::string property_name, + unsigned int default_value) = 0; + virtual float property(std::string property_name, float default_value) = 0; + virtual double property(std::string property_name, double default_value) = 0; + + virtual void set_property(std::string property_name, std::string value) = 0; +}; + +#endif /*GNSS_SDR_CONFIGURATION_INTERFACE_H_*/ diff --git a/src/core/interfaces/gnss_block_interface.h b/src/core/interfaces/gnss_block_interface.h new file mode 100644 index 000000000..1933542e5 --- /dev/null +++ b/src/core/interfaces/gnss_block_interface.h @@ -0,0 +1,69 @@ +/*! + * \file gnss_block_interface.h + * \brief This interface represents a GNSS block. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Abstract class for GNSS block interfaces. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#ifndef GNSS_SDR_GNSS_BLOCK_INTERFACE_H_ +#define GNSS_SDR_GNSS_BLOCK_INTERFACE_H_ + +#include +#include + +/*! + * \brief This abstract class represents an interface to GNSS blocks. + * + * Abstract class for GNSS block interfaces. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + */ +class GNSSBlockInterface +{ + +public: + virtual ~GNSSBlockInterface() + {} + + virtual std::string role() = 0; + virtual std::string implementation() = 0; + virtual size_t item_size() = 0; + + virtual void connect(gr_top_block_sptr top_block) = 0; + virtual void disconnect(gr_top_block_sptr top_block) = 0; + virtual gr_basic_block_sptr get_left_block() = 0; + virtual gr_basic_block_sptr get_right_block() = 0; +}; + +#endif /*GNSS_SDR_GNSS_BLOCK_INTERFACE_H_*/ diff --git a/src/core/interfaces/observables_interface.h b/src/core/interfaces/observables_interface.h new file mode 100644 index 000000000..9c776885d --- /dev/null +++ b/src/core/interfaces/observables_interface.h @@ -0,0 +1,59 @@ +/*! + * \file pseudorange_interface.h + * \brief This class represents an interface to a navigation gnss block. + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * Abstract class for pseudorange_intefaces. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#ifndef GNSS_SDR_OBSERVABLES_INTERFACE_H_ +#define GNSS_SDR_OBSERVABLES_INTERFACE_H_ + +#include "gnss_block_interface.h" + +/*! + * \brief This abstract class represents an interface to an observables block. + * + * Abstract class for pseudorange_intefaces, derived from GNSSBlockInterface. + * Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + */ +class ObservablesInterface : public GNSSBlockInterface +{ + +public: + + virtual void reset() = 0; +}; + +#endif /* GNSS_SDR_OBSERVABLES_INTERFACE_H_ */ diff --git a/src/core/interfaces/telemetry_decoder_interface.h b/src/core/interfaces/telemetry_decoder_interface.h new file mode 100644 index 000000000..e0232667d --- /dev/null +++ b/src/core/interfaces/telemetry_decoder_interface.h @@ -0,0 +1,60 @@ +/*! + * \file navigation_interface.h + * \brief This class represents an interface to a navigation GNSS block. + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * Abstract class for navigation interfaces. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#ifndef GNSS_SDR_TELEMETRY_DECODER_INTERFACE_H_ +#define GNSS_SDR_TELEMETRY_DECODER_INTERFACE_H_ + +#include "gnss_block_interface.h" + +/*! + * \brief This abstract class represents an interface to a navigation GNSS block. + * + * Abstract class for navigation interfaces. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + */ +class TelemetryDecoderInterface : public GNSSBlockInterface +{ + +public: + + virtual void reset() = 0; + virtual void set_satellite(int satellite) = 0; + virtual void set_channel(int channel) = 0; +}; + +#endif /* GNSS_SDR_TELEMETRY_DECODER_INTERFACE_H_ */ diff --git a/src/core/interfaces/tracking_interface.h b/src/core/interfaces/tracking_interface.h new file mode 100644 index 000000000..5bf89304e --- /dev/null +++ b/src/core/interfaces/tracking_interface.h @@ -0,0 +1,68 @@ +/*! + * \file tracking_interface.h + * \brief This class represents an interface to an tracking GNSS block. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Abstract class for tracking interfaces. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#ifndef GNSS_SDR_TRACKING_INTERFACE_H_ +#define GNSS_SDR_TRACKING_INTERFACE_H_ + +#include "gnss_block_interface.h" + +templateclass concurrent_queue; + +/*! + * \brief This abstract class represents an interface to a tracking block. + * + * Abstract class for tracking interfaces. Since all its methods are virtual, + * this class cannot be instantiated directly, and a subclass can only be + * instantiated directly if all inherited pure virtual methods have been + * implemented by that class or a parent class. + * + */ +class TrackingInterface : public GNSSBlockInterface +{ + +public: + + virtual void start_tracking() = 0; + virtual void set_satellite(unsigned int satellite) = 0; + virtual void set_channel(unsigned int channel) = 0; + virtual void set_prn_code_phase(signed int phase) = 0; + virtual void set_doppler_freq_shift(float phase) = 0; + virtual void set_acq_sample_stamp(unsigned long int sample_stamp) = 0; + virtual void set_channel_queue(concurrent_queue *channel_internal_queue) = 0; + +}; + +#endif /* GNSS_SDR_TRACKING_INTERFACE_H_ */ diff --git a/src/core/jamfile.jam b/src/core/jamfile.jam new file mode 100644 index 000000000..c553919e1 --- /dev/null +++ b/src/core/jamfile.jam @@ -0,0 +1,3 @@ +build-project libs ; +build-project receiver ; +build-project system_parameters ; \ No newline at end of file diff --git a/src/core/libs/INIReader.cc b/src/core/libs/INIReader.cc new file mode 100644 index 000000000..0e3af9242 --- /dev/null +++ b/src/core/libs/INIReader.cc @@ -0,0 +1,96 @@ +/*! + * \file INIReader.cc + * \brief This class reads an INI file into easy-to-access name/value pairs. + * \author Brush Technologies, 2009. + * + * inih (INI Not Invented Here) is a simple .INI file parser written in C++. + * It's only a couple of pages of code, and it was designed to be small + * and simple, so it's good for embedded systems. To use it, just give + * ini_parse() an INI file, and it will call a callback for every + * name=value pair parsed, giving you strings for the section, name, + * and value. It's done this way because it works well on low-memory + * embedded systems, but also because it makes for a KISS implementation. + * + * ------------------------------------------------------------------------- + * inih and INIReader are released under the New BSD license: + * + * Copyright (c) 2009, Brush Technology + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Brush Technology nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRUSH TECHNOLOGY ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BRUSH TECHNOLOGY BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Go to the project home page for more info: + * + * http://code.google.com/p/inih/ + * ------------------------------------------------------------------------- + */ + +#include +#include +#include "ini.h" +#include "INIReader.h" + +using std::string; + +INIReader::INIReader(string filename) +{ + _error = ini_parse(filename.c_str(), ValueHandler, this); +} + +int INIReader::ParseError() +{ + return _error; +} + +string INIReader::Get(string section, string name, string default_value) +{ + string key = MakeKey(section, name); + return _values.count(key) ? _values[key] : default_value; +} + +long INIReader::GetInteger(string section, string name, long default_value) +{ + string valstr = Get(section, name, ""); + const char* value = valstr.c_str(); + char* end; + // This parses "1234" (decimal) and also "0x4D2" (hex) + long n = strtol(value, &end, 0); + return end > value ? n : default_value; +} + +string INIReader::MakeKey(string section, string name) +{ + string key = section + "." + name; + // Convert to lower case to make lookups case-insensitive + for (unsigned int i = 0; i < key.length(); i++) + key[i] = tolower(key[i]); + return key; +} + +int INIReader::ValueHandler(void* user, const char* section, const char* name, + const char* value) +{ + INIReader* reader = (INIReader*)user; + reader->_values[MakeKey(section, name)] = value; + return 1; +} diff --git a/src/core/libs/INIReader.h b/src/core/libs/INIReader.h new file mode 100644 index 000000000..b11a3a81b --- /dev/null +++ b/src/core/libs/INIReader.h @@ -0,0 +1,83 @@ +/*! + * \file INIReader.h + * \brief This class reads an INI file into easy-to-access name/value pairs. + * \author Brush Technologies, 2009. + * + * inih (INI Not Invented Here) is a simple .INI file parser written in C++. + * It's only a couple of pages of code, and it was designed to be small + * and simple, so it's good for embedded systems. To use it, just give + * ini_parse() an INI file, and it will call a callback for every + * name=value pair parsed, giving you strings for the section, name, + * and value. It's done this way because it works well on low-memory + * embedded systems, but also because it makes for a KISS implementation. + * + * ------------------------------------------------------------------------- + * inih and INIReader are released under the New BSD license: + * + * Copyright (c) 2009, Brush Technology + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Brush Technology nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRUSH TECHNOLOGY ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BRUSH TECHNOLOGY BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Go to the project home page for more info: + * + * http://code.google.com/p/inih/ + * ------------------------------------------------------------------------- + */ + +#ifndef __INIREADER_H__ +#define __INIREADER_H__ + +#include +#include + +// Read an INI file into easy-to-access name/value pairs. (Note that I've gone +// for simplicity here rather than speed, but it should be pretty decent.) +class INIReader +{ +public: + // Construct INIReader and parse given filename. See ini.h for more info + // about the parsing. + INIReader(std::string filename); + + // Return the result of ini_parse(), i.e., 0 on success, line number of + // first error on parse error, or -1 on file open error. + int ParseError(); + + // Get a string value from INI file, returning default_value if not found. + std::string Get(std::string section, std::string name, + std::string default_value); + + // Get an integer (long) value from INI file, returning default_value if + // not found. + long GetInteger(std::string section, std::string name, long default_value); + +private: + int _error; + std::map _values; + static std::string MakeKey(std::string section, std::string name); + static int ValueHandler(void* user, const char* section, const char* name, + const char* value); +}; + +#endif // __INIREADER_H__ diff --git a/src/core/libs/ini.cc b/src/core/libs/ini.cc new file mode 100644 index 000000000..1e125bab7 --- /dev/null +++ b/src/core/libs/ini.cc @@ -0,0 +1,176 @@ +/*! + * \file ini.cc + * \brief This function parses an INI file into easy-to-access name/value pairs. + * \author Brush Technologies, 2009. + * + * inih (INI Not Invented Here) is a simple .INI file parser written in C++. + * It's only a couple of pages of code, and it was designed to be small + * and simple, so it's good for embedded systems. To use it, just give + * ini_parse() an INI file, and it will call a callback for every + * name=value pair parsed, giving you strings for the section, name, + * and value. It's done this way because it works well on low-memory + * embedded systems, but also because it makes for a KISS implementation. + * Parse given INI-style file. May have [section]s, name=value pairs + * (whitespace stripped), and comments starting with ';' (semicolon). + * Section is "" if name=value pair parsed before any section heading. + * For each name=value pair parsed, call handler function with given user + * pointer as well as section, name, and value (data only valid for duration + * of handler call). Handler should return nonzero on success, zero on error. + * Returns 0 on success, line number of first error on parse error, or -1 on + * file open error + * + * ------------------------------------------------------------------------- + * inih and INIReader are released under the New BSD license: + * + * Copyright (c) 2009, Brush Technology + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Brush Technology nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRUSH TECHNOLOGY ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BRUSH TECHNOLOGY BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Go to the project home page for more info: + * + * http://code.google.com/p/inih/ + * ------------------------------------------------------------------------- + */ + +#include +#include +#include + +#include "ini.h" + +#define MAX_LINE 200 +#define MAX_SECTION 50 +#define MAX_NAME 50 + +/* Strip whitespace chars off end of given string, in place. Return s. */ +static char* rstrip(char* s) +{ + char* p = s + strlen(s); + while (p > s && isspace(*--p)) + *p = '\0'; + return s; +} + +/* Return pointer to first non-whitespace char in given string. */ +static char* lskip(const char* s) +{ + while (*s && isspace(*s)) + s++; + return (char*)s; +} + +/* Return pointer to first char c or ';' in given string, or pointer to + null at end of string if neither found. */ +static char* find_char_or_comment(const char* s, char c) +{ + while (*s && *s != c && *s != ';') + s++; + return (char*)s; +} + +/* Version of strncpy that ensures dest (size bytes) is null-terminated. */ +static char* strncpy0(char* dest, const char* src, size_t size) +{ + strncpy(dest, src, size); + dest[size - 1] = '\0'; + return dest; +} + +/* See documentation in header file. */ +int ini_parse(const char* filename, + int (*handler)(void*, const char*, const char*, const char*), + void* user) +{ + /* Uses a fair bit of stack (use heap instead if you need to) */ + char line[MAX_LINE]; + char section[MAX_SECTION] = ""; + char prev_name[MAX_NAME] = ""; + + FILE* file; + char* start; + char* end; + char* name; + char* value; + int lineno = 0; + int error = 0; + + file = fopen(filename, "r"); + if (!file) + return -1; + + /* Scan through file line by line */ + while (fgets(line, sizeof(line), file) != NULL) { + lineno++; + start = lskip(rstrip(line)); + +#if INI_ALLOW_MULTILINE + if (*prev_name && *start && start > line) { + /* Non-black line with leading whitespace, treat as continuation + of previous name's value (as per Python ConfigParser). */ + if (!handler(user, section, prev_name, start) && !error) + error = lineno; + } + else +#endif + if (*start == '[') { + /* A "[section]" line */ + end = find_char_or_comment(start + 1, ']'); + if (*end == ']') { + *end = '\0'; + strncpy0(section, start + 1, sizeof(section)); + *prev_name = '\0'; + } + else if (!error) { + /* No ']' found on section line */ + error = lineno; + } + } + else if (*start && *start != ';') { + /* Not a comment, must be a name=value pair */ + end = find_char_or_comment(start, '='); + if (*end == '=') { + *end = '\0'; + name = rstrip(start); + value = lskip(end + 1); + end = find_char_or_comment(value, ';'); + if (*end == ';') + *end = '\0'; + rstrip(value); + + /* Valid name=value pair found, call handler */ + strncpy0(prev_name, name, sizeof(prev_name)); + if (!handler(user, section, name, value) && !error) + error = lineno; + } + else if (!error) { + /* No '=' found on name=value line */ + error = lineno; + } + } + } + + fclose(file); + + return error; +} diff --git a/src/core/libs/ini.h b/src/core/libs/ini.h new file mode 100644 index 000000000..2fa9e5251 --- /dev/null +++ b/src/core/libs/ini.h @@ -0,0 +1,91 @@ +/*! + * \file ini.h + * \brief This function parses an INI file into easy-to-access name/value pairs. + * \author Brush Technologies, 2009. + * + * inih (INI Not Invented Here) is a simple .INI file parser written in C++. + * It's only a couple of pages of code, and it was designed to be small + * and simple, so it's good for embedded systems. To use it, just give + * ini_parse() an INI file, and it will call a callback for every + * name=value pair parsed, giving you strings for the section, name, + * and value. It's done this way because it works well on low-memory + * embedded systems, but also because it makes for a KISS implementation. + * Parse given INI-style file. May have [section]s, name=value pairs + * (whitespace stripped), and comments starting with ';' (semicolon). + * Section is "" if name=value pair parsed before any section heading. + * For each name=value pair parsed, call handler function with given user + * pointer as well as section, name, and value (data only valid for duration + * of handler call). Handler should return nonzero on success, zero on error. + * Returns 0 on success, line number of first error on parse error, or -1 on + * file open error + * + * ------------------------------------------------------------------------- + * inih and INIReader are released under the New BSD license: + * + * Copyright (c) 2009, Brush Technology + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Brush Technology nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRUSH TECHNOLOGY ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BRUSH TECHNOLOGY BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Go to the project home page for more info: + * + * http://code.google.com/p/inih/ + * ------------------------------------------------------------------------- + */ + +#ifndef __INI_H__ +#define __INI_H__ + +/* Make this header file easier to include in C++ code */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Parse given INI-style file. May have [section]s, name=value pairs + (whitespace stripped), and comments starting with ';' (semicolon). Section + is "" if name=value pair parsed before any section heading. + + For each name=value pair parsed, call handler function with given user + pointer as well as section, name, and value (data only valid for duration + of handler call). Handler should return nonzero on success, zero on error. + + Returns 0 on success, line number of first error on parse error, or -1 on + file open error. +*/ +int ini_parse(const char* filename, + int (*handler)(void* user, const char* section, + const char* name, const char* value), + void* user); + +/* Nonzero to allow multi-line value parsing, in the style of Python's + ConfigParser. If allowed, ini_parse() will call the handler with the same + name for each subsequent line parsed. */ +#ifndef INI_ALLOW_MULTILINE +#define INI_ALLOW_MULTILINE 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __INI_H__ */ diff --git a/src/core/libs/jamfile.jam b/src/core/libs/jamfile.jam new file mode 100644 index 000000000..6b6e37a91 --- /dev/null +++ b/src/core/libs/jamfile.jam @@ -0,0 +1,5 @@ +project : build-dir ../../../build ; + +obj string_converter : string_converter.cc ; +obj INIReader : INIReader.cc ; +obj ini : ini.cc ; \ No newline at end of file diff --git a/src/core/libs/string_converter.cc b/src/core/libs/string_converter.cc new file mode 100644 index 000000000..e5abd3111 --- /dev/null +++ b/src/core/libs/string_converter.cc @@ -0,0 +1,123 @@ +/*! + * \file string_converter.cc + * \brief This class interprets the contents of a string and converts it into + * different types. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "string_converter.h" + +#include +#include + +StringConverter::StringConverter() { +} + +StringConverter::~StringConverter() { +} + +bool StringConverter::convert(std::string value, bool default_value) { + + if(value.compare("true") == 0) { + return true; + } else if(value.compare("false") == 0) { + return false; + } else { + return default_value; + } +} + + +long StringConverter::convert(std::string value, long default_value) { + + std::stringstream stream(value); + + long result; + stream >> result; + + if(stream.fail()) { + return default_value; + } else { + return result; + } +} + +int StringConverter::convert(std::string value, int default_value) { + + std::stringstream stream(value); + + int result; + stream >> result; + + if(stream.fail()) { + return default_value; + } else { + return result; + } +} + +unsigned int StringConverter::convert(std::string value, unsigned int default_value) { + + std::stringstream stream(value); + + unsigned int result; + stream >> result; + + if(stream.fail()) { + return default_value; + } else { + return result; + } +} + +float StringConverter::convert(std::string value, float default_value) { + + std::stringstream stream(value); + + float result; + stream >> result; + + if(stream.fail()) { + return default_value; + } else { + return result; + } +} + +double StringConverter::convert(std::string value, double default_value) { + + std::stringstream stream(value); + + double result; + stream >> result; + + if(stream.fail()) { + return default_value; + } else { + return result; + } +} diff --git a/src/core/libs/string_converter.h b/src/core/libs/string_converter.h new file mode 100644 index 000000000..7857d2d27 --- /dev/null +++ b/src/core/libs/string_converter.h @@ -0,0 +1,52 @@ +/*! + * \file string_converter.h + * \brief This class interprets the contents of a string and converts it into + * different types. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#ifndef STRING_CONVERTER_H_ +#define STRING_CONVERTER_H_ + +#include + +class StringConverter { + +public: + StringConverter(); + virtual ~StringConverter(); + + bool convert(std::string value, bool default_value); + long convert(std::string value, long default_value); + int convert(std::string value, int default_value); + unsigned int convert(std::string value, unsigned int default_value); + float convert(std::string value, float default_value); + double convert(std::string value, double default_value); +}; + +#endif /*STRING_CONVERTER_H_*/ diff --git a/src/core/receiver/concurrent_queue.h b/src/core/receiver/concurrent_queue.h new file mode 100644 index 000000000..e6cc7c75d --- /dev/null +++ b/src/core/receiver/concurrent_queue.h @@ -0,0 +1,90 @@ +/*! + * \file concurrent_queue.h + * \brief This class implements a thread-safe std::queue + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_CONCURRENT_QUEUE_H +#define GNSS_SDR_CONCURRENT_QUEUE_H + +template + +/*! + * \brief This class implements a thread-safe std::queue + * + * Thread-safe object queue which uses the library + * boost_thread to perform MUTEX based on the code available at + * http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html + */ +class concurrent_queue +{ +private: + std::queue the_queue; + mutable boost::mutex the_mutex; + boost::condition_variable the_condition_variable; +public: + void push(Data const& data) + { + boost::mutex::scoped_lock lock(the_mutex); + the_queue.push(data); + lock.unlock(); + the_condition_variable.notify_one(); + } + + bool empty() const + { + boost::mutex::scoped_lock lock(the_mutex); + return the_queue.empty(); + } + + bool try_pop(Data& popped_value) + { + boost::mutex::scoped_lock lock(the_mutex); + if(the_queue.empty()) + { + return false; + } + + popped_value=the_queue.front(); + the_queue.pop(); + return true; + } + + void wait_and_pop(Data& popped_value) + { + boost::mutex::scoped_lock lock(the_mutex); + while(the_queue.empty()) + { + the_condition_variable.wait(lock); + } + + popped_value=the_queue.front(); + the_queue.pop(); + } + +}; +#endif diff --git a/src/core/receiver/control_message.h b/src/core/receiver/control_message.h new file mode 100644 index 000000000..5968cb457 --- /dev/null +++ b/src/core/receiver/control_message.h @@ -0,0 +1,49 @@ +/*! + * \file control_message.h + * \brief This class represents the different control messages. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#ifndef GNSS_SDR_CONTROL_MESSAGE_H_ +#define GNSS_SDR_CONTROL_MESSAGE_H_ + +/*! + * \brief This class defines the different Control Messages + */ +class ControlMessage +{ + +public: + static unsigned int const ack_success = 0; + static unsigned int const ack_failed = 1; + static unsigned int const trk_failed = 2; + static unsigned int const channel_init = 3; +}; + +#endif /*GNSS_SDR_CONTROL_MESSAGE_H_*/ diff --git a/src/core/receiver/control_message_factory.cc b/src/core/receiver/control_message_factory.cc new file mode 100644 index 000000000..fbddf4237 --- /dev/null +++ b/src/core/receiver/control_message_factory.cc @@ -0,0 +1,83 @@ +/*! + * \file control_message_factory.cc + * \brief Implementation of a Control Message Factory + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "control_message_factory.h" + +#include +#include + +#include + +#include "string.h" + +using google::LogMessage; + +//! Constructor +ControlMessageFactory::ControlMessageFactory() +{} + +//! Destructor +ControlMessageFactory::~ControlMessageFactory() +{} + +gr_message_sptr ControlMessageFactory::GetQueueMessage(unsigned int who, unsigned int what) { + + ControlMessage *control_message = new ControlMessage; + + control_message->who = who; + control_message->what = what; + + gr_message_sptr queue_message = gr_make_message(0, 0, 0, sizeof(ControlMessage)); + memcpy(queue_message->msg(), control_message, sizeof(ControlMessage)); + + delete control_message; + + return queue_message; +} + +std::vector* ControlMessageFactory::GetControlMessages(gr_message_sptr queue_message) { + + std::vector* control_messages = new std::vector(); + unsigned int control_messages_count = queue_message->length() / sizeof(ControlMessage); + if(queue_message->length() % sizeof(ControlMessage) != 0) { + LOG_AT_LEVEL(WARNING) << "Queue message has size " << queue_message->length() << " which is not" << + " multiple of control message size " << sizeof(ControlMessage); + LOG_AT_LEVEL(WARNING) << "Ignoring this queue message to prevent unexpected results."; + return control_messages; + } + for(unsigned int i=0;ipush_back(new ControlMessage); + memcpy(control_messages->at(i), queue_message->msg() + (i*sizeof(ControlMessage)), sizeof(ControlMessage)); + } + + return control_messages; +} + + diff --git a/src/core/receiver/control_message_factory.h b/src/core/receiver/control_message_factory.h new file mode 100644 index 000000000..18e062187 --- /dev/null +++ b/src/core/receiver/control_message_factory.h @@ -0,0 +1,64 @@ +/*! + * \file control_message_factory.h + * \brief This class implements a factory for control messages. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#ifndef GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_ +#define GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_ + +#include + +typedef struct ControlMessage_ +{ + unsigned int who; + unsigned int what; +} ControlMessage ; + + +/*! + * \brief This class implements a factory for Control Messages. + * + * It encapsulates the complexity behind getting Queue Messages and associated Control Messages + */ +class ControlMessageFactory +{ + +public: + //! Constructor + ControlMessageFactory(); + + //! Virtual destructor + virtual ~ControlMessageFactory(); + + gr_message_sptr GetQueueMessage(unsigned int who, unsigned int what); + std::vector* GetControlMessages(gr_message_sptr queue_message); +}; + +#endif /*GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_*/ diff --git a/src/core/receiver/control_thread.cc b/src/core/receiver/control_thread.cc new file mode 100644 index 000000000..3e81c16e7 --- /dev/null +++ b/src/core/receiver/control_thread.cc @@ -0,0 +1,205 @@ +/*! + * \file control_thread.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "control_thread.h" + +#include + +#include + +#include + +#include +#include + +#include "gnss_flowgraph.h" +#include "file_configuration.h" +#include "control_message_factory.h" + +using google::LogMessage; + +DEFINE_string(config_file, "../conf/mercurio.conf", + "Path to the file containing the configuration parameters") +; + +ControlThread::ControlThread() +{ + configuration_ = new FileConfiguration(FLAGS_config_file); + delete_configuration_ = true; + init(); +} + +ControlThread::ControlThread(ConfigurationInterface *configuration) +{ + configuration_ = configuration; + delete_configuration_ = false; + init(); +} + +ControlThread::~ControlThread() +{ + delete flowgraph_; + if (delete_configuration_) delete configuration_; + delete control_message_factory_; +} + +/*! Main loop to read and process the control messages + * + * 1- Connect the GNSS receiver flowgraph + * 2- Start the GNSS receiver flowgraph + * while (flowgraph_->running() && !stop)_{ + * 3- Read control messages and process them } + */ +void ControlThread::run() +{ + + flowgraph_->connect(); + if (flowgraph_->connected()) + { + LOG_AT_LEVEL(INFO) << "Flowgraph connected"; + } + else + { + LOG_AT_LEVEL(ERROR) << "Unable to connect flowgraph"; + return; + } + + flowgraph_->start(); + if (flowgraph_->running()) + { + LOG_AT_LEVEL(INFO) << "Flowgraph started"; + } + else + { + LOG_AT_LEVEL(ERROR) << "Unable to start flowgraph"; + return; + } + + // Main loop to read and process the control messages + while (flowgraph_->running() && !stop_) + { + //TODO re-enable the blocking read messages functions and fork the process + read_control_messages(); + if (control_messages_ != 0) process_control_messages(); + } + + flowgraph_->stop(); + + LOG_AT_LEVEL(INFO) << "Flowgraph stopped"; +} + +void ControlThread::set_control_queue(gr_msg_queue_sptr control_queue) +{ + if (flowgraph_->running()) + { + LOG_AT_LEVEL(WARNING) + << "Unable to set control queue while flowgraph is running"; + return; + } + + control_queue_ = control_queue; +} + +/*! Creates a control_queue_, a flowgraph_ and a control_message_factory, + * sets stop_ to false and initializes processed_control_messages_ and + * applied_actions_ to zero + */ +void ControlThread::init() +{ + control_queue_ = gr_make_msg_queue(0); + flowgraph_ = new GNSSFlowgraph(configuration_, control_queue_); + control_message_factory_ = new ControlMessageFactory(); + stop_ = false; + processed_control_messages_ = 0; + applied_actions_ = 0; +} + +void ControlThread::read_control_messages() +{ + + DLOG(INFO) << "Reading control messages from queue"; + gr_message_sptr queue_message = control_queue_->delete_head(); + if (queue_message != 0) + { + control_messages_ = control_message_factory_->GetControlMessages( + queue_message); + } + else + { + control_messages_ = 0; + } +} + +// Apply the corresponding control actions +// TODO: May be it is better to move the apply_action state machine to the control_thread +void ControlThread::process_control_messages() +{ + + for (unsigned int i = 0; i < control_messages_->size(); i++) + { + if (stop_) break; + if (control_messages_->at(i)->who == 200) + { + apply_action(control_messages_->at(i)->what); + } + else + { + flowgraph_->apply_action(control_messages_->at(i)->who, + control_messages_->at(i)->what); + } + + delete control_messages_->at(i); + processed_control_messages_++; + } + + control_messages_->clear(); + delete control_messages_; + + DLOG(INFO) << "Processed all control messages"; +} + +void ControlThread::apply_action(unsigned int what) +{ + + switch (what) + { + case 0: + DLOG(INFO) << "Received action STOP"; + stop_ = true; + applied_actions_++; + break; + default: + DLOG(INFO) << "Unrecognized action."; + } + +} + diff --git a/src/core/receiver/control_thread.h b/src/core/receiver/control_thread.h new file mode 100644 index 000000000..c0331af24 --- /dev/null +++ b/src/core/receiver/control_thread.h @@ -0,0 +1,115 @@ +/*! + * \file control_thread.h + * \brief This class represents the main thread of the application, aka control thread. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_CONTROL_THREAD_H_ +#define GNSS_SDR_CONTROL_THREAD_H_ + +#include +#include "control_message_factory.h" + +class GNSSFlowgraph; +class ConfigurationInterface; + + +/*! + * \brief This class represents the main thread of the application, aka Control Thread. + */ +class ControlThread +{ + +public: + + //! Default constructor + ControlThread(); + + /*! + * \brief Constructor that initializes the class with parameters + * + * \param[in] configuration Pointer to a ConfigurationInterface + */ + ControlThread(ConfigurationInterface *configuration); + + //! Virtual destructor. Derived classes must implement the destructor + virtual ~ControlThread(); + + /*! + * \brief Runs the ControlThread + */ + void run(); + + /*! + * \brief Sets the control_queue + * + * \param[in] gr_msg_queue_sptr control_queue + */ + void set_control_queue(gr_msg_queue_sptr control_queue); + + unsigned int processed_control_messages() + { + return processed_control_messages_; + } + + unsigned int applied_actions() + { + return applied_actions_; + } + + /*! + * \brief Instantiates a flowgraph + * + * \return Returns a flowgraph object + */ + GNSSFlowgraph* flowgraph() + { + return flowgraph_; + } + + +private: + + void init(); + void read_control_messages(); + void process_control_messages(); + void apply_action(unsigned int what); + + GNSSFlowgraph *flowgraph_; + ConfigurationInterface *configuration_; + gr_msg_queue_sptr control_queue_; + ControlMessageFactory *control_message_factory_; + std::vector *control_messages_; + + bool stop_; + bool delete_configuration_; + + unsigned int processed_control_messages_; + unsigned int applied_actions_; +}; + +#endif /*GNSS_SDR_CONTROL_THREAD_H_*/ diff --git a/src/core/receiver/file_configuration.cc b/src/core/receiver/file_configuration.cc new file mode 100644 index 000000000..2df0a59d4 --- /dev/null +++ b/src/core/receiver/file_configuration.cc @@ -0,0 +1,193 @@ +/*! + * \file file_configuration.cc + * \brief This class is an implementation of the interface ConfigurationInterface. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * This implementation has a text file as the source for the values of the parameters. + * The file is in the INI format, containing sections and pairs of names and values. + * For more information about the INI format, see http://en.wikipedia.org/wiki/INI_file + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#include "file_configuration.h" + +#include + +#include +#include + +#include "INIReader.h" +#include "string_converter.h" +#include "in_memory_configuration.h" + +using google::LogMessage; + +FileConfiguration::FileConfiguration(std::string filename) +{ + filename_ = filename; + init(); +} + +FileConfiguration::FileConfiguration() +{ + filename_ = "./default_config_file.txt"; + init(); +} + +FileConfiguration::~FileConfiguration() +{ + LOG_AT_LEVEL(INFO) << "Destructor called"; + delete ini_reader_; + delete converter_; + delete overrided_; +} + +std::string FileConfiguration::property(std::string property_name, std::string default_value) +{ + + if(overrided_->is_present(property_name)) + { + return overrided_->property(property_name, default_value); + } + else + { + return ini_reader_->Get("mercurio", property_name, default_value); + } +} + +bool FileConfiguration::property(std::string property_name, bool default_value) +{ + + if(overrided_->is_present(property_name)) + { + return overrided_->property(property_name, default_value); + } + else + { + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); + } +} + +long FileConfiguration::property(std::string property_name, long default_value) +{ + + if(overrided_->is_present(property_name)) + { + return overrided_->property(property_name, default_value); + } + else + { + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); + } +} + +int FileConfiguration::property(std::string property_name, int default_value) +{ + + if(overrided_->is_present(property_name)) { + + return overrided_->property(property_name, default_value); + } + else + { + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); + } +} + +unsigned int FileConfiguration::property(std::string property_name, unsigned int default_value) +{ + if(overrided_->is_present(property_name)) + { + return overrided_->property(property_name, default_value); + } + else + { + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); + } +} + +float FileConfiguration::property(std::string property_name, float default_value) +{ + if(overrided_->is_present(property_name)) + { + return overrided_->property(property_name, default_value); + } + else + { + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); + } +} + +double FileConfiguration::property(std::string property_name, double default_value) +{ + if(overrided_->is_present(property_name)) + { + return overrided_->property(property_name, default_value); + } + else + { + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); + } +} + +void FileConfiguration::set_property(std::string property_name, std::string value) +{ + overrided_->set_property(property_name, value); +} + +void FileConfiguration::init() +{ + + converter_ = new StringConverter(); + overrided_ = new InMemoryConfiguration(); + + ini_reader_ = new INIReader(filename_); + error_ = ini_reader_->ParseError(); + + if(error_ == 0) + { + DLOG(INFO) << "Configuration file " << filename_ << " opened with no errors"; + } + else if(error_ > 0) + { + LOG_AT_LEVEL(WARNING) << "Configuration file " << filename_ << " contains errors in line " << error_; + } + else + { + LOG_AT_LEVEL(WARNING) << "Unable to open configuration file " << filename_; + } + +} + + diff --git a/src/core/receiver/file_configuration.h b/src/core/receiver/file_configuration.h new file mode 100644 index 000000000..3c366d572 --- /dev/null +++ b/src/core/receiver/file_configuration.h @@ -0,0 +1,87 @@ +/*! + * \file file_configuration.h + * \brief This class is an implementation of the interface ConfigurationInterface. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * This implementation has a text file as the source for the values of the parameters. + * The file is in the INI format, containing sections and pairs of names and values. + * For more information about the INI format, see http://en.wikipedia.org/wiki/INI_file + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#ifndef GNSS_SDR_FILE_CONFIGURATION_H_ +#define GNSS_SDR_FILE_CONFIGURATION_H_ + +#include "configuration_interface.h" + +#include + +class INIReader; +class StringConverter; +class InMemoryConfiguration; + +/*! + * \brief This class is an implementation of the interface ConfigurationInterface + * + * Derived from ConfigurationInterface, this class implements an interface + * to a configuration file. This implementation has a text file as the source + * for the values of the parameters. + * The file is in the INI format, containing sections and pairs of names and values. + * For more information about the INI format, see http://en.wikipedia.org/wiki/INI_file + */ +class FileConfiguration : public ConfigurationInterface { + +public: + FileConfiguration(std::string filename); + FileConfiguration(); + + //! Virtual destructor + virtual ~FileConfiguration(); + + std::string property(std::string property_name, std::string default_value); + bool property(std::string property_name, bool default_value); + long property(std::string property_name, long default_value); + int property(std::string property_name, int default_value); + unsigned int property(std::string property_name, unsigned int default_value); + float property(std::string property_name, float default_value); + double property(std::string property_name, double default_value); + + void set_property(std::string property_name, std::string value); + +private: + + void init(); + + std::string filename_; + INIReader *ini_reader_; + InMemoryConfiguration* overrided_; + int error_; + StringConverter *converter_; +}; + +#endif /*GNSS_SDR_FILE_CONFIGURATION_H_*/ diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc new file mode 100644 index 000000000..9bae2c3cc --- /dev/null +++ b/src/core/receiver/gnss_block_factory.cc @@ -0,0 +1,283 @@ +/*! + * \file gnss_block_factory.cc + * \brief This class implements a factory that returns instances of GNSS blocks. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * This class encapsulates the complexity behind the instantiation + * of GNSS blocks. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "gnss_block_factory.h" + +#include +#include +#include +#include + +#include +#include + +#include "configuration_interface.h" +#include "gnss_block_interface.h" +#include "pass_through.h" +#include "file_signal_source.h" +#include "null_sink_output_filter.h" +#include "file_output_filter.h" +#include "channel.h" +#include "usrp1_signal_source.h" +#include "direct_resampler_conditioner.h" +#include "gps_l1_ca_gps_sdr_acquisition.h" +#include "gps_l1_ca_pcps_acquisition.h" +#include "gps_l1_ca_tong_pcps_acquisition.h" +#include "gps_l1_ca_dll_pll_tracking.h" +#include "gps_l1_ca_telemetry_decoder.h" +#include "gps_l1_ca_observables.h" + +using google::LogMessage; + +GNSSBlockFactory::GNSSBlockFactory() +{ +} + +GNSSBlockFactory::~GNSSBlockFactory() +{ +} + +GNSSBlockInterface* GNSSBlockFactory::GetSignalSource( + ConfigurationInterface *configuration, gr_msg_queue_sptr queue) +{ + + std::string default_implementation = "File_Signal_Source"; + std::string implementation = configuration->property( + "SignalSource.implementation", default_implementation); + + DLOG(INFO) << "Getting SignalSource with implementation " + << implementation; + + return GetBlock(configuration, "SignalSource", implementation, 0, 1, + queue); +} + +GNSSBlockInterface* GNSSBlockFactory::GetSignalConditioner( + ConfigurationInterface *configuration, gr_msg_queue_sptr queue) +{ + + std::string default_implementation = "Pass_Through"; + std::string implementation = configuration->property( + "SignalConditioner.implementation", default_implementation); + + DLOG(INFO) << "Getting SignalConditioner with implementation " + << implementation; + + return GetBlock(configuration, "SignalConditioner", implementation, 1, 1, + queue); +} + +GNSSBlockInterface* GNSSBlockFactory::GetObservables( + ConfigurationInterface *configuration, gr_msg_queue_sptr queue) +{ + + std::string default_implementation = "GPS_L1_CA_Observables"; + std::string implementation = configuration->property( + "Observables.implementation", default_implementation); + + DLOG(INFO) << "Getting Observables with implementation " + << implementation; + + unsigned int channel_count = + configuration->property("Channels.count", 12); + + return GetBlock(configuration, "Observables", implementation, + channel_count, channel_count, queue); +} + +GNSSBlockInterface* GNSSBlockFactory::GetPVT( + ConfigurationInterface *configuration, gr_msg_queue_sptr queue) +{ + + std::string default_implementation = "Pass_Through"; + std::string implementation = configuration->property( + "PVT.implementation", default_implementation); + + DLOG(INFO) << "Getting PVT with implementation " << implementation; + + unsigned int channel_count = + configuration->property("Channels.count", 12); + + return GetBlock(configuration, "PVT", implementation, channel_count, 1, + queue); +} + +GNSSBlockInterface* GNSSBlockFactory::GetOutputFilter( + ConfigurationInterface *configuration, gr_msg_queue_sptr queue) +{ + + std::string default_implementation = "Null_Sink_Output_Filter"; + std::string implementation = configuration->property( + "OutputFilter.implementation", default_implementation); + + DLOG(INFO) << "Getting OutputFilter with implementation " + << implementation; + + return GetBlock(configuration, "OutputFilter", implementation, 1, 0, + queue); +} + +GNSSBlockInterface* GNSSBlockFactory::GetChannel( + ConfigurationInterface *configuration, std::string acq, + std::string trk, std::string tlm, int channel, + gr_msg_queue_sptr queue) +{ + + std::stringstream stream; + stream << channel; + std::string id = stream.str(); + + DLOG(INFO) << "Instantiating channel " << id; + + return new Channel(configuration, channel, GetBlock(configuration, + "SignalConditioner", "Pass_Through", 1, 1, queue), + (AcquisitionInterface*)GetBlock(configuration, "Acquisition", + acq, 1, 1, queue), (TrackingInterface*)GetBlock( + configuration, "Tracking", trk, 1, 1, queue), + (TelemetryDecoderInterface*)GetBlock(configuration, + "TelemetryDecoder", tlm, 1, 1, queue), "Channel", + "Channel", queue); +} + +std::vector* GNSSBlockFactory::GetChannels( + ConfigurationInterface *configuration, gr_msg_queue_sptr queue) +{ + + std::string default_implementation = "PassThrough"; + unsigned int channel_count = + configuration->property("Channels.count", 12); + std::vector* channels = new std::vector< + GNSSBlockInterface*>(); + + std::string tracking = configuration->property("Tracking.implementation", + default_implementation); + std::string telemetry_decoder = configuration->property( + "TelemetryDecoder.implementation", default_implementation); + for (unsigned int i = 0; i < channel_count; i++) + { + + std::string acquisition_implementation_name = "Acquisition" + + boost::lexical_cast(i) + ".implementation"; + std::string acquisition_implementation = configuration->property( + acquisition_implementation_name, default_implementation); + channels->push_back(GetChannel(configuration, + acquisition_implementation, tracking, telemetry_decoder, i, + queue)); + std::cout << "getchannel_" << i << ", acq_implementation_name: " + << acquisition_implementation_name << ", implementation: " + << acquisition_implementation << std::endl; + + } + + DLOG(INFO) << "Getting " << channel_count << " channels"; + return channels; + +} + +GNSSBlockInterface* GNSSBlockFactory::GetBlock( + ConfigurationInterface *configuration, std::string role, + std::string implementation, unsigned int in_streams, + unsigned int out_streams, gr_msg_queue_sptr queue) +{ + + GNSSBlockInterface* block = NULL; + + if (implementation.compare("File_Signal_Source") == 0) + { + block = new FileSignalSource(configuration, role, in_streams, + out_streams, queue); + } + else if (implementation.compare("Pass_Through") == 0) + { + block = new PassThrough(configuration, role, in_streams, out_streams); + } + else if (implementation.compare("Null_Sink_Output_Filter") == 0) + { + block = new NullSinkOutputFilter(configuration, role, in_streams, + out_streams); + } + else if (implementation.compare("File_Output_Filter") == 0) + { + block = new FileOutputFilter(configuration, role, in_streams, + out_streams); + } + else if (implementation.compare("USRP1_Signal_Source") == 0) + { + block = new Usrp1SignalSource(configuration, role, in_streams, + out_streams, queue); + } + else if (implementation.compare("Direct_Resampler") == 0) + { + block = new DirectResamplerConditioner(configuration, role, + in_streams, out_streams); + } + else if (implementation.compare("GPS_L1_CA_GPS_SDR_Acquisition") == 0) + { + block = new GpsL1CaGpsSdrAcquisition(configuration, role, in_streams, + out_streams, queue); + } + else if (implementation.compare("GPS_L1_CA_PCPS_Acquisition") == 0) + { + block = new GpsL1CaPcpsAcquisition(configuration, role, in_streams, + out_streams, queue); + } + else if (implementation.compare("GPS_L1_CA_TONG_PCPS_Acquisition") == 0) + { + block = new GpsL1CaTongPcpsAcquisition(configuration, role, + in_streams, out_streams, queue); + } + else if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking") == 0) + { + block = new GpsL1CaDllPllTracking(configuration, role, in_streams, + out_streams, queue); + } + else if (implementation.compare("GPS_L1_CA_Telemetry_Decoder") == 0) + { + block = new GpsL1CaTelemetryDecoder(configuration, role, in_streams, + out_streams, queue); + } + else if (implementation.compare("GPS_L1_CA_Observables") == 0) + { + block = new GpsL1CaObservables(configuration, role, in_streams, + out_streams, queue); + } + else + { + // Log fatal. This causes execution to stop. + LOG_AT_LEVEL(ERROR) << implementation + << ": Undefined implementation for block"; + } + + return block; +} diff --git a/src/core/receiver/gnss_block_factory.h b/src/core/receiver/gnss_block_factory.h new file mode 100644 index 000000000..27cd7aca7 --- /dev/null +++ b/src/core/receiver/gnss_block_factory.h @@ -0,0 +1,75 @@ +/*! + * \file gnss_block_factory.h + * \brief This class implements a factory that returns instances of GNSS blocks. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * This class encapsulates the complexity behind the instantiation + * of GNSS blocks. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_BLOCK_FACTORY_H_ +#define GNSS_BLOCK_FACTORY_H_ + +#include +#include + +#include + +class ConfigurationInterface; +class GNSSBlockInterface; + +class GNSSBlockFactory +{ + +public: + + GNSSBlockFactory(); + virtual ~GNSSBlockFactory(); + + GNSSBlockInterface* GetSignalSource( + ConfigurationInterface *configuration, gr_msg_queue_sptr queue); + GNSSBlockInterface* GetSignalConditioner( + ConfigurationInterface *configuration, gr_msg_queue_sptr queue); + GNSSBlockInterface* GetPVT(ConfigurationInterface *configuration, + gr_msg_queue_sptr queue); + GNSSBlockInterface* GetObservables(ConfigurationInterface *configuration, + gr_msg_queue_sptr queue); + GNSSBlockInterface* GetOutputFilter( + ConfigurationInterface *configuration, gr_msg_queue_sptr queue); + GNSSBlockInterface* GetChannel(ConfigurationInterface *configuration, + std::string acq, std::string trk, std::string tlm, int channel, + gr_msg_queue_sptr queue); + std::vector* GetChannels( + ConfigurationInterface *configuration, gr_msg_queue_sptr queue); + GNSSBlockInterface* GetBlock(ConfigurationInterface* configuration, + std::string role, std::string implementation, + unsigned int in_streams, unsigned int out_streams, + gr_msg_queue_sptr queue); + +}; + +#endif /*GNSS_BLOCK_FACTORY_H_*/ diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc new file mode 100644 index 000000000..41c45e197 --- /dev/null +++ b/src/core/receiver/gnss_flowgraph.cc @@ -0,0 +1,457 @@ +/*! + * \file gnss_flowgraph.cc + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "gnss_flowgraph.h" + +#include +#include "unistd.h" + +#include +#include + +#include "configuration_interface.h" +#include "gnss_block_interface.h" +#include "channel_interface.h" +#include "gnss_block_factory.h" + +using google::LogMessage; + +GNSSFlowgraph::GNSSFlowgraph(ConfigurationInterface *configuration, + gr_msg_queue_sptr queue) +{ + + connected_ = false; + running_ = false; + configuration_ = configuration; + blocks_ = new std::vector(); + block_factory_ = new GNSSBlockFactory(); + queue_ = queue; + available_GPS_satellites_IDs_ = new std::list(); + init(); +} + +GNSSFlowgraph::~GNSSFlowgraph() +{ + + delete block_factory_; + + for (unsigned int i = 0; i < blocks_->size(); i++) + { + delete blocks_->at(i); + } + blocks_->clear(); + + delete blocks_; +} + +void GNSSFlowgraph::start() +{ + if (running_) + { + LOG_AT_LEVEL(WARNING) << "Already running"; + return; + } + + try + { + top_block_->start(); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) << "Unable to start flowgraph"; + LOG_AT_LEVEL(ERROR) << e.what(); + return; + } + + running_ = true; +} + +void GNSSFlowgraph::stop() +{ + for (unsigned int i = 0; i < channels_count_; i++) + { + channel(i)->stop(); + } + DLOG(INFO) << "Threads finished. Return to main program."; + top_block_->stop(); + running_ = false; +} + +void GNSSFlowgraph::connect() +{ + DLOG(INFO) << "Connecting flowgraph"; + if (connected_) + { + LOG_AT_LEVEL(WARNING) << "flowgraph already connected"; + return; + } + + // Connect GNSS block internally + try + { + signal_source()->connect(top_block_); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) << "Can't connect signal source block internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + + try + { + signal_conditioner()->connect(top_block_); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) + << "Can't connect signal conditioner block internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + + for (unsigned int i = 0; i < channels_count_; i++) + { + try + { + channel(i)->connect(top_block_); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) << "Can't connect channel " << i + << " internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + } + + try + { + observables()->connect(top_block_); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) << "Can't connect observables block internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + + try + { + pvt()->connect(top_block_); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) << "Can't connect PVT block internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + + try + { + output_filter()->connect(top_block_); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) << "Can't connect output filter block internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + + DLOG(INFO) << "blocks connected internally"; + + try + { + top_block_->connect(signal_source()->get_right_block(), 0, + signal_conditioner()->get_left_block(), 0); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) + << "Can't connect signal source to signal conditioner"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + DLOG(INFO) << "Signal source connected to signal conditioner"; + + for (unsigned int i = 0; i < channels_count_; i++) + { + try + { + top_block_->connect(signal_conditioner()->get_right_block(), 0, + channel(i)->get_left_block(), 0); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) + << "Can't connect signal conditioner to channel " << i; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + + DLOG(INFO) << "signal conditioner connected to channel " << i; + + try + { + top_block_->connect(channel(i)->get_right_block(), 0, + observables()->get_left_block(), i); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) << "Can't connect channel " << i + << " to observables"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + + channel(i)->set_satellite(available_GPS_satellites_IDs_->front()); + std::cout << "Channel " << i << " satellite " + << available_GPS_satellites_IDs_->front() << std::endl; + available_GPS_satellites_IDs_->pop_front(); + channel(i)->start(); + //channel(i)->start_acquisition(); + + DLOG(INFO) << "Channel " << i + << " connected to observables and ready for acquisition"; + } + // TODO: Enable the observables multichannel output connection to PVT when the PVT implementation is ready + try + { + top_block_->connect(observables()->get_right_block(), 0, + pvt()->get_left_block(), 0); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) << "Can't connect observables to PVT"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + + try + { + top_block_->connect(pvt()->get_right_block(), 0, + output_filter()->get_left_block(), 0); + } + catch (std::exception& e) + { + LOG_AT_LEVEL(ERROR) << "Can't connect PVT to output filter"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + + DLOG(INFO) << "PVT connected to output filter"; + + connected_ = true; + DLOG(INFO) << "Flowgraph connected"; + top_block_->dump(); + +} + +void GNSSFlowgraph::wait() +{ + if (!running_) + { + LOG_AT_LEVEL(WARNING) << "Can't apply wait. Flowgraph is not running"; + return; + } + top_block_->wait(); + DLOG(INFO) << "Flowgraph finished calculations"; + running_ = false; +} + +void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) +{ + + DLOG(INFO) << "received " << what << " from " << who; + + switch (what) + { + case 0: + + LOG_AT_LEVEL(INFO) << "Channel " << who + << " ACQ FAILED satellite " << channel(who)->satellite(); + available_GPS_satellites_IDs_->push_back( + channel(who)->satellite()); + channel(who)->set_satellite( + available_GPS_satellites_IDs_->front()); + available_GPS_satellites_IDs_->pop_front(); + channel(who)->start_acquisition(); + break; + // TODO: Tracking messages + + default: + break; + } + + DLOG(INFO) << "available channels " + << available_GPS_satellites_IDs_->size(); +} + +void GNSSFlowgraph::set_configuration(ConfigurationInterface* configuration) +{ + if (running_) + { + LOG_AT_LEVEL(WARNING) + << "Unable to update configuration while flowgraph running"; + return; + } + + if (connected_) + { + LOG_AT_LEVEL(WARNING) + << "Unable to update configuration while flowgraph connected"; + } + + configuration_ = configuration; +} + +GNSSBlockInterface* GNSSFlowgraph::signal_source() +{ + return blocks_->at(0); +} + +GNSSBlockInterface* GNSSFlowgraph::signal_conditioner() +{ + return blocks_->at(1); +} + +ChannelInterface* GNSSFlowgraph::channel(unsigned int index) +{ + return (ChannelInterface*)blocks_->at(index + 5); +} + +GNSSBlockInterface* GNSSFlowgraph::observables() +{ + return blocks_->at(2); +} + +GNSSBlockInterface* GNSSFlowgraph::pvt() +{ + return blocks_->at(3); +} + +GNSSBlockInterface* GNSSFlowgraph::output_filter() +{ + return blocks_->at(4); +} + +void GNSSFlowgraph::init() +{ + + blocks_->push_back( + block_factory_->GetSignalSource(configuration_, queue_)); + blocks_->push_back(block_factory_->GetSignalConditioner(configuration_, + queue_)); + blocks_->push_back(block_factory_->GetObservables(configuration_, queue_)); + blocks_->push_back(block_factory_->GetPVT(configuration_, queue_)); + blocks_->push_back( + block_factory_->GetOutputFilter(configuration_, queue_)); + + std::vector* channels = block_factory_->GetChannels( + configuration_, queue_); + + channels_count_ = channels->size(); + + for (unsigned int i = 0; i < channels_count_; i++) + { + blocks_->push_back(channels->at(i)); + } + + top_block_ = gr_make_top_block("GNSSFlowgraph"); + + delete channels; + + // fill the available_GPS_satellites_IDs_ queue with the satellites ID's to be searched by the acquisition + + set_satellites_list(); + + applied_actions_ = 0; + + DLOG(INFO) << "Blocks instantiated. " << channels_count_ + << " channels."; +} + +void GNSSFlowgraph::set_satellites_list() +{ + + for (unsigned int id = 1; id < 33; id++) + { + available_GPS_satellites_IDs_->push_back(id); + } + + std::list::iterator it = + available_GPS_satellites_IDs_->begin(); + + for (unsigned int i = 0; i < channels_count_; i++) + { + unsigned int sat = configuration_->property("Acquisition" + + boost::lexical_cast(i) + ".satellite", 0); + if ((sat == 0) || (sat==*it)) // 0 = not PRN in configuration file + { + it++; + } + else + { + available_GPS_satellites_IDs_->remove(sat); + available_GPS_satellites_IDs_->insert(it, sat); + } + } + + std::cout << "Cola de satélites: "; + for (std::list::iterator it = + available_GPS_satellites_IDs_->begin(); it + != available_GPS_satellites_IDs_->end(); it++) + { + std::cout << *it << ", "; + } + std::cout << std::endl; + +} + +void GNSSFlowgraph::apply_action(unsigned int what) +{ + DLOG(INFO) << "Applied action " << what << " to flowgraph"; + applied_actions_++; +} + diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h new file mode 100644 index 000000000..ac8ec4c50 --- /dev/null +++ b/src/core/receiver/gnss_flowgraph.h @@ -0,0 +1,126 @@ +/*! + * \file gnss_flowgraph.h + * \brief This class represents a GNSS flowgraph. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * Luis Esteve, 2011. luis(at)epsilon-formacion.com + * + * It contains a signal source, + * a signal conditioner, a set of channels, a pvt and an output filter. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_GNSS_FLOWGRAPH_H_ +#define GNSS_SDR_GNSS_FLOWGRAPH_H_ + +#include +#include +#include + +#include +#include + +class GNSSBlockInterface; +class ChannelInterface; +class ConfigurationInterface; +class GNSSBlockFactory; + +/* \brief This class represents a GNSS flowgraph. + * + * It contains a signal source, + * a signal conditioner, a set of channels, a PVT and an output filter. + */ +class GNSSFlowgraph +{ + +public: + + GNSSFlowgraph(ConfigurationInterface* configuration, + gr_msg_queue_sptr queue); + + //! Virtual destructor + virtual ~GNSSFlowgraph(); + + //! Start the flowgraph + void start(); + + //! Stop the flowgraph + void stop(); + + //! Connect the defined flowgraph + void connect(); + + void wait(); + + void apply_action(unsigned int who, unsigned int what); + + void set_configuration(ConfigurationInterface* configuration); + + GNSSBlockInterface* signal_source(); + GNSSBlockInterface* signal_conditioner(); + ChannelInterface* channel(unsigned int index); + GNSSBlockInterface* observables(); + GNSSBlockInterface* pvt(); + GNSSBlockInterface* output_filter(); + + unsigned int applied_actions() + { + return applied_actions_; + } + bool connected() + { + return connected_; + } + bool running() + { + return running_; + } + +private: + + void init(); + void apply_action(unsigned int what); + void set_satellites_list(); + + bool connected_; + bool running_; + unsigned int channels_count_; + unsigned int applied_actions_; + + std::string config_file_; + + ConfigurationInterface *configuration_; + GNSSBlockFactory *block_factory_; + + std::vector* blocks_; + + gr_top_block_sptr top_block_; + gr_msg_queue_sptr queue_; + + std::list* available_GPS_satellites_IDs_; + std::queue* available_Galileo_satellites_IDs_; +}; + +#endif /*GNSS_SDR_GNSS_FLOWGRAPH_H_*/ diff --git a/src/core/receiver/in_memory_configuration.cc b/src/core/receiver/in_memory_configuration.cc new file mode 100644 index 000000000..a06c8e49e --- /dev/null +++ b/src/core/receiver/in_memory_configuration.cc @@ -0,0 +1,112 @@ +/*! + * \file + * \brief Brief description of the file here + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#include "in_memory_configuration.h" + +#include + +#include "string_converter.h" + +InMemoryConfiguration::InMemoryConfiguration() +{ + + converter_ = new StringConverter(); +} + +InMemoryConfiguration::~InMemoryConfiguration() +{ + + properties_.clear(); + delete converter_; +} + +std::string InMemoryConfiguration::property(std::string property_name, std::string default_value) +{ + + std::map::iterator iter = properties_.find(property_name); + + if(iter != properties_.end()) + { + return iter->second; + } + else + { + return default_value; + } +} + +bool InMemoryConfiguration::property(std::string property_name, bool default_value) +{ + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); +} + +long InMemoryConfiguration::property(std::string property_name, long default_value) +{ + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); +} + +int InMemoryConfiguration::property(std::string property_name, int default_value) +{ + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); +} + +unsigned int InMemoryConfiguration::property(std::string property_name, unsigned int default_value) +{ + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); +} + +float InMemoryConfiguration::property(std::string property_name, float default_value) +{ + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); +} + +double InMemoryConfiguration::property(std::string property_name, double default_value) +{ + std::string empty = ""; + return converter_->convert(property(property_name, empty), default_value); +} + +void InMemoryConfiguration::set_property(std::string property_name, std::string value) +{ + properties_.insert(std::make_pair(property_name, value)); +} + +bool InMemoryConfiguration::is_present(std::string property_name) +{ + return (properties_.find(property_name) != properties_.end()); +} diff --git a/src/core/receiver/in_memory_configuration.h b/src/core/receiver/in_memory_configuration.h new file mode 100644 index 000000000..d3215b18f --- /dev/null +++ b/src/core/receiver/in_memory_configuration.h @@ -0,0 +1,77 @@ +/*! + * \file in_memory_configuration.h + * \brief This class is an implementation of the interface ConfigurationInterface. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * This implementation accepts configuration parameters upon instantiation and + * it is intended to be used in unit testing. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + + +#ifndef GNSS_SDR_IN_MEMORY_CONFIGURATION_H_ +#define GNSS_SDR_IN_MEMORY_CONFIGURATION_H_ + +#include +#include + +#include "configuration_interface.h" + +class StringConverter; + +/* + * \brief This class is an implementation of the interface ConfigurationInterface. + * + * This implementation accepts configuration parameters upon instantiation and + * it is intended to be used in unit testing. + */ +class InMemoryConfiguration : public ConfigurationInterface +{ + +public: + InMemoryConfiguration(); + virtual ~InMemoryConfiguration(); + + std::string property(std::string property_name, std::string default_value); + bool property(std::string property_name, bool default_value); + long property(std::string property_name, long default_value); + int property(std::string property_name, int default_value); + unsigned int property(std::string property_name, unsigned int default_value); + float property(std::string property_name, float default_value); + double property(std::string property_name, double default_value); + + void set_property(std::string property_name, std::string value); + + bool is_present(std::string property_name); + +private: + + std::map properties_; + StringConverter *converter_; +}; + +#endif /*GNSS_SDR_IN_MEMORY_CONFIGURATION_H_*/ diff --git a/src/core/receiver/jamfile.jam b/src/core/receiver/jamfile.jam new file mode 100644 index 000000000..9d6979ac3 --- /dev/null +++ b/src/core/receiver/jamfile.jam @@ -0,0 +1,8 @@ +project : build-dir ../../../build ; + +obj control_message_factory : control_message_factory.cc ; +obj control_thread : control_thread.cc ; +obj file_configuration : file_configuration.cc ; +obj in_memory_configuration : in_memory_configuration.cc ; +obj gnss_block_factory : gnss_block_factory.cc ; +obj gnss_flowgraph : gnss_flowgraph.cc ; \ No newline at end of file diff --git a/src/core/system_parameters/GPS_L1_CA.h b/src/core/system_parameters/GPS_L1_CA.h new file mode 100644 index 000000000..499145edb --- /dev/null +++ b/src/core/system_parameters/GPS_L1_CA.h @@ -0,0 +1,214 @@ +/*! + * \file GPS_L1_CA.h + * \brief Defines system parameters for GPS L1 C/A signal + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#ifndef GPS_DEFINES_H +#define GPS_DEFINES_H + + +#define NAVIGATION_OUTPUT_RATE_MS 600 + +// GPS CONSTANTS +// JAVI: ADD SYSTEM PREFIX + + +// SEPARATE FILE GPS.H +const float GPS_C_m_s= 299792458; // The speed of light, [m/ms] +const float GPS_STARTOFFSET_ms= 68.802; //[ms] Initial sign. travel time +const float GPS_PI = 3.1415926535898; // Pi used in the GPS coordinate system +//-- Constants for satellite position calculation ------------------------- +const double OMEGA_EARTH_DOT = 7.2921151467e-5; // Earth rotation rate, [rad/s] +const double GM = 3.986005e14; // Universal gravitational constant times the mass of the Earth, [m^3/s^2] +const double F = -4.442807633e-10; // Constant, [sec/(meter)^(1/2)] + +// NAVIGATION MESSAGE DEMODULATION AND DECODING + +#define GPS_PREAMBLE {1, 0, 0, 0, 1, 0, 1, 1} +#define GPS_WORD_LENGTH 4 // CRC + GPS WORD (-2 -1 0 ... 29) Bits = 4 bytes +#define GPS_SUBFRAME_LENGTH 40 // GPS_WORD_LENGTH x 10 = 40 bytes +#define GPS_SUBFRAME_BITS 300 +#define GPS_WORD_BITS 30 + +#define num_of_slices(x) sizeof(x)/sizeof(bits_slice) + +/*! @ingroup GPS_DEFINES + * @brief Navigation message bits slice structure: A portion of bits is indicated by + * the start position inside the subframe and the length in number of bits + */ +typedef struct bits_slice{ + int position; + int length; + bits_slice(int p,int l) + { + position=p; + length=l; + } +} bits_slice; + + +/*! @ingroup GPS_DEFINES + * @brief Demodulator gnss_synchro structure, used to feed the pseudorange block + */ +typedef struct gnss_synchro +{ + unsigned long int last_preamble_index; + float prn_delay; + int satellite_PRN; + int channel_ID; + bool valid_word; +} gnss_synchro; + + +/* Constants for scaling the ephemeris found in the data message + the format is the following: TWO_N5 -> 2^-5, TWO_P4 -> 2^4, PI_TWO_N43 -> Pi*2^-43, etc etc + Additionally some of the PI*2^N terms are used in the tracking stuff + TWO_PX ==> 2^X + TWO_NX ==> 2^-X + PI_TWO_NX ==> Pi*2^-X + PI_TWO_PX ==> Pi*2^X + ONE_PI_TWO_PX = (1/Pi)*2^X +*/ + +// SEPARATE FILE: CONSTANTS.H + +#define TWO_P4 (16) //!< 2^4 +#define TWO_P11 (2048) //!< 2^11 +#define TWO_P12 (4096) //!< 2^12 +#define TWO_P14 (16384) //!< 2^14 +#define TWO_P16 (65536) //!< 2^16 +#define TWO_P19 (524288) //!< 2^19 +#define TWO_P31 (2147483648.0) //!< 2^31 +#define TWO_P32 (4294967296.0) //!< 2^32 this is too big for an int so add the x.0 +#define TWO_P57 (1.441151880758559e+017) //!< 2^57 + +#define TWO_N5 (0.03125) //!< 2^-5 +#define TWO_N11 (4.882812500000000e-004) //!< 2^-11 +#define TWO_N19 (1.907348632812500e-006) //!< 2^-19 +#define TWO_N20 (9.536743164062500e-007) //!< 2^-20 +#define TWO_N21 (4.768371582031250e-007) //!< 2^-21 +#define TWO_N24 (5.960464477539063e-008) //!< 2^-24 +#define TWO_N25 (2.980232238769531e-008) //!< 2^-25 +#define TWO_N27 (7.450580596923828e-009) //!< 2^-27 +#define TWO_N29 (1.862645149230957e-009) //!< 2^-29 +#define TWO_N30 (9.313225746154785e-010) //!< 2^-30 +#define TWO_N31 (4.656612873077393e-010) //!< 2^-31 +#define TWO_N32 (2.328306436538696e-010) //!< 2^-32 +#define TWO_N33 (1.164153218269348e-010) //!< 2^-33 +#define TWO_N38 (3.637978807091713e-012) //!< 2^-38 +#define TWO_N43 (1.136868377216160e-013) //!< 2^-43 +#define TWO_N50 (8.881784197001252e-016) //!< 2^-50 +#define TWO_N55 (2.775557561562891e-017) //!< 2^-55 +#define TWO_P56 (7.205759403792794e+016) //!< 2^56 +#define TWO_P57 (1.441151880758559e+017) //!< 2^57 + +#define PI_TWO_N19 (5.992112452678286e-006) //!< Pi*2^-19 +#define PI_TWO_N43 (3.571577341960839e-013) //!< Pi*2^-43 +#define PI_TWO_N31 (1.462918079267160e-009) //!< Pi*2^-31 +#define PI_TWO_N38 (1.142904749427469e-011) //!< Pi*2^-38 +#define PI_TWO_N23 (3.745070282923929e-007) //!< Pi*2^-23 + +// GPS NAVIGATION MESSAGE STRUCTURE +// NAVIGATION MESSAGE FIELDS POSITIONS (from GPS SPS Signal specifications) + +// SUBFRAME 1-5 (TLM and HOW) +const bits_slice SUBFRAME_ID[]= {{50,3}}; +const bits_slice TOW[]= {{31,17}}; + +// SUBFRAME 1 +const bits_slice GPS_WEEK[]= {{61,10}}; +const bits_slice SV_ACCURACY[]= {{73,4}}; +const bits_slice SV_HEALTH[]= {{77,6}}; +const bits_slice T_GD[]= {{197,8}}; +const double T_GD_LSB=TWO_N31; + +const bits_slice IODC[]= {{83,2},{211,8}}; +const bits_slice T_OC[]= {{219,16}}; +const double T_OC_LSB=TWO_P4; + +const bits_slice A_F2[]= {{241,8}}; +const double A_F2_LSB=TWO_N55; +const bits_slice A_F1[]= {{249,16}}; +const double A_F1_LSB=TWO_N43; +const bits_slice A_F0[]= {{271,22}}; +const double A_F0_LSB=TWO_N31; + +// SUBFRAME 2 + +const bits_slice IODE_SF2[]= {{61,8}}; +const bits_slice C_RS[]= {{69,16}}; +const double C_RS_LSB=TWO_N5; +const bits_slice DELTA_N[]= {{91,16}}; +const double DELTA_N_LSB=PI_TWO_N43; +const bits_slice M_0[]= {{107,8},{121,24}}; +const double M_0_LSB=PI_TWO_N31; +const bits_slice C_UC[]= {{151,16}}; +const double C_UC_LSB=TWO_N29; +const bits_slice E[]= {{167,8},{181,24}}; +const double E_LSB=TWO_N33; +const bits_slice C_US[]= {{211,16}}; +const double C_US_LSB=TWO_N29; +const bits_slice SQRT_A[]= {{227,8},{241,24}}; +const double SQRT_A_LSB=TWO_N19; +const bits_slice T_OE[]= {{271,16}}; +const double T_OE_LSB=TWO_P4; + +// SUBFRAME 3 + +const bits_slice C_IC[]= {{61,16}}; +const double C_IC_LSB=TWO_N29; +const bits_slice OMEGA_0[]= {{77,8},{91,24}}; +const double OMEGA_0_LSB=PI_TWO_N31; +const bits_slice C_IS[]= {{121,16}}; +const double C_IS_LSB=TWO_N29; +const bits_slice I_0[]= {{137,8},{151,24}}; +const double I_0_LSB=PI_TWO_N31; +const bits_slice C_RC[]= {{181,16}}; +const double C_RC_LSB=TWO_N5; +const bits_slice OMEGA[]= {{197,8},{211,24}}; +const double OMEGA_LSB=PI_TWO_N31; +const bits_slice OMEGA_DOT[]= {{241,24}}; +const double OMEGA_DOT_LSB=PI_TWO_N43; +const bits_slice IODE_SF3[]= {{271,8}}; + +const bits_slice I_DOT[]= {{279,14}}; +const double I_DOT_LSB=PI_TWO_N43; + + +// SUBFRAME 4-5 + +const bits_slice SV_DATA_ID[]= {{61,2}}; +const bits_slice SV_PAGE[]= {{63,6}}; + +// SUBFRAME 4 + +// SUBFRAME 5 + + +#endif /* GPS_DEFINES_H */ diff --git a/src/core/system_parameters/gps_navigation_message.cc b/src/core/system_parameters/gps_navigation_message.cc new file mode 100644 index 000000000..308ea7d23 --- /dev/null +++ b/src/core/system_parameters/gps_navigation_message.cc @@ -0,0 +1,542 @@ +/*! + * \file gps_navigation_message.cc + * \brief Implementation of GPS L1 C/A navigation message decoding + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "gps_navigation_message.h" + +//! Sets all the ephemeris parameters to zero +void gps_navigation_message::reset() +{ + d_TOW=0; + //broadcast orbit 1 + d_IODE_SF2=0; + d_IODE_SF3=0; + d_Crs=0; + d_Delta_n=0; + d_M_0=0; + //broadcast orbit 2 + d_Cuc=0; + d_e_eccentricity=0; + d_Cus=0; + d_sqrt_A=0; + //broadcast orbit 3 + d_Toe=0; + d_Toc=0; + d_Cic=0; + d_OMEGA0=0; + d_Cis=0; + //broadcast orbit 4 + d_i_0=0; + d_Crc=0; + d_OMEGA=0; + d_OMEGA_DOT=0; + //broadcast orbit 5 + d_IDOT=0; + d_codes_on_L2=0; + d_GPS_week=0; + d_L2_P_data_flag=0; + //broadcast orbit 6 + d_SV_accuracy=0; + d_SV_health=0; + d_TGD=0; + d_IODC=0; + //broadcast orbit 7 + d_transmission_time=0; + d_fit_interval=0; + d_spare1=0; + d_spare2=0; + + d_A_f0=0; + d_A_f1=0; + d_A_f2=0; + + //clock terms + d_master_clock=0; + d_dtr=0; + d_satClkCorr=0; + + // satellite positions + d_satpos_X=0; + d_satpos_Y=0; + d_satpos_Z=0; + + // info + d_channel_ID=0; + d_satellite_PRN=0; +} + +//! Default constructor +gps_navigation_message::gps_navigation_message() +{ + reset(); +} + +//! Read unsigned values +unsigned long int gps_navigation_message::read_navigation_unsigned(std::bitset bits, const bits_slice *slices, int num_of_slices) +{ + unsigned long int value; + value=0; + for (int i=0;i bits, const bits_slice *slices, int num_of_slices) +{ + signed long int value=0; + + // read the MSB ad perform the sign extension + if (bits[GPS_SUBFRAME_BITS-slices[0].position]==1) + { + value^=0xFFFFFFFF; + }else{ + value&=0; + } + for (int i=0;i half_week) + { + corrTime = time - 2*half_week; + }else if (time < -half_week) + { + corrTime = time + 2*half_week; + } + return corrTime; +} + +void gps_navigation_message::master_clock() +{ + double dt; + double satClkCorr; + // Find initial satellite clock correction -------------------------------- + + // --- Find time difference --------------------------------------------- + dt = check_t(d_TOW - d_Toc); + + //--- Calculate clock correction --------------------------------------- + satClkCorr = (d_A_f2 * dt + d_A_f1) * dt + d_A_f0 - d_TGD; + + d_master_clock = d_TOW - satClkCorr; +} + + +//! Computes satellite position from ephemeris data +void gps_navigation_message::satpos() +{ + double tk; + double a; + double n; + double n0; + double M; + double E; + double E_old; + double dE; + double nu; + double phi; + double u; + double r; + double i; + double Omega; + + // Find satellite's position ---------------------------------------------- + + // Restore semi-major axis + a = d_sqrt_A*d_sqrt_A; + + // Time correction + tk = check_t(d_master_clock - d_Toe); + + // Initial mean motion + n0 = sqrt(GM / (a*a*a)); + // Mean motion + n = n0 + d_Delta_n; + + // Mean anomaly + M = d_M_0 + n * tk; + // Reduce mean anomaly to between 0 and 360 deg + + M = fmod((M + 2*GPS_PI),(2*GPS_PI)); + + // Initial guess of eccentric anomaly + E = M; + + // --- Iteratively compute eccentric anomaly ---------------------------- + for (int ii = 1;ii<11;ii++) + { + E_old = E; + E = M + d_e_eccentricity * sin(E); + dE = fmod(E - E_old,2*GPS_PI); + std::cout<<"dE="< + +using namespace boost::assign; + +#include "GPS_L1_CA.h" + +/*! + * \brief This class implements GPS L1 C/A navigation message decoding + * and computes satellite position + * + * It defines the specific GPS navigation (NAV) data structure, + * as defined in the document Interface Specification IS-GPS-200 Revision E, Appendix II + */ +class gps_navigation_message +{ + +private: + unsigned long int read_navigation_unsigned(std::bitset bits, const bits_slice *slices, int num_of_slices); + signed long int read_navigation_signed(std::bitset bits, const bits_slice *slices, int num_of_slices); + double check_t(double time); +public: + //broadcast orbit 1 + double d_TOW; + double d_IODE_SF2; + double d_IODE_SF3; + double d_Crs; + double d_Delta_n; + double d_M_0; + //broadcast orbit 2 + double d_Cuc; + double d_e_eccentricity; + double d_Cus; + double d_sqrt_A; + //broadcast orbit 3 + double d_Toe; + double d_Toc; + double d_Cic; + double d_OMEGA0; + double d_Cis; + //broadcast orbit 4 + double d_i_0; + double d_Crc; + double d_OMEGA; + double d_OMEGA_DOT; + //broadcast orbit 5 + double d_IDOT; + double d_codes_on_L2; + double d_GPS_week; + double d_L2_P_data_flag; + //broadcast orbit 6 + double d_SV_accuracy; + double d_SV_health; + double d_TGD; + double d_IODC; + //broadcast orbit 7 + double d_transmission_time; + double d_fit_interval; + double d_spare1; + double d_spare2; + + double d_A_f0; + double d_A_f1; + double d_A_f2; + + + // clock terms + double d_master_clock; //GPS transmission time + double d_satClkCorr; // GPS clock error + double d_dtr; // relativistic clock correction term + + // satellite positions + double d_satpos_X; + double d_satpos_Y; + double d_satpos_Z; + + // satellite identification info + + int d_channel_ID; + int d_satellite_PRN; + + // public functions + void reset(); + int subframe_decoder(char *subframe); + void master_clock(); + void satpos(); + void relativistic_clock_correction(); + bool satellite_validation(); + gps_navigation_message(); +}; + +#endif diff --git a/src/core/system_parameters/gps_telemetry.cc b/src/core/system_parameters/gps_telemetry.cc new file mode 100644 index 000000000..ec0153899 --- /dev/null +++ b/src/core/system_parameters/gps_telemetry.cc @@ -0,0 +1,100 @@ +/*! + * \file gps_telemetry.cc + * \brief Implementation of low-levels functions for GPS L1 C/A + * navigation message decoding + * \author Javier Arribas, 2011. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "gps_telemetry.h" + +#include +#include +#include + +bool gps_word_parityCheck(unsigned int gpsword) +{ + unsigned int d1,d2,d3,d4,d5,d6,d7,t,parity; + + /* XOR as many bits in parallel as possible. The magic constants pick + up bits which are to be XOR'ed together to implement the GPS parity + check algorithm described in ICD-GPS-200. This avoids lengthy shift- + and-xor loops. */ + + d1 = gpsword & 0xFBFFBF00; + d2 = _lrotl(gpsword,1) & 0x07FFBF01; + d3 = _lrotl(gpsword,2) & 0xFC0F8100; + d4 = _lrotl(gpsword,3) & 0xF81FFE02; + d5 = _lrotl(gpsword,4) & 0xFC00000E; + d6 = _lrotl(gpsword,5) & 0x07F00001; + d7 = _lrotl(gpsword,6) & 0x00003000; + + t = d1 ^ d2 ^ d3 ^ d4 ^ d5 ^ d6 ^ d7; + + // Now XOR the 5 6-bit fields together to produce the 6-bit final result. + + parity = t ^ _lrotl(t,6) ^ _lrotl(t,12) ^ _lrotl(t,18) ^ _lrotl(t,24); + parity = parity & 0x3F; + if (parity == (gpsword&0x3F)) + return(true); + else + return(false); + +} + +char bit_mask(int num_bits) +{ + char mask; + mask=1; + for (int i=0;i<(num_bits-1);i++) + { + mask<<=1; + mask++; + } + return mask; +} + +char bit_select(int num_bit) +{ + char mask; + mask=1; + for (int i=0;i<(num_bit-1);i++) + { + mask<<=1; + } + return mask; +} + +void print_gps_word_bytes(unsigned int GPS_word) +{ + std::cout << " Word ="; + std::cout<(GPS_word); + std::cout<. + * + * ------------------------------------------------------------------------- + */ + +#ifndef GPS_TELEMETRY_H_ +#define GPS_TELEMETRY_H_ + +#define _lrotl(X,N) ((X << N) ^ (X >> (32-N))) //!< Used in the parity check algorithm + +#include "GPS_L1_CA.h" + +bool gps_word_parityCheck(unsigned int gpsword); +char bit_mask(int num_bits); +char bit_select(int num_bit); +void print_gps_word_bytes(unsigned int GPS_word); + +#endif diff --git a/src/core/system_parameters/jamfile.jam b/src/core/system_parameters/jamfile.jam new file mode 100644 index 000000000..e88c789f3 --- /dev/null +++ b/src/core/system_parameters/jamfile.jam @@ -0,0 +1,4 @@ +project : build-dir ../../../build ; + +obj gps_navigation_message : gps_navigation_message.cc ; +obj gps_telemetry : gps_telemetry.cc ; \ No newline at end of file diff --git a/src/jamfile.jam b/src/jamfile.jam new file mode 100644 index 000000000..2238bdd5c --- /dev/null +++ b/src/jamfile.jam @@ -0,0 +1,4 @@ +build-project algorithms ; +build-project core ; +build-project main ; +# build-project tests ; diff --git a/src/main/jamfile.jam b/src/main/jamfile.jam new file mode 100644 index 000000000..8213cbec0 --- /dev/null +++ b/src/main/jamfile.jam @@ -0,0 +1,49 @@ +project : build-dir ../../build ; +exe mercurio : main.cc +../algorithms/acquisition/adapters//gps_l1_ca_gps_sdr_acquisition +../algorithms/acquisition/adapters//gps_l1_ca_pcps_acquisition +../algorithms/acquisition/adapters//gps_l1_ca_tong_pcps_acquisition +../algorithms/acquisition/gnuradio_blocks//gps_l1_ca_gps_sdr_acquisition_cc +../algorithms/acquisition/gnuradio_blocks//gps_l1_ca_gps_sdr_acquisition_ss +../algorithms/acquisition/gnuradio_blocks//gps_l1_ca_pcps_acquisition_cc +../algorithms/acquisition/gnuradio_blocks//gps_l1_ca_tong_pcps_acquisition_cc +../algorithms/channel/adapters//channel +../algorithms/channel/libs//gps_l1_ca_channel_fsm +../algorithms/conditioner/adapters//direct_resampler_conditioner +../algorithms/conditioner/gnuradio_blocks//direct_resampler_conditioner_cc +../algorithms/conditioner/gnuradio_blocks//direct_resampler_conditioner_ss +../algorithms/libs//gps_sdr_signal_processing +../algorithms/libs//gnss_sdr_valve +../algorithms/libs//pass_through +../algorithms/libs//gps_sdr_fft +../algorithms/libs//gps_sdr_simd +../algorithms/libs//gps_sdr_x86 +../algorithms/observables/adapters//gps_l1_ca_observables +../algorithms/observables/gnuradio_blocks//gps_l1_ca_observables_cc +../algorithms/observables/libs//rinex_2_1_printer +../algorithms/output_filter/adapters//file_output_filter +../algorithms/output_filter/adapters//null_sink_output_filter +../algorithms/signal_source/adapters//file_signal_source +../algorithms/signal_source/adapters//usrp1_signal_source +../algorithms/telemetry_decoder/adapters//gps_l1_ca_telemetry_decoder +../algorithms/telemetry_decoder/gnuradio_blocks//gps_l1_ca_telemetry_decoder_cc +../algorithms/telemetry_decoder/libs//gps_l1_ca_subframe_fsm +../algorithms/tracking/adapters//gps_l1_ca_dll_pll_tracking +../algorithms/tracking/gnuradio_blocks//gps_l1_ca_dll_pll_tracking_cc +../core/libs//INIReader +../core/libs//ini +../core/libs//string_converter +../core/receiver//control_message_factory +../core/receiver//control_thread +../core/receiver//file_configuration +../core/receiver//in_memory_configuration +../core/receiver//gnss_block_factory +../core/receiver//gnss_flowgraph +../core/system_parameters//gps_navigation_message +../core/system_parameters//gps_telemetry +../..//gflags +../..//glog +../..//gnuradio-core +../..//gnuradio-usrp ; + +install ../../install : mercurio ; diff --git a/src/main/main.cc b/src/main/main.cc new file mode 100644 index 000000000..0a82116a7 --- /dev/null +++ b/src/main/main.cc @@ -0,0 +1,75 @@ +/*! + * \file main.cc + * \brief Main file of the GNSS-SDR program. + * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com + * + * It creates a ControlThread object, makes it run, and releases memory + * back when the main thread has ended. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ +#include +#include +#include +#include +#include "control_thread.h" +#include +#include +#include +#include "concurrent_queue.h" +#include "gps_navigation_message.h" + +using google::LogMessage; + +// TODO: make this queue generic for all the GNSS systems (javi) +/*! + * \brief Concurrent queue that communicates the Telemetry Decoder + * to the Observables modules + */ +concurrent_queue global_gps_nav_msg_queue; + +int main(int argc, char** argv) +{ + const std::string intro_help( + std::string("\nGNSS-SDR is an Open Source GNSS Software Defined Receiver\n") + + + "Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors)\n" + + + "This program comes with ABSOLUTELY NO WARRANTY;\n" + + + "See COPYING file to see a copy of the General Public License\n \n"); + + google::SetUsageMessage(intro_help); + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + + ControlThread *control_thread = new ControlThread(); + + control_thread->run(); + + delete control_thread; + google::ShutDownCommandLineFlags(); +} diff --git a/src/tests/arithmetic/complex_arithmetic_gsl.cc b/src/tests/arithmetic/complex_arithmetic_gsl.cc new file mode 100644 index 000000000..d9929854c --- /dev/null +++ b/src/tests/arithmetic/complex_arithmetic_gsl.cc @@ -0,0 +1,50 @@ + +#include +#include + +#include +#include + +#include + +#include +#include +#include + +#include +#include + +using google::LogMessage; + +DEFINE_int32(N, 2046, "Size of the arrays used for calculations"); +DEFINE_int32(M, 1000, "Iterations"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + LOG_AT_LEVEL(INFO) << "Using standard GNU GSL library to perform complex arithmetic"; + + std::srand((int)time(0)); + + gsl_vector_complex* input = gsl_vector_complex_alloc(FLAGS_N); + gsl_complex zero; + GSL_SET_COMPLEX(&zero, std::rand() % 10000, std::rand() % 10000); + + gsl_vector_complex_set_all(input, zero); + + LOG_AT_LEVEL(INFO) << "Begin calculations"; + + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + + for(int i=0;i +#include + +#include + +#include +#include +#include + +#include +#include + +using google::LogMessage; + +DEFINE_int32(size, 100000, "Size of the arrays used for calculations"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + LOG_AT_LEVEL(INFO) << "Using standard C++ library implementation to perform complex arithmetic"; + + std::complex* input = new std::complex[FLAGS_size]; + std::complex* output = new std::complex[FLAGS_size]; + + memset(input, 0, sizeof(std::complex)*FLAGS_size); + + LOG_AT_LEVEL(INFO) << "Allocated two vectors containing " << FLAGS_size << " complex numbers"; + + LOG_AT_LEVEL(INFO) << "Begin multiplications"; + + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + + for(int i=0;i +#include + +#include "gps_sdr_simd.h" + +#include + +#include +#include +#include + +#include +#include + +using google::LogMessage; + +DEFINE_int32(N, 2046, "Size of the arrays used for calculations"); +DEFINE_int32(M, 1000, "Iterations"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + LOG_AT_LEVEL(INFO) << "Using standard SIMD implementation (GPS-SDR) to perform complex arithmetic"; + + std::srand((int)time(0)); + CPX* input = new CPX[FLAGS_N]; + + for(int i=0;i +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +using google::LogMessage; + +DEFINE_int32(N, 2046, "Samples per milisecond of signal"); +DEFINE_int32(M, 6000, "Number of correlations per GNSS-SDR channel"); +DEFINE_int32(C, 12, "Number of channels to simulate"); +DEFINE_string(data_type, "complex", "Data type for samples"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + int correlations = FLAGS_M * FLAGS_C; + + LOG_AT_LEVEL(INFO) << "Simulating " << FLAGS_C << " channels"; + LOG_AT_LEVEL(INFO) << FLAGS_M << " correlations per channel"; + LOG_AT_LEVEL(INFO) << "Performing " << correlations << " correlations"; + + LOG_AT_LEVEL(INFO) << "Testing GNU GSL library using float complex numbers"; + + std::srand((unsigned)time(0)); + + gsl_vector_complex* input = gsl_vector_complex_alloc(FLAGS_N); + gsl_vector_complex* ones = gsl_vector_complex_alloc(FLAGS_N); + gsl_complex random; + gsl_complex one; + gsl_complex sum; + GSL_SET_COMPLEX(&one, 1, 1); + GSL_SET_COMPLEX(&sum, 1, 1); + GSL_SET_COMPLEX(&random, std::rand() % 10000, std::rand() % 10000); + + gsl_vector_complex_set_all(input, random); + gsl_vector_complex_set_all(ones, one); + + LOG_AT_LEVEL(INFO) << "Begin Calculations"; + + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + + for(int i=0;i +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +using google::LogMessage; + +DEFINE_int32(N, 2046, "Samples per milisecond of signal"); +DEFINE_int32(M, 6000, "Number of correlations per GNSS-SDR channel"); +DEFINE_int32(C, 12, "Number of channels to simulate"); +DEFINE_string(data_type, "complex", "Data type for samples"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + int correlations = FLAGS_M * FLAGS_C; + + LOG_AT_LEVEL(INFO) << "Simulating " << FLAGS_C << " channels"; + LOG_AT_LEVEL(INFO) << FLAGS_M << " correlations per channel"; + LOG_AT_LEVEL(INFO) << "Performing " << correlations << " correlations"; + + LOG_AT_LEVEL(INFO) << "Testing standard C++ library using complex numbers"; + + std::complex* input = new std::complex[FLAGS_N]; + std::complex accum; + + std::srand((unsigned)time(0)); + + for(int i=0;i(std::rand() % 10000, std::rand() % 10000); + } + + LOG_AT_LEVEL(INFO) << "Begin Calculations"; + + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + + for(int i=0;i +#include +#include + +#include "gps_sdr_simd.h" + +#include + +#include +#include +#include + +#include +#include + +using google::LogMessage; + +DEFINE_int32(N, 2046, "Samples per milisecond of signal"); +DEFINE_int32(M, 6000, "Number of correlations per GNSS-SDR channel"); +DEFINE_int32(C, 12, "Number of channels to simulate"); +DEFINE_string(data_type, "complex", "Data type for samples"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + int correlations = FLAGS_M * FLAGS_C; + + LOG_AT_LEVEL(INFO) << "Simulating " << FLAGS_C << " channels"; + LOG_AT_LEVEL(INFO) << FLAGS_M << " correlations per channel"; + LOG_AT_LEVEL(INFO) << "Performing " << correlations << " correlations"; + + LOG_AT_LEVEL(INFO) << "Testing GPS SDR SIMD library using CPX struct"; + + std::srand((unsigned)time(0)); + + CPX* input = new CPX[FLAGS_N]; + + for (int i=0;iHAVE_INLINE GSL_RANGE_CHECK_OFF ; + +exe complex_arithmetic_atlas : +.//complex_arithmetic_gsl +../../..//glog +../../..//gflags +../../..//gsl +../../..//gslcblas : +HAVE_INLINE GSL_RANGE_CHECK_OFF ; + +exe complex_arithmetic_gotoblas2 : +.//complex_arithmetic_gsl +../../..//glog +../../..//gflags +../../..//gsl +../../..//gslcblas : +HAVE_INLINE GSL_RANGE_CHECK_OFF ; + +exe complex_arithmetic_libc : complex_arithmetic_libc.cc +../../..//glog +../../..//gflags ; + +exe complex_arithmetic_simd : complex_arithmetic_simd.cc +../../..//glog +../../..//gflags +../../gps_sdr//gps_sdr_simd ; + + +install ../../../install/tests : +complex_arithmetic_gotoblas2 +complex_arithmetic_atlas +complex_arithmetic_gsl_blas +complex_arithmetic_libc +complex_arithmetic_simd ; \ No newline at end of file diff --git a/src/tests/configuration/file_configuration_test.cc b/src/tests/configuration/file_configuration_test.cc new file mode 100644 index 000000000..44b634fd2 --- /dev/null +++ b/src/tests/configuration/file_configuration_test.cc @@ -0,0 +1,55 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class FileConfiguration. + * + */ + +#include +#include + +#include +#include "file_configuration.h" + +TEST(FileConfiguration, OverridedProperties) { + ConfigurationInterface *configuration = new FileConfiguration("./src/tests/data/config_file_sample.txt"); + std::string default_value = "default_value"; + std::string value = configuration->property("NotThere", default_value); + + EXPECT_STREQ("default_value", value.c_str()); + + configuration->set_property("NotThere", "Yes!"); + value = configuration->property("NotThere", default_value); + + EXPECT_STREQ("Yes!", value.c_str()); + + delete configuration; +} + +TEST(FileConfiguration, LoadFromNonExistentFile) { + + ConfigurationInterface *configuration = new FileConfiguration("./i_dont_exist.conf"); + std::string default_value = "default_value"; + std::string value = configuration->property("whatever.whatever", default_value); + + EXPECT_STREQ("default_value", value.c_str()); + + delete configuration; +} + +TEST(FileConfiguration, PropertyDoesNotExist) { + ConfigurationInterface *configuration = new FileConfiguration("./src/tests/data/config_file_sample.txt"); + std::string default_value = "default_value"; + std::string value = configuration->property("whatever.whatever", default_value); + + EXPECT_STREQ("default_value", value.c_str()); + + delete configuration; +} diff --git a/src/tests/configuration/in_memory_configuration_test.cc b/src/tests/configuration/in_memory_configuration_test.cc new file mode 100644 index 000000000..6aed5934f --- /dev/null +++ b/src/tests/configuration/in_memory_configuration_test.cc @@ -0,0 +1,115 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class InMemoryConfiguration. + * + */ + +#include + +#include "configuration_interface.h" +#include "in_memory_configuration.h" + +TEST(InMemoryConfiguration, IsPresent) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + EXPECT_FALSE(configuration->is_present("NotThere")); + + configuration->set_property("NotThere", "Yes!"); + EXPECT_TRUE(configuration->is_present("NotThere")); + + delete configuration; +} + +TEST(InMemoryConfiguration, StoreAndRetrieve) { + ConfigurationInterface *configuration = new InMemoryConfiguration(); + + ((InMemoryConfiguration*)configuration)->set_property("Foo.property1", "value"); + std::string default_value = "default_value"; + std::string value = configuration->property("Foo.property1", default_value); + + EXPECT_STREQ("value", value.c_str()); + + delete configuration; +} + +TEST(InMemoryConfiguration, NoStoringAndRetrieve) { + ConfigurationInterface *configuration = new InMemoryConfiguration(); + std::string default_value = "default_value"; + std::string value = configuration->property("Foo.property1", default_value); + + EXPECT_STREQ("default_value", value.c_str()); + + delete configuration; +} + +TEST(InMemoryConfiguration, RetrieveBool) { + ConfigurationInterface *configuration = new InMemoryConfiguration(); + + ((InMemoryConfiguration*)configuration)->set_property("Foo.property1", "true"); + bool value = configuration->property("Foo.property1", false); + + EXPECT_EQ(true, value); + + delete configuration; +} + +TEST(InMemoryConfiguration, RetrieveBoolFail) { + ConfigurationInterface *configuration = new InMemoryConfiguration(); + + ((InMemoryConfiguration*)configuration)->set_property("Foo.property1", "tru"); + bool value = configuration->property("Foo.property1", false); + + EXPECT_EQ(false, value); + + delete configuration; +} + +TEST(InMemoryConfiguration, RetrieveBoolNoDefine) { + ConfigurationInterface *configuration = new InMemoryConfiguration(); + + bool value = configuration->property("Foo.property1", false); + + EXPECT_EQ(false, value); + + delete configuration; +} + +TEST(InMemoryConfiguration, RetrieveSizeT) { + ConfigurationInterface *configuration = new InMemoryConfiguration(); + + ((InMemoryConfiguration*)configuration)->set_property("Foo.property1", "8"); + unsigned int value = configuration->property("Foo.property1", 4); + + EXPECT_EQ(8, value); + + delete configuration; +} + +TEST(InMemoryConfiguration, RetrieveSizeTFail) { + ConfigurationInterface *configuration = new InMemoryConfiguration(); + + ((InMemoryConfiguration*)configuration)->set_property("Foo.property1", "true"); + unsigned int value = configuration->property("Foo.property1", 4); + + EXPECT_EQ(4, value); + + delete configuration; +} + +TEST(InMemoryConfiguration, RetrieveSizeTNoDefine) { + ConfigurationInterface *configuration = new InMemoryConfiguration(); + + unsigned int value = configuration->property("Foo.property1", 4); + + EXPECT_EQ(4, value); + + delete configuration; +} diff --git a/src/tests/control_thread/control_message_factory_test.cc b/src/tests/control_thread/control_message_factory_test.cc new file mode 100644 index 000000000..cdec3c6d7 --- /dev/null +++ b/src/tests/control_thread/control_message_factory_test.cc @@ -0,0 +1,75 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Tests for the class ControlMessageFactory. + * + */ + +#include + +#include + +#include "control_message_factory.h" + +TEST(ControlMessageFactory, GetQueueMessage) { + + ControlMessageFactory *factory = new ControlMessageFactory(); + + gr_message_sptr queue_message = factory->GetQueueMessage(0, 0); + ControlMessage *control_message = (ControlMessage*)queue_message->msg(); + + EXPECT_EQ(0, control_message->who); + EXPECT_EQ(0, control_message->what); + EXPECT_EQ(sizeof(ControlMessage), queue_message->length()); + + delete factory; +} + +TEST(ControlMessageFactory, GetControlMessages) { + + ControlMessageFactory *factory = new ControlMessageFactory(); + ControlMessage *control_message = new ControlMessage; + + control_message->who = 1; + control_message->what = 4; + + gr_message_sptr queue_message = gr_make_message(0, 0, 0, sizeof(ControlMessage)); + memcpy(queue_message->msg(), control_message, sizeof(ControlMessage)); + std::vector *control_messages = factory->GetControlMessages(queue_message); + + EXPECT_EQ(1, control_messages->size()); + EXPECT_EQ(1, control_messages->at(0)->who); + EXPECT_EQ(4, control_messages->at(0)->what); + + delete control_message; + delete control_messages; + delete factory; +} + +TEST(ControlMessageFactory, GetControlMessagesWrongSize) { + + ControlMessageFactory *factory = new ControlMessageFactory(); + ControlMessage *control_message = new ControlMessage; + + control_message->who = 1; + control_message->what = 4; + int another_int = 10; + + gr_message_sptr queue_message = gr_make_message(0, 0, 0, sizeof(ControlMessage) + sizeof(int)); + memcpy(queue_message->msg(), control_message, sizeof(ControlMessage)); + memcpy(queue_message->msg() + sizeof(ControlMessage), &another_int, sizeof(int)); + std::vector *control_messages = factory->GetControlMessages(queue_message); + + EXPECT_EQ(0, control_messages->size()); + + delete control_message; + delete control_messages; + delete factory; +} diff --git a/src/tests/control_thread/control_thread_test.cc b/src/tests/control_thread/control_thread_test.cc new file mode 100644 index 000000000..0d48c1939 --- /dev/null +++ b/src/tests/control_thread/control_thread_test.cc @@ -0,0 +1,124 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Tests for the class ControlThread. + * + */ + +#include + +#include + +#include "control_thread.h" +#include "in_memory_configuration.h" + + +TEST(ControlThread, InstantiateRunControlMessages) { + + InMemoryConfiguration *config = new InMemoryConfiguration(); + config->set_property("SignalSource.implementation", "FileSignalSource"); + config->set_property("SignalSource.filename", "./signal_samples/signal.dat"); + config->set_property("SignalSource.item_type", "gr_complex"); + config->set_property("SignalConditioner.implementation", "PassThrough"); + config->set_property("SignalConditioner.item_type", "gr_complex"); + config->set_property("Channels.count", "12"); + config->set_property("Acquisition.implementation", "PassThrough"); + config->set_property("Acquisition.item_type", "gr_complex"); + config->set_property("Tracking.implementation", "PassThrough"); + config->set_property("Tracking.item_type", "gr_complex"); + config->set_property("Navigation.implementation", "PassThrough"); + config->set_property("Navigation.item_type", "gr_complex"); + config->set_property("Pseudorange.implementation", "PassThrough"); + config->set_property("Pseudorange.item_type", "gr_complex"); + config->set_property("PVT.implementation", "Adder"); + config->set_property("PVT.item_type", "gr_complex"); + config->set_property("OutputFilter.implementation", "NullSinkOutputFilter"); + config->set_property("OutputFilter.item_type", "gr_complex"); + + ControlThread *control_thread = new ControlThread(config); + + gr_msg_queue_sptr control_queue = gr_make_msg_queue(0); + ControlMessageFactory *control_msg_factory = new ControlMessageFactory(); + + control_queue->handle(control_msg_factory->GetQueueMessage(0,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(1,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(2,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(3,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(4,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(5,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(6,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(7,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(8,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(9,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(10,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(11,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(12,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(13,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(14,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(15,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(16,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(200,0)); + + control_thread->set_control_queue(control_queue); + + control_thread->run(); + + EXPECT_EQ(18, control_thread->processed_control_messages()); + EXPECT_EQ(1, control_thread->applied_actions()); + + delete config; + delete control_thread; + delete control_msg_factory; +} + +TEST(ControlThread, InstantiateRunControlMessages2) { + + InMemoryConfiguration *config = new InMemoryConfiguration(); + config->set_property("SignalSource.implementation", "FileSignalSource"); + config->set_property("SignalSource.filename", "./signal_samples/signal.dat"); + config->set_property("SignalSource.item_type", "gr_complex"); + config->set_property("SignalConditioner.implementation", "PassThrough"); + config->set_property("SignalConditioner.item_type", "gr_complex"); + config->set_property("Channels.count", "12"); + config->set_property("Acquisition.implementation", "PassThrough"); + config->set_property("Acquisition.item_type", "gr_complex"); + config->set_property("Tracking.implementation", "PassThrough"); + config->set_property("Tracking.item_type", "gr_complex"); + config->set_property("Navigation.implementation", "PassThrough"); + config->set_property("Navigation.item_type", "gr_complex"); + config->set_property("Pseudorange.implementation", "PassThrough"); + config->set_property("Pseudorange.item_type", "gr_complex"); + config->set_property("PVT.implementation", "Adder"); + config->set_property("PVT.item_type", "gr_complex"); + config->set_property("OutputFilter.implementation", "NullSinkOutputFilter"); + config->set_property("OutputFilter.item_type", "gr_complex"); + + ControlThread *control_thread = new ControlThread(config); + + gr_msg_queue_sptr control_queue = gr_make_msg_queue(0); + ControlMessageFactory *control_msg_factory = new ControlMessageFactory(); + + control_queue->handle(control_msg_factory->GetQueueMessage(0,0)); + control_queue->handle(control_msg_factory->GetQueueMessage(0,2)); + control_queue->handle(control_msg_factory->GetQueueMessage(0,1)); + control_queue->handle(control_msg_factory->GetQueueMessage(0,3)); + control_queue->handle(control_msg_factory->GetQueueMessage(200,0)); + + control_thread->set_control_queue(control_queue); + + control_thread->run(); + + EXPECT_EQ(5, control_thread->processed_control_messages()); + EXPECT_EQ(1, control_thread->applied_actions()); + + delete config; + delete control_thread; + delete control_msg_factory; +} diff --git a/src/tests/data/config_file_sample.txt b/src/tests/data/config_file_sample.txt new file mode 100644 index 000000000..4cb3a666c --- /dev/null +++ b/src/tests/data/config_file_sample.txt @@ -0,0 +1,26 @@ +; Sample for a configuration file for MERCURIO + +[mercurio] +Foo.param1=value + +SignalSource.implementation=FileSignalSource +SignalSource.filename=./data/signal.dat +SignalSource.item_size=4 +SignalSource.repeat=false + +SignalConditioner.implementation=PassThrough +SignalConditioner.item_type=float +SignalConditioner.vector_size=1 + +Channels.count=1 + +Channel1.implementation=PassThrough +Channel1.item_type=float +Channel1.vector_size=1 + +PVT.implementation=PassThrough +PVT.item_type=float +PVT.vector_size=1 + +OutputFilter.implementation=NullSinkOutputFilter +OuputFilter.item_size=4 \ No newline at end of file diff --git a/src/tests/flowgraph/adder_test.cc b/src/tests/flowgraph/adder_test.cc new file mode 100644 index 000000000..fda98dabf --- /dev/null +++ b/src/tests/flowgraph/adder_test.cc @@ -0,0 +1,29 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class Adder + * + */ + +#include + +#include "adder.h" +#include "in_memory_configuration.h" + +TEST(Adder, Instantiate) { + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("Test.item_type", "gr_complex"); + + Adder *adder = new Adder(config, "PVT", 4, 1); + + delete adder; +} \ No newline at end of file diff --git a/src/tests/flowgraph/file_output_filter_test.cc b/src/tests/flowgraph/file_output_filter_test.cc new file mode 100644 index 000000000..52046efd9 --- /dev/null +++ b/src/tests/flowgraph/file_output_filter_test.cc @@ -0,0 +1,30 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class FileOutputFilter + * + */ + +#include + +#include "file_output_filter.h" +#include "in_memory_configuration.h" + +TEST(FileOutoutFilter, Instantiate) { + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("Test.filename", "./data/output.dat"); + config->set_property("Test.item_type", "float"); + + FileOutputFilter *output_filter = new FileOutputFilter(config, "Test", 1, 0); + + delete output_filter; +} \ No newline at end of file diff --git a/src/tests/flowgraph/file_signal_source_test.cc b/src/tests/flowgraph/file_signal_source_test.cc new file mode 100644 index 000000000..6136d5ba2 --- /dev/null +++ b/src/tests/flowgraph/file_signal_source_test.cc @@ -0,0 +1,61 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class InMemoryConfiguration. + * + */ + +#include + +#include +#include +#include +#include + +#include + +#include "file_signal_source.h" +#include "in_memory_configuration.h" + +TEST(FileSignalSource, Instantiate) { + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("Test.samples", "0"); + config->set_property("Test.sampling_frequency", "0"); + config->set_property("Test.filename", "./signal_samples/signal.dat"); + config->set_property("Test.item_type", "gr_complex"); + config->set_property("Test.repeat", "false"); + + FileSignalSource *signal_source = new FileSignalSource(config, "Test", 1, 1, queue); + + EXPECT_STREQ("./signal_samples/signal.dat", signal_source->filename().c_str()); + EXPECT_STREQ("gr_complex", signal_source->item_type().c_str()); + EXPECT_TRUE(signal_source->repeat() == false); + + delete signal_source; +} + +TEST(FileSignalSource, InstantiateFileNotExists) { + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("Test.samples", "0"); + config->set_property("Test.sampling_frequency", "0"); + config->set_property("Test.filename", "./signal_samples/i_dont_exist.dat"); + config->set_property("Test.item_type", "gr_complex"); + config->set_property("Test.repeat", "false"); + + EXPECT_THROW(new FileSignalSource(config, "Test", 1, 1, queue), std::runtime_error); +} diff --git a/src/tests/flowgraph/gnss_block_factory_test.cc b/src/tests/flowgraph/gnss_block_factory_test.cc new file mode 100644 index 000000000..0e61c9682 --- /dev/null +++ b/src/tests/flowgraph/gnss_block_factory_test.cc @@ -0,0 +1,181 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class GNSSBlockFactory. + * + */ + +#include + +#include + +#include + +#include "in_memory_configuration.h" +#include "gnss_block_interface.h" +#include "gnss_block_factory.h" + +TEST(GNSSBlockFactory, InstantiateChannels) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("Channels.count", "2"); + configuration->set_property("Channel1.implementation", "PassThrough"); + configuration->set_property("Channel1.item_type", "float"); + configuration->set_property("Channel1.vector_size", "1"); + configuration->set_property("Channel2.implementation", "PassThrough"); + configuration->set_property("Channel2.item_type", "float"); + configuration->set_property("Channel2.vector_size", "1"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + std::vector* channels = factory->GetChannels(configuration, queue); + + EXPECT_EQ(2, channels->size()); + + delete configuration; + delete factory; + for(unsigned int i=0 ; isize() ; i++) + delete channels->at(i); + channels->clear(); + delete channels; +} + +TEST(GNSSBlockFactory, InstantiateSignalSource) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("SignalSource.implementation", "FileSignalSource"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *signal_source = factory->GetSignalSource(configuration, queue); + + EXPECT_STREQ("SignalSource", signal_source->role().c_str()); + + delete configuration; + delete factory; + delete signal_source; +} + +TEST(GNSSBlockFactory, InstantiateWrongSignalSource) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("SignalSource.implementation", "Pepito"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *signal_source = factory->GetSignalSource(configuration, queue); + + EXPECT_EQ(NULL, signal_source); + + delete configuration; + delete factory; +} + +TEST(GNSSBlockFactory, InstantiateSignalConditioner) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("SignalConditioner.implementation", "PassThrough"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *signal_conditioner = factory->GetSignalConditioner(configuration, queue); + + EXPECT_STREQ("SignalConditioner", signal_conditioner->role().c_str()); + + delete configuration; + delete factory; + delete signal_conditioner; +} + +TEST(GNSSBlockFactory, InstantiateWrongSignalConditioner) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("SignalConditioner.implementation", "Pepito"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *signal_conditioner = factory->GetSignalConditioner(configuration, queue); + + EXPECT_EQ(NULL, signal_conditioner); + + delete configuration; + delete factory; +} + +TEST(GNSSBlockFactory, InstantiatePVT) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("PVT.implementation", "PassThrough"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *pvt = factory->GetPVT(configuration, queue); + + EXPECT_STREQ("PVT", pvt->role().c_str()); + + delete configuration; + delete factory; + delete pvt; +} + +TEST(GNSSBlockFactory, InstantiateWrongPVT) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("PVT.implementation", "Pepito"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *pvt = factory->GetPVT(configuration, queue); + + EXPECT_EQ(NULL, pvt); + + delete configuration; + delete factory; +} + +TEST(GNSSBlockFactory, InstantiateOutputFilter) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("OutputFilter.implementation", "NullSinkOutputFilter"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *output_filter = factory->GetOutputFilter(configuration, queue); + + EXPECT_STREQ("OutputFilter", output_filter->role().c_str()); + + delete configuration; + delete factory; + delete output_filter; +} + +TEST(GNSSBlockFactory, InstantiateWrongOutputFilter) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("OutputFilter.implementation", "Pepito"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *output_filter = factory->GetOutputFilter(configuration, queue); + + EXPECT_EQ(NULL, output_filter); + + delete configuration; + delete factory; +} \ No newline at end of file diff --git a/src/tests/flowgraph/gnss_flowgraph_test.cc b/src/tests/flowgraph/gnss_flowgraph_test.cc new file mode 100644 index 000000000..ea64eb522 --- /dev/null +++ b/src/tests/flowgraph/gnss_flowgraph_test.cc @@ -0,0 +1,66 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Tests for the class GNSSFlowgraph. + * + */ + +#include + +#include + +#include "gnss_flowgraph.h" +#include "gnss_block_interface.h" +#include "in_memory_configuration.h" +#include "file_configuration.h" +#include "channel.h" +#include "acquisition_interface.h" +#include "correlator_interface.h" + +TEST(GNSSFlowgraph, InstantiateConnectStartStop) { + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("SignalSource.implementation", "FileSignalSource"); + config->set_property("SignalConditioner.implementation", "PassThrough"); + config->set_property("Channels.count", "2"); + config->set_property("Channels.acquisition.implementation", "PassThrough"); + config->set_property("Channels.tracking.implementation", "PassThrough"); + config->set_property("Channels.navigation.implementation", "PassThrough"); + config->set_property("Channels.pseudorange.implementation", "PassThrough"); + config->set_property("PVT.implementation", "Adder"); + config->set_property("OutputFilter.implementation", "NullSinkOutputFilter"); + + GNSSFlowgraph* flowgraph = new GNSSFlowgraph(config, gr_make_msg_queue(0)); + + EXPECT_STREQ("FileSignalSource", flowgraph->signal_source()->implementation().c_str()); + EXPECT_STREQ("PassThrough", flowgraph->signal_conditioner()->implementation().c_str()); + EXPECT_STREQ("Channel", flowgraph->channel(0)->implementation().c_str()); + EXPECT_STREQ("PassThrough", ((GNSSChannel*)flowgraph->channel(0))->acquisition()->implementation().c_str()); + EXPECT_STREQ("PassThrough", ((GNSSChannel*)flowgraph->channel(0))->tracking()->implementation().c_str()); + EXPECT_STREQ("PassThrough", ((GNSSChannel*)flowgraph->channel(0))->navigation()->implementation().c_str()); + EXPECT_STREQ("PassThrough", ((GNSSChannel*)flowgraph->channel(0))->pseudorange()->implementation().c_str()); + EXPECT_STREQ("Channel", flowgraph->channel(1)->implementation().c_str()); + EXPECT_STREQ("PassThrough", ((GNSSChannel*)flowgraph->channel(1))->acquisition()->implementation().c_str()); + EXPECT_STREQ("PassThrough", ((GNSSChannel*)flowgraph->channel(1))->tracking()->implementation().c_str()); + EXPECT_STREQ("PassThrough", ((GNSSChannel*)flowgraph->channel(1))->navigation()->implementation().c_str()); + EXPECT_STREQ("PassThrough", ((GNSSChannel*)flowgraph->channel(1))->pseudorange()->implementation().c_str()); + EXPECT_STREQ("Adder", flowgraph->pvt()->implementation().c_str()); + EXPECT_STREQ("NullSinkOutputFilter", flowgraph->output_filter()->implementation().c_str()); + + EXPECT_NO_THROW(flowgraph->connect()); + EXPECT_TRUE(flowgraph->connected()); + EXPECT_NO_THROW(flowgraph->start()); + EXPECT_TRUE(flowgraph->running()); + flowgraph->stop(); + EXPECT_FALSE(flowgraph->running()); + + delete flowgraph; +} diff --git a/src/tests/flowgraph/pass_through_test.cc b/src/tests/flowgraph/pass_through_test.cc new file mode 100644 index 000000000..1df0e7f31 --- /dev/null +++ b/src/tests/flowgraph/pass_through_test.cc @@ -0,0 +1,35 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class NoConditioningSignalConditioner. + * + */ + +#include +#include +#include + +#include "pass_through.h" +#include "in_memory_configuration.h" + +TEST(PassThrough, Instantiate) { + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("Test.item_type", "gr_complex"); + config->set_property("Test.vector_size", "2"); + + PassThrough *signal_conditioner = new PassThrough(config, "Test", 1, 1); + + EXPECT_STREQ("gr_complex", signal_conditioner->item_type().c_str()); + EXPECT_EQ(2, signal_conditioner->vector_size()); + + delete signal_conditioner; +} \ No newline at end of file diff --git a/src/tests/gnss_block/adder_test.cc b/src/tests/gnss_block/adder_test.cc new file mode 100644 index 000000000..fda98dabf --- /dev/null +++ b/src/tests/gnss_block/adder_test.cc @@ -0,0 +1,29 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class Adder + * + */ + +#include + +#include "adder.h" +#include "in_memory_configuration.h" + +TEST(Adder, Instantiate) { + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("Test.item_type", "gr_complex"); + + Adder *adder = new Adder(config, "PVT", 4, 1); + + delete adder; +} \ No newline at end of file diff --git a/src/tests/gnss_block/file_output_filter_test.cc b/src/tests/gnss_block/file_output_filter_test.cc new file mode 100644 index 000000000..52046efd9 --- /dev/null +++ b/src/tests/gnss_block/file_output_filter_test.cc @@ -0,0 +1,30 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class FileOutputFilter + * + */ + +#include + +#include "file_output_filter.h" +#include "in_memory_configuration.h" + +TEST(FileOutoutFilter, Instantiate) { + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("Test.filename", "./data/output.dat"); + config->set_property("Test.item_type", "float"); + + FileOutputFilter *output_filter = new FileOutputFilter(config, "Test", 1, 0); + + delete output_filter; +} \ No newline at end of file diff --git a/src/tests/gnss_block/file_signal_source_test.cc b/src/tests/gnss_block/file_signal_source_test.cc new file mode 100644 index 000000000..6136d5ba2 --- /dev/null +++ b/src/tests/gnss_block/file_signal_source_test.cc @@ -0,0 +1,61 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class InMemoryConfiguration. + * + */ + +#include + +#include +#include +#include +#include + +#include + +#include "file_signal_source.h" +#include "in_memory_configuration.h" + +TEST(FileSignalSource, Instantiate) { + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("Test.samples", "0"); + config->set_property("Test.sampling_frequency", "0"); + config->set_property("Test.filename", "./signal_samples/signal.dat"); + config->set_property("Test.item_type", "gr_complex"); + config->set_property("Test.repeat", "false"); + + FileSignalSource *signal_source = new FileSignalSource(config, "Test", 1, 1, queue); + + EXPECT_STREQ("./signal_samples/signal.dat", signal_source->filename().c_str()); + EXPECT_STREQ("gr_complex", signal_source->item_type().c_str()); + EXPECT_TRUE(signal_source->repeat() == false); + + delete signal_source; +} + +TEST(FileSignalSource, InstantiateFileNotExists) { + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("Test.samples", "0"); + config->set_property("Test.sampling_frequency", "0"); + config->set_property("Test.filename", "./signal_samples/i_dont_exist.dat"); + config->set_property("Test.item_type", "gr_complex"); + config->set_property("Test.repeat", "false"); + + EXPECT_THROW(new FileSignalSource(config, "Test", 1, 1, queue), std::runtime_error); +} diff --git a/src/tests/gnss_block/gnss_block_factory_test.cc b/src/tests/gnss_block/gnss_block_factory_test.cc new file mode 100644 index 000000000..0e61c9682 --- /dev/null +++ b/src/tests/gnss_block/gnss_block_factory_test.cc @@ -0,0 +1,181 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Test for the class GNSSBlockFactory. + * + */ + +#include + +#include + +#include + +#include "in_memory_configuration.h" +#include "gnss_block_interface.h" +#include "gnss_block_factory.h" + +TEST(GNSSBlockFactory, InstantiateChannels) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("Channels.count", "2"); + configuration->set_property("Channel1.implementation", "PassThrough"); + configuration->set_property("Channel1.item_type", "float"); + configuration->set_property("Channel1.vector_size", "1"); + configuration->set_property("Channel2.implementation", "PassThrough"); + configuration->set_property("Channel2.item_type", "float"); + configuration->set_property("Channel2.vector_size", "1"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + std::vector* channels = factory->GetChannels(configuration, queue); + + EXPECT_EQ(2, channels->size()); + + delete configuration; + delete factory; + for(unsigned int i=0 ; isize() ; i++) + delete channels->at(i); + channels->clear(); + delete channels; +} + +TEST(GNSSBlockFactory, InstantiateSignalSource) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("SignalSource.implementation", "FileSignalSource"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *signal_source = factory->GetSignalSource(configuration, queue); + + EXPECT_STREQ("SignalSource", signal_source->role().c_str()); + + delete configuration; + delete factory; + delete signal_source; +} + +TEST(GNSSBlockFactory, InstantiateWrongSignalSource) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("SignalSource.implementation", "Pepito"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *signal_source = factory->GetSignalSource(configuration, queue); + + EXPECT_EQ(NULL, signal_source); + + delete configuration; + delete factory; +} + +TEST(GNSSBlockFactory, InstantiateSignalConditioner) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("SignalConditioner.implementation", "PassThrough"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *signal_conditioner = factory->GetSignalConditioner(configuration, queue); + + EXPECT_STREQ("SignalConditioner", signal_conditioner->role().c_str()); + + delete configuration; + delete factory; + delete signal_conditioner; +} + +TEST(GNSSBlockFactory, InstantiateWrongSignalConditioner) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("SignalConditioner.implementation", "Pepito"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *signal_conditioner = factory->GetSignalConditioner(configuration, queue); + + EXPECT_EQ(NULL, signal_conditioner); + + delete configuration; + delete factory; +} + +TEST(GNSSBlockFactory, InstantiatePVT) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("PVT.implementation", "PassThrough"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *pvt = factory->GetPVT(configuration, queue); + + EXPECT_STREQ("PVT", pvt->role().c_str()); + + delete configuration; + delete factory; + delete pvt; +} + +TEST(GNSSBlockFactory, InstantiateWrongPVT) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("PVT.implementation", "Pepito"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *pvt = factory->GetPVT(configuration, queue); + + EXPECT_EQ(NULL, pvt); + + delete configuration; + delete factory; +} + +TEST(GNSSBlockFactory, InstantiateOutputFilter) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("OutputFilter.implementation", "NullSinkOutputFilter"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *output_filter = factory->GetOutputFilter(configuration, queue); + + EXPECT_STREQ("OutputFilter", output_filter->role().c_str()); + + delete configuration; + delete factory; + delete output_filter; +} + +TEST(GNSSBlockFactory, InstantiateWrongOutputFilter) { + InMemoryConfiguration *configuration = new InMemoryConfiguration(); + + configuration->set_property("OutputFilter.implementation", "Pepito"); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + GNSSBlockFactory *factory = new GNSSBlockFactory(); + GNSSBlockInterface *output_filter = factory->GetOutputFilter(configuration, queue); + + EXPECT_EQ(NULL, output_filter); + + delete configuration; + delete factory; +} \ No newline at end of file diff --git a/src/tests/gnss_block/gnss_sdr_acquisition_test.cc b/src/tests/gnss_block/gnss_sdr_acquisition_test.cc new file mode 100644 index 000000000..0cc6a60b6 --- /dev/null +++ b/src/tests/gnss_block/gnss_sdr_acquisition_test.cc @@ -0,0 +1,132 @@ + +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gnss_block_factory.h" +#include "gnss_block_interface.h" +#include "in_memory_configuration.h" +#include "acquisition_interface.h" + +using google::LogMessage; + +DEFINE_bool(usrp, false, "If true, the USRPSignalSource will be used"); +DEFINE_string(usrp_gain, "40", "Gain"); +DEFINE_int32(satellite, 0, "Satellite to be acquired"); +DEFINE_string(fs_in, "2048000", "FS of the input signal"); +DEFINE_string(ifreq, "0", "Intermediate frequency"); +DEFINE_string(doppler_max, "15", "Doppler max"); +DEFINE_string(sampled_ms, "1", "ms used for acquisition"); +DEFINE_string(signal_filename, "./signal_samples/conditioner_30.dat", "Name of the file with the signal samples"); +DEFINE_string(item_type, "short", "Type of data for samples"); +DEFINE_string(dump, "true", "If true, magnitudes are written to a file"); + +int main(int argc, char** argv) { + + //printf("Runlevel 1 \r\n"); + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + DLOG(INFO) << "fs_in " << FLAGS_fs_in; + DLOG(INFO) << "ifreq " << FLAGS_ifreq; + DLOG(INFO) << "doppler_max " << FLAGS_doppler_max; + DLOG(INFO) << "sampled ms " << FLAGS_sampled_ms; + DLOG(INFO) << "signal filename " << FLAGS_signal_filename; + DLOG(INFO) << "satellite " << FLAGS_satellite; + DLOG(INFO) << "dump " << FLAGS_dump; + + gr_top_block_sptr top_block = gr_make_top_block("acquisition test"); + + size_t item_size; + + if(FLAGS_item_type.compare("short") == 0) { + item_size = sizeof(short); + } else if(FLAGS_item_type.compare("gr_complex") == 0) { + item_size = sizeof(gr_complex); + } else { + item_size = sizeof(short); + } + + // Build Acquisition GNSS block + GNSSBlockFactory* factory = new GNSSBlockFactory(); + InMemoryConfiguration* config = new InMemoryConfiguration(); + + //config->set_property("Acquisition.implementation", "GpsSdrAcquisition"); + config->set_property("Acquisition.implementation", "gnss_acquisition_a"); + config->set_property("Acquisition.fs_in", FLAGS_fs_in.c_str()); + config->set_property("Acquisition.ifreq", FLAGS_ifreq.c_str()); + config->set_property("Acquisition.doppler_max", FLAGS_doppler_max); + config->set_property("Acquisition.sampled_ms", FLAGS_sampled_ms); + config->set_property("Acquisition.dump", FLAGS_dump); + config->set_property("Acquisition.item_type", FLAGS_item_type); + + //GNSSBlockInterface* acquisition_gnss_block = factory->GetBlock(config, "Acquisition", "GpsSdrAcquisition", 1, 1, gr_msg_queue_sptr()); + GNSSBlockInterface* acquisition_gnss_block = factory->GetBlock(config, "Acquisition", "gnss_acquisition_a", 1, 1, gr_msg_queue_sptr()); + acquisition_gnss_block->connect(top_block); + + + if(FLAGS_usrp) { + + // Build USRP GNSS block + config->set_property("SignalSource.implementation", "USRPSignalSource"); + config->set_property("SignalSource.item_type", FLAGS_item_type); + config->set_property("SignalSource.decim_rate", "16"); + config->set_property("SignalSource.gain", FLAGS_usrp_gain); + config->set_property("SignalSource.dump", "false"); + + GNSSBlockInterface* usrp_source_gnss_block = factory->GetBlock(config, "SignalSource", "USRPSignalSource", 0, 1, gr_msg_queue_sptr()); + usrp_source_gnss_block->connect(top_block); + + // Build conditioner GNSS block + config->set_property("SignalConditioner.implementation", "DirectResampler"); + config->set_property("SignalConditioner.item_type", FLAGS_item_type); + config->set_property("SignalConditioner.sample_freq_in", "4000000"); + config->set_property("SignalConditioner.sample_freq_out", "2048000"); + config->set_property("SignalConditioner.dump", "false"); + + GNSSBlockInterface* resampler_gnss_block = factory->GetBlock(config, "SignalConditioner", "DirectResampler", 1, 1, gr_msg_queue_sptr()); + resampler_gnss_block->connect(top_block); + + top_block->connect(usrp_source_gnss_block->get_right_block(), 0, resampler_gnss_block->get_left_block(), 0); + top_block->connect(resampler_gnss_block->get_right_block(), 0, acquisition_gnss_block->get_left_block(), 0); + } else { + // file_source->gnss_acquisition + gr_block_sptr file_source = gr_make_file_source(item_size, FLAGS_signal_filename.c_str()); + top_block->connect(file_source, 0, acquisition_gnss_block->get_left_block(), 0); + } + + //printf("runlevel 2 \r \n"); + gr_block_sptr null_sink = gr_make_null_sink(item_size); + top_block->connect(acquisition_gnss_block->get_right_block(), 0, null_sink, 0); // gnss_acquisition->null_sink + + LOG_AT_LEVEL(INFO) << "testing satellite " << FLAGS_satellite; + ((AcquisitionInterface*)acquisition_gnss_block)->set_satellite(FLAGS_satellite); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gnss_block/gnss_sdr_direct_resampler.cc b/src/tests/gnss_block/gnss_sdr_direct_resampler.cc new file mode 100644 index 000000000..c1efc50f8 --- /dev/null +++ b/src/tests/gnss_block/gnss_sdr_direct_resampler.cc @@ -0,0 +1,71 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Executes a resampler based on some input parameters. + * This is intended to check performance of resampling implementations. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include +#include + +#include "gnss_sdr_direct_resampler_ccf.h" + +DEFINE_string(signal_file, "signal_samples/signal.dat", + "Path to the file containing the signal samples"); + +DEFINE_int64(fs_in, 8000000, "FS of the signal in Hz"); +DEFINE_int64(fs_out, 2048000, "FS of the resampled signal in Hz"); + +int mcd(int a, int b){ + if (a==0) return b; + return mcd(b%a,a); +} + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + + LOG_AT_LEVEL(INFO) << "Frequency IN " << FLAGS_fs_in; + LOG_AT_LEVEL(INFO) << "Frequency OUT " << FLAGS_fs_out; + + gr_top_block_sptr top_block = gr_make_top_block("gnss_sdr_direct_resampler_test"); + gr_file_source_sptr source = gr_make_file_source(sizeof(gr_complex),FLAGS_signal_file.c_str()); + + gnss_sdr_direct_resampler_ccf_sptr resampler = gnss_sdr_make_direct_resampler_ccf(FLAGS_fs_in, FLAGS_fs_out); + gr_block_sptr sink = gr_make_null_sink(sizeof(gr_complex)); + + top_block->connect(source, 0, resampler, 0); + top_block->connect(resampler, 0, sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gnss_block/gnss_sdr_signal_conditioner_test.cc b/src/tests/gnss_block/gnss_sdr_signal_conditioner_test.cc new file mode 100644 index 000000000..013f8e1d1 --- /dev/null +++ b/src/tests/gnss_block/gnss_sdr_signal_conditioner_test.cc @@ -0,0 +1,81 @@ + +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "gnss_block_factory.h" +#include "gnss_block_interface.h" +#include "in_memory_configuration.h" + +using google::LogMessage; + +DEFINE_string(fs_in, "4000000", "FS of the input signal"); +DEFINE_string(fs_out, "2048000", "FS of the output signal"); +DEFINE_string(dump_filename, "./data/signal_conditioner_test.dat", "Dump filename"); +DEFINE_string(signal_filename, "./signal_samples/usrp_30.dat", "Name of the file containing the signal samples"); +DEFINE_string(item_type, "short", "Type of data for samples"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + DLOG(INFO) << "fs_in " << FLAGS_fs_in; + DLOG(INFO) << "fs_out " << FLAGS_fs_out; + + gr_top_block_sptr top_block = gr_make_top_block("signal conditioner test"); + + GNSSBlockFactory* factory = new GNSSBlockFactory(); + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("SignalConditioner.implementation", "DirectResampler"); + config->set_property("SignalConditioner.sample_freq_in", FLAGS_fs_in.c_str()); + config->set_property("SignalConditioner.sample_freq_out", FLAGS_fs_out.c_str()); + config->set_property("SignalConditioner.dump", "true"); + config->set_property("SignalConditioner.dump_filename", FLAGS_dump_filename); + config->set_property("SignalConditioner.item_type", FLAGS_item_type); + + GNSSBlockInterface* gnss_block = factory->GetSignalConditioner(config, queue); + gnss_block->connect(top_block); + + size_t item_size; + + if(FLAGS_item_type.compare("short") == 0) { + item_size = sizeof(short); + } else if(FLAGS_item_type.compare("gr_complex") == 0) { + item_size = sizeof(gr_complex); + } else { + item_size = sizeof(short); + } + + gr_block_sptr null_sink = gr_make_null_sink(item_size); + gr_block_sptr file_source = gr_make_file_source(item_size, FLAGS_signal_filename.c_str()); + + top_block->connect(file_source, 0, gnss_block->get_left_block(), 0); + top_block->connect(gnss_block->get_right_block(), 0, null_sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); + +} diff --git a/src/tests/gnss_block/gnss_sdr_usrp_signal_source_test.cc b/src/tests/gnss_block/gnss_sdr_usrp_signal_source_test.cc new file mode 100644 index 000000000..43642b29c --- /dev/null +++ b/src/tests/gnss_block/gnss_sdr_usrp_signal_source_test.cc @@ -0,0 +1,80 @@ + +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include "gnss_block_factory.h" +#include "gnss_block_interface.h" +#include "in_memory_configuration.h" + +using google::LogMessage; + +DEFINE_string(d, "16", "Decimation"); +DEFINE_string(f, "1.57542e9", "Carrier frequency of the signal"); +DEFINE_string(g, "40", "Gain in dB"); +DEFINE_string(s, "4000000", "Samples to be recorded"); +DEFINE_string(dump_filename, "./data/usrp_test.dat", "Dump filename"); +DEFINE_string(item_type, "short", "Data type for samples"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + DLOG(INFO) << "samples " << FLAGS_s; + DLOG(INFO) << "f " << FLAGS_f; + DLOG(INFO) << "g " << FLAGS_g; + DLOG(INFO) << "item_type " << FLAGS_item_type; + + gr_top_block_sptr top_block = gr_make_top_block("usrp signal source test"); + + GNSSBlockFactory* factory = new GNSSBlockFactory(); + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("SignalSource.implementation", "USRPSignalSource"); + config->set_property("SignalSource.freq", FLAGS_f.c_str()); + config->set_property("SignalSource.gain", FLAGS_g.c_str()); + config->set_property("SignalSource.samples", FLAGS_s.c_str()); + config->set_property("SignalSource.item_type", FLAGS_item_type.c_str()); + config->set_property("SignalSource.dump", "true"); + config->set_property("SignalSource.dump_filename", FLAGS_dump_filename); + + GNSSBlockInterface* gnss_block = factory->GetSignalSource(config, queue); + gnss_block->connect(top_block); + + size_t item_size; + + if(FLAGS_item_type.compare("short") == 0) { + item_size = sizeof(short); + } else { + item_size = sizeof(gr_complex); + } + + gr_block_sptr null_sink = gr_make_null_sink(item_size); + + top_block->connect(gnss_block->get_right_block(), 0, null_sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); + +} diff --git a/src/tests/gnss_block/gnss_sdr_valve_test.cc b/src/tests/gnss_block/gnss_sdr_valve_test.cc new file mode 100644 index 000000000..1c63f7eed --- /dev/null +++ b/src/tests/gnss_block/gnss_sdr_valve_test.cc @@ -0,0 +1,50 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements unit tests for a the valve custom block. + * + */ + +#include +#include +#include +#include + +#include + +#include "gnss_sdr_valve.h" + +#include +#include + +using google::LogMessage; + +TEST(GNSS_SDR_VALVE, CheckEventSentAfter100Samples) { + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + gr_top_block_sptr top_block = gr_make_top_block("gnss_sdr_valve_test"); + gr_block_sptr valve = gnss_sdr_make_valve(sizeof(float), 100, queue); + gr_sig_source_f_sptr source = gr_make_sig_source_f(100, GR_CONST_WAVE, 100, 1, 0); + gr_block_sptr sink = gr_make_null_sink(sizeof(float)); + + LOG_AT_LEVEL(INFO) << "Queue count is " << queue->count(); + EXPECT_EQ(0, queue->count()); + + top_block->connect(source, 0, valve, 0); + top_block->connect(valve, 0, sink, 0); + + top_block->run(); + top_block->stop(); + + LOG_AT_LEVEL(INFO) << "Queue count is " << queue->count(); + EXPECT_EQ(1, queue->count()); + +} diff --git a/src/tests/gnss_block/gps_sdr_acquisition_test.cc b/src/tests/gnss_block/gps_sdr_acquisition_test.cc new file mode 100644 index 000000000..f39280e1b --- /dev/null +++ b/src/tests/gnss_block/gps_sdr_acquisition_test.cc @@ -0,0 +1,81 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Executes a gps sdr acquisition based on some input parameters. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include +#include +#include +#include + +#include "gnss_sdr_direct_resampler_ccf.h" + +DEFINE_string(signal_file, "signal_samples/signal.dat", + "Path to the file containing the signal samples"); + +DEFINE_int64(fs_in, 2048000, "FS of the signal in Hz"); +DEFINE_int64(if_freq, 0, "Intermediate frequency"); +DEFINE_int32(satellite, 0, "Satellite number"); +DEFINE_bool(dump, false, "If true, acquisition result will be dumped in a file"); +DEFINE_int32(ms, 1, "ms of signal to be used in the acquisition process"); +DEFINE_int32(shift_resolution, 15, "shift resolution for acquisition"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + int samples_per_ms = ceil(FLAGS_fs_in/1000); + + LOG_AT_LEVEL(INFO) << "fs_in " << FLAGS_fs_in; + LOG_AT_LEVEL(INFO) << "if_freq " << FLAGS_if_freq; + LOG_AT_LEVEL(INFO) << "satellite " << FLAGS_satellite; + + gr_top_block_sptr top_block = gr_make_top_block("gps_sdr_acquisition_test"); + gr_block_sptr source = gr_make_file_source(sizeof(gr_complex),FLAGS_signal_file.c_str()); + gr_block_sptr complex_to_interleaved_short = gr_make_complex_to_interleaved_short(); + + gr_block_sptr stream_to_vector = gr_make_stream_to_vector(sizeof(short), samples_per_ms); + gr_block_sptr acquisition = gps_sdr_make_acquisition_ss(FLAGS_satellite, FLAGS_ms, FLAGS_shift_resolution, FLAGS_if_freq, FLAGS_fs_in, samples_per_ms, queue, FLAGS_dump); + gr_block_sptr null_sink = gr_make_null_sink(sizeof(short)*samples_per_ms); + + top_block->connect(source, 0, complex_to_interleaved_short, 0); + top_block->connect(complex_to_interleaved_short, 0, stream_to_vector, 0); + top_block->connect(stream_to_vector, 0 , acquisition, 0); + top_block->connect(acquisition, 0, null_sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gnss_block/gr_pfb_arb_resampler.cc b/src/tests/gnss_block/gr_pfb_arb_resampler.cc new file mode 100644 index 000000000..5ac9b6953 --- /dev/null +++ b/src/tests/gnss_block/gr_pfb_arb_resampler.cc @@ -0,0 +1,98 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Executes a resampler based on some input parameters. + * This is intended to check performance of resampling implementations. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include + +#include "gr_pfb_arb_resampler_ccf.h" + +DEFINE_string(signal_file, "signal_samples/signal.dat", + "Path to the file containing the signal samples"); + +DEFINE_int64(fs_in, 8000000, "FS of the signal in Hz"); +DEFINE_int64(fs_out, 2048000, "FS of the resampled signal in Hz"); +DEFINE_int64(trans_band, 100000, "Transition band of the filter"); + +int mcd(int a, int b){ + if (a==0) return b; + return mcd(b%a,a); +} + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + + double cutoff_freq; + int div = mcd(FLAGS_fs_in,FLAGS_fs_out); + unsigned int interpolation = FLAGS_fs_out/div; + unsigned int decimation = FLAGS_fs_in/div; + double sampling_freq = FLAGS_fs_in*interpolation; + float rate = FLAGS_fs_in/FLAGS_fs_out; + double gain = (double) interpolation; + + if(interpolation > decimation) { + cutoff_freq = FLAGS_fs_in/2; + } else { + cutoff_freq = (interpolation*FLAGS_fs_in)/(decimation*2); + } + + LOG_AT_LEVEL(INFO) << "fs_in " << FLAGS_fs_in; + LOG_AT_LEVEL(INFO) << "fs_out " << FLAGS_fs_out; + LOG_AT_LEVEL(INFO) << "signal file " << FLAGS_signal_file; + LOG_AT_LEVEL(INFO) << "transition band " << FLAGS_trans_band; + LOG_AT_LEVEL(INFO) << "Interpolation " << interpolation; + LOG_AT_LEVEL(INFO) << "Decimation " << decimation; + LOG_AT_LEVEL(INFO) << "LPF cut-off frequency " << cutoff_freq; + LOG_AT_LEVEL(INFO) << "Sampling frequency " << sampling_freq; + + gr_top_block_sptr top_block = gr_make_top_block("gr_pfb_arb_resampler_test"); + + gr_file_source_sptr source = gr_make_file_source(sizeof(gr_complex),FLAGS_signal_file.c_str()); + + std::vector low_pass_taps = + gr_firdes::low_pass(gain, sampling_freq, cutoff_freq, FLAGS_trans_band, (gr_firdes::win_type)1); + + LOG_AT_LEVEL(INFO) << "Taps count " << low_pass_taps.size(); + + gr_pfb_arb_resampler_ccf_sptr resampler = + gr_make_pfb_arb_resampler_ccf(rate, low_pass_taps, interpolation); + gr_block_sptr sink = gr_make_null_sink(sizeof(gr_complex)); + + top_block->connect(source, 0, resampler, 0); + top_block->connect(resampler, 0, sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gnss_block/gr_rational_resampler.cc b/src/tests/gnss_block/gr_rational_resampler.cc new file mode 100644 index 000000000..b25f35813 --- /dev/null +++ b/src/tests/gnss_block/gr_rational_resampler.cc @@ -0,0 +1,97 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Executes a resampler based on some input parameters. + * This is intended to check performance of resampling implementations. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include +#include + +DEFINE_string(signal_file, "signal_samples/signal.dat", + "Path to the file containing the signal samples"); + +DEFINE_int64(fs_in, 8000000, "FS of the signal in Hz"); +DEFINE_int64(fs_out, 2048000, "FS of the resampled signal in Hz"); +DEFINE_int64(trans_band, 100000, "Transition band of the filter"); +DEFINE_int32(window, 0, "win type"); + +int mcd(int a, int b){ + if (a==0) return b; + return mcd(b%a,a); +} + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + + int div = mcd(FLAGS_fs_in, FLAGS_fs_out); + unsigned int interpolation = FLAGS_fs_out/div; + unsigned int decimation = FLAGS_fs_in/div; + double sampling_freq = FLAGS_fs_in*interpolation; + double gain = (double) interpolation; + double cutoff_freq; + + if(interpolation > decimation) { + cutoff_freq = FLAGS_fs_in/2; + } else { + cutoff_freq = (interpolation*FLAGS_fs_in)/(decimation*2); + } + + LOG_AT_LEVEL(INFO) << "fs_in " << FLAGS_fs_in; + LOG_AT_LEVEL(INFO) << "fs_out " << FLAGS_fs_out; + LOG_AT_LEVEL(INFO) << "trans_band " << FLAGS_trans_band; + LOG_AT_LEVEL(INFO) << "Interpolation " << interpolation; + LOG_AT_LEVEL(INFO) << "Decimation " << decimation; + LOG_AT_LEVEL(INFO) << "LPF cut-off frequency " << cutoff_freq; + LOG_AT_LEVEL(INFO) << "Sampling frequency " << sampling_freq; + LOG_AT_LEVEL(INFO) << "Windows " << FLAGS_window; + + gr_top_block_sptr top_block = gr_make_top_block("gr_rational_resampler_test"); + + gr_file_source_sptr file_in = gr_make_file_source(sizeof(gr_complex),FLAGS_signal_file.c_str()); + + std::vector low_pass_taps = + gr_firdes::low_pass(gain, sampling_freq, cutoff_freq, FLAGS_trans_band, (gr_firdes::win_type)FLAGS_window); + + LOG_AT_LEVEL(INFO) << "Taps count " << low_pass_taps.size(); + + gr_rational_resampler_base_ccf_sptr resampler = + gr_make_rational_resampler_base_ccf(interpolation, decimation, low_pass_taps); + gr_block_sptr sink = gr_make_null_sink(sizeof(gr_complex)); + + top_block->connect(file_in, 0, resampler, 0); + top_block->connect(resampler, 0, sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gnuradio_block/gnss_sdr_direct_resampler.cc b/src/tests/gnuradio_block/gnss_sdr_direct_resampler.cc new file mode 100644 index 000000000..c1efc50f8 --- /dev/null +++ b/src/tests/gnuradio_block/gnss_sdr_direct_resampler.cc @@ -0,0 +1,71 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Executes a resampler based on some input parameters. + * This is intended to check performance of resampling implementations. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include +#include + +#include "gnss_sdr_direct_resampler_ccf.h" + +DEFINE_string(signal_file, "signal_samples/signal.dat", + "Path to the file containing the signal samples"); + +DEFINE_int64(fs_in, 8000000, "FS of the signal in Hz"); +DEFINE_int64(fs_out, 2048000, "FS of the resampled signal in Hz"); + +int mcd(int a, int b){ + if (a==0) return b; + return mcd(b%a,a); +} + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + + LOG_AT_LEVEL(INFO) << "Frequency IN " << FLAGS_fs_in; + LOG_AT_LEVEL(INFO) << "Frequency OUT " << FLAGS_fs_out; + + gr_top_block_sptr top_block = gr_make_top_block("gnss_sdr_direct_resampler_test"); + gr_file_source_sptr source = gr_make_file_source(sizeof(gr_complex),FLAGS_signal_file.c_str()); + + gnss_sdr_direct_resampler_ccf_sptr resampler = gnss_sdr_make_direct_resampler_ccf(FLAGS_fs_in, FLAGS_fs_out); + gr_block_sptr sink = gr_make_null_sink(sizeof(gr_complex)); + + top_block->connect(source, 0, resampler, 0); + top_block->connect(resampler, 0, sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gnuradio_block/gnss_sdr_valve_test.cc b/src/tests/gnuradio_block/gnss_sdr_valve_test.cc new file mode 100644 index 000000000..3ecaac195 --- /dev/null +++ b/src/tests/gnuradio_block/gnss_sdr_valve_test.cc @@ -0,0 +1,50 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements unit tests for a the valve custom block. + * + */ + +#include +#include +#include +#include + +#include + +#include "gnss_sdr_valve.h" + +#include +#include + +using google::LogMessage; + +TEST(GNSS_SDR_VALVE, CheckEventSentAfter100Samples) { + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + gr_top_block_sptr top_block = gr_make_top_block("gnss_sdr_valve_test"); + gr_block_sptr valve = gnss_sdr_make_valve(sizeof(float), 100, queue); + gr_sig_source_f_sptr source = gr_make_sig_source_f(100, GR_CONST_WAVE, 100, 1, 0); + gr_block_sptr sink = gr_make_null_sink(sizeof(float)); + + LOG_AT_LEVEL(INFO) << "Queue count is " << queue->count(); + EXPECT_EQ(0, queue->count()); + + top_block->connect(source, 0, valve, 0); + top_block->connect(valve, 0, sink, 0); + + top_block->run(); + top_block->stop(); + + LOG_AT_LEVEL(INFO) << "Queue count is " << queue->count(); + EXPECT_EQ(1, queue->count()); + +} \ No newline at end of file diff --git a/src/tests/gnuradio_block/gps_sdr_acquisition_test.cc b/src/tests/gnuradio_block/gps_sdr_acquisition_test.cc new file mode 100644 index 000000000..f39280e1b --- /dev/null +++ b/src/tests/gnuradio_block/gps_sdr_acquisition_test.cc @@ -0,0 +1,81 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Executes a gps sdr acquisition based on some input parameters. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include +#include +#include +#include + +#include "gnss_sdr_direct_resampler_ccf.h" + +DEFINE_string(signal_file, "signal_samples/signal.dat", + "Path to the file containing the signal samples"); + +DEFINE_int64(fs_in, 2048000, "FS of the signal in Hz"); +DEFINE_int64(if_freq, 0, "Intermediate frequency"); +DEFINE_int32(satellite, 0, "Satellite number"); +DEFINE_bool(dump, false, "If true, acquisition result will be dumped in a file"); +DEFINE_int32(ms, 1, "ms of signal to be used in the acquisition process"); +DEFINE_int32(shift_resolution, 15, "shift resolution for acquisition"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + gr_msg_queue_sptr queue = gr_make_msg_queue(0); + + int samples_per_ms = ceil(FLAGS_fs_in/1000); + + LOG_AT_LEVEL(INFO) << "fs_in " << FLAGS_fs_in; + LOG_AT_LEVEL(INFO) << "if_freq " << FLAGS_if_freq; + LOG_AT_LEVEL(INFO) << "satellite " << FLAGS_satellite; + + gr_top_block_sptr top_block = gr_make_top_block("gps_sdr_acquisition_test"); + gr_block_sptr source = gr_make_file_source(sizeof(gr_complex),FLAGS_signal_file.c_str()); + gr_block_sptr complex_to_interleaved_short = gr_make_complex_to_interleaved_short(); + + gr_block_sptr stream_to_vector = gr_make_stream_to_vector(sizeof(short), samples_per_ms); + gr_block_sptr acquisition = gps_sdr_make_acquisition_ss(FLAGS_satellite, FLAGS_ms, FLAGS_shift_resolution, FLAGS_if_freq, FLAGS_fs_in, samples_per_ms, queue, FLAGS_dump); + gr_block_sptr null_sink = gr_make_null_sink(sizeof(short)*samples_per_ms); + + top_block->connect(source, 0, complex_to_interleaved_short, 0); + top_block->connect(complex_to_interleaved_short, 0, stream_to_vector, 0); + top_block->connect(stream_to_vector, 0 , acquisition, 0); + top_block->connect(acquisition, 0, null_sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gnuradio_block/gps_sdr_fft_block_test.cc b/src/tests/gnuradio_block/gps_sdr_fft_block_test.cc new file mode 100644 index 000000000..02847714b --- /dev/null +++ b/src/tests/gnuradio_block/gps_sdr_fft_block_test.cc @@ -0,0 +1,64 @@ + +/** + * Copyright notice + */ + +/** + * Author: Luis Esteve, 2010. + */ + +/** + * Executes the Tong algorithm for a gps sdr acquisition based on some input parameters. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include +#include +#include + +#include "gps_sdr_fft_block.h" +#include "gps_sdr_signal_processing.h" + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + gr_top_block_sptr top_block = gr_make_top_block("gps sdr fft block test"); + gr_block_sptr source = gr_make_sig_source_c(2048, GR_SIN_WAVE, 1, 32767, 0); + gr_block_sptr complex2short = gr_make_complex_to_interleaved_short(); + gr_block_sptr fft = gps_sdr_make_fft(); + gr_block_sptr sink = gr_make_file_sink(sizeof(short)*2*2048, "./data/gps_sdr_fft_block_test.dat"); + gr_block_sptr str2vec = gr_make_stream_to_vector(sizeof(short), 2048*2); + gr_block_sptr head = gr_make_head(sizeof(gr_complex), 2048); + + top_block->connect(source, 0, head, 0); + top_block->connect(head, 0, complex2short, 0); + top_block->connect(complex2short, 0, str2vec, 0); + top_block->connect(str2vec, 0, fft, 0); + top_block->connect(fft, 0, sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gnuradio_block/gps_sdr_tong_acquisition_test.cc b/src/tests/gnuradio_block/gps_sdr_tong_acquisition_test.cc new file mode 100644 index 000000000..3cfe67ad2 --- /dev/null +++ b/src/tests/gnuradio_block/gps_sdr_tong_acquisition_test.cc @@ -0,0 +1,94 @@ + +/** + * Copyright notice + */ + +/** + * Author: Luis Esteve, 2010. + */ + +/** + * Executes the Tong algorithm for a gps sdr acquisition based on some input parameters. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gnss_sdr_direct_resampler_ccf.h" + +DEFINE_string(signal_file, "signal_samples/signal.dat", + "Path to the file containing the signal samples"); + +DEFINE_int64(fs_in, 2048000, "FS of the signal in Hz"); +DEFINE_int64(if_freq, 0, "Intermediate frequency"); +DEFINE_int32(satellite, 0, "Satellite number"); +DEFINE_bool(dump, false, "If true, acquisition result will be dumped in a file"); +DEFINE_int32(ms, 1, "ms of signal to be used in the acquisition process"); +DEFINE_int32(shift_resolution, 15, "shift resolution for acquisition"); +DEFINE_int32(A_value, 8, "Value of the k variable when the acquisition_done is true"); +DEFINE_int64(acquisition_threshold, 2000000, "threshold of the acquisition algorithm"); +//DEFINE_int32(max_dwells, 30, "number of dwells in Tong acquisition algorithm"); +DEFINE_int32(B_value, 2, "Value of the initial K variable in Tong algorithm"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + gr_msg_queue_sptr queue = gr_msg_queue_sptr(); + + int samples_per_ms = ceil(FLAGS_fs_in/1000); + gr_complex div = 0.001; + + LOG_AT_LEVEL(INFO) << "fs_in " << FLAGS_fs_in; + LOG_AT_LEVEL(INFO) << "if_freq " << FLAGS_if_freq; + LOG_AT_LEVEL(INFO) << "satellite " << FLAGS_satellite; +// LOG_AT_LEVEL(INFO) << "max_dwells " << FLAGS_max_dwells; + LOG_AT_LEVEL(INFO) << "threshold " << FLAGS_acquisition_threshold; + LOG_AT_LEVEL(INFO) << "A_value " << FLAGS_A_value; + LOG_AT_LEVEL(INFO) << "B_value " << FLAGS_B_value; + + + gr_top_block_sptr top_block = gr_make_top_block("gps_sdr_tong_acquisition_test"); + gr_block_sptr source = gr_make_file_source(sizeof(gr_complex),FLAGS_signal_file.c_str()); + gr_multiply_const_cc_sptr divisor = gr_make_multiply_const_cc(div); + gr_block_sptr complex_to_interleaved_short = gr_make_complex_to_interleaved_short(); + + gr_block_sptr stream_to_vector = gr_make_stream_to_vector(sizeof(short), samples_per_ms); + gr_block_sptr acquisition = gps_sdr_make_tong_acquisition_ss(FLAGS_satellite, FLAGS_ms, FLAGS_shift_resolution, FLAGS_if_freq, FLAGS_fs_in, samples_per_ms, queue, FLAGS_dump, FLAGS_B_value, FLAGS_acquisition_threshold, FLAGS_A_value); + gr_block_sptr null_sink = gr_make_null_sink(sizeof(short)*samples_per_ms); + + top_block->connect(source, 0, divisor, 0); + top_block->connect(divisor, 0, complex_to_interleaved_short, 0); + top_block->connect(complex_to_interleaved_short, 0, stream_to_vector, 0); + top_block->connect(stream_to_vector, 0 , acquisition, 0); + top_block->connect(acquisition, 0, null_sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gnuradio_block/gr_pfb_arb_resampler.cc b/src/tests/gnuradio_block/gr_pfb_arb_resampler.cc new file mode 100644 index 000000000..5ac9b6953 --- /dev/null +++ b/src/tests/gnuradio_block/gr_pfb_arb_resampler.cc @@ -0,0 +1,98 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Executes a resampler based on some input parameters. + * This is intended to check performance of resampling implementations. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include + +#include "gr_pfb_arb_resampler_ccf.h" + +DEFINE_string(signal_file, "signal_samples/signal.dat", + "Path to the file containing the signal samples"); + +DEFINE_int64(fs_in, 8000000, "FS of the signal in Hz"); +DEFINE_int64(fs_out, 2048000, "FS of the resampled signal in Hz"); +DEFINE_int64(trans_band, 100000, "Transition band of the filter"); + +int mcd(int a, int b){ + if (a==0) return b; + return mcd(b%a,a); +} + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + + double cutoff_freq; + int div = mcd(FLAGS_fs_in,FLAGS_fs_out); + unsigned int interpolation = FLAGS_fs_out/div; + unsigned int decimation = FLAGS_fs_in/div; + double sampling_freq = FLAGS_fs_in*interpolation; + float rate = FLAGS_fs_in/FLAGS_fs_out; + double gain = (double) interpolation; + + if(interpolation > decimation) { + cutoff_freq = FLAGS_fs_in/2; + } else { + cutoff_freq = (interpolation*FLAGS_fs_in)/(decimation*2); + } + + LOG_AT_LEVEL(INFO) << "fs_in " << FLAGS_fs_in; + LOG_AT_LEVEL(INFO) << "fs_out " << FLAGS_fs_out; + LOG_AT_LEVEL(INFO) << "signal file " << FLAGS_signal_file; + LOG_AT_LEVEL(INFO) << "transition band " << FLAGS_trans_band; + LOG_AT_LEVEL(INFO) << "Interpolation " << interpolation; + LOG_AT_LEVEL(INFO) << "Decimation " << decimation; + LOG_AT_LEVEL(INFO) << "LPF cut-off frequency " << cutoff_freq; + LOG_AT_LEVEL(INFO) << "Sampling frequency " << sampling_freq; + + gr_top_block_sptr top_block = gr_make_top_block("gr_pfb_arb_resampler_test"); + + gr_file_source_sptr source = gr_make_file_source(sizeof(gr_complex),FLAGS_signal_file.c_str()); + + std::vector low_pass_taps = + gr_firdes::low_pass(gain, sampling_freq, cutoff_freq, FLAGS_trans_band, (gr_firdes::win_type)1); + + LOG_AT_LEVEL(INFO) << "Taps count " << low_pass_taps.size(); + + gr_pfb_arb_resampler_ccf_sptr resampler = + gr_make_pfb_arb_resampler_ccf(rate, low_pass_taps, interpolation); + gr_block_sptr sink = gr_make_null_sink(sizeof(gr_complex)); + + top_block->connect(source, 0, resampler, 0); + top_block->connect(resampler, 0, sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gnuradio_block/gr_rational_resampler.cc b/src/tests/gnuradio_block/gr_rational_resampler.cc new file mode 100644 index 000000000..b25f35813 --- /dev/null +++ b/src/tests/gnuradio_block/gr_rational_resampler.cc @@ -0,0 +1,97 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Executes a resampler based on some input parameters. + * This is intended to check performance of resampling implementations. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include +#include + +DEFINE_string(signal_file, "signal_samples/signal.dat", + "Path to the file containing the signal samples"); + +DEFINE_int64(fs_in, 8000000, "FS of the signal in Hz"); +DEFINE_int64(fs_out, 2048000, "FS of the resampled signal in Hz"); +DEFINE_int64(trans_band, 100000, "Transition band of the filter"); +DEFINE_int32(window, 0, "win type"); + +int mcd(int a, int b){ + if (a==0) return b; + return mcd(b%a,a); +} + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + + int div = mcd(FLAGS_fs_in, FLAGS_fs_out); + unsigned int interpolation = FLAGS_fs_out/div; + unsigned int decimation = FLAGS_fs_in/div; + double sampling_freq = FLAGS_fs_in*interpolation; + double gain = (double) interpolation; + double cutoff_freq; + + if(interpolation > decimation) { + cutoff_freq = FLAGS_fs_in/2; + } else { + cutoff_freq = (interpolation*FLAGS_fs_in)/(decimation*2); + } + + LOG_AT_LEVEL(INFO) << "fs_in " << FLAGS_fs_in; + LOG_AT_LEVEL(INFO) << "fs_out " << FLAGS_fs_out; + LOG_AT_LEVEL(INFO) << "trans_band " << FLAGS_trans_band; + LOG_AT_LEVEL(INFO) << "Interpolation " << interpolation; + LOG_AT_LEVEL(INFO) << "Decimation " << decimation; + LOG_AT_LEVEL(INFO) << "LPF cut-off frequency " << cutoff_freq; + LOG_AT_LEVEL(INFO) << "Sampling frequency " << sampling_freq; + LOG_AT_LEVEL(INFO) << "Windows " << FLAGS_window; + + gr_top_block_sptr top_block = gr_make_top_block("gr_rational_resampler_test"); + + gr_file_source_sptr file_in = gr_make_file_source(sizeof(gr_complex),FLAGS_signal_file.c_str()); + + std::vector low_pass_taps = + gr_firdes::low_pass(gain, sampling_freq, cutoff_freq, FLAGS_trans_band, (gr_firdes::win_type)FLAGS_window); + + LOG_AT_LEVEL(INFO) << "Taps count " << low_pass_taps.size(); + + gr_rational_resampler_base_ccf_sptr resampler = + gr_make_rational_resampler_base_ccf(interpolation, decimation, low_pass_taps); + gr_block_sptr sink = gr_make_null_sink(sizeof(gr_complex)); + + top_block->connect(file_in, 0, resampler, 0); + top_block->connect(resampler, 0, sink, 0); + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + top_block->stop(); +} diff --git a/src/tests/gps_sdr/simd_tests.cc b/src/tests/gps_sdr/simd_tests.cc new file mode 100644 index 000000000..b2ae84db3 --- /dev/null +++ b/src/tests/gps_sdr/simd_tests.cc @@ -0,0 +1,77 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Executes a gps sdr acquisition based on some input parameters. + * + */ + +#include +#include + +#include + +#include +#include + +using google::LogMessage; + +#include +#include +#include +#include +#include + +#include "gps_sdr_simd.h" + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + + CPX* A = new CPX[100]; + CPX* B = new CPX[100]; + CPX* C = new CPX[100]; + + for(int i=0;i<100;i++) { + A[i].i = 1; + A[i].q = 1; + B[i].i = 0; + B[i].q = 0; + C[i].i = 2; + C[i].q = 2; + } + + LOG_AT_LEVEL(INFO) << "Run"; + struct timeval tv; + gettimeofday(&tv, NULL); + long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; + sse_cmulsc(A, B, C, 10, 10); + gettimeofday(&tv, NULL); + long long int end = tv.tv_sec *1000000 + tv.tv_usec; + LOG_AT_LEVEL(INFO) << "Finished in " << (end - begin) << " microseconds"; + std::cout << (end - begin) << std::endl; + + std::cout << "A=["; + for(int i=0;i<100;i++) { + std::cout << A[i].i << "," << A[i].q << ":"; + } + std::cout << "]" << std::endl; + + std::cout << "B=["; + for(int i=0;i<100;i++) { + std::cout << B[i].i << "," << B[i].q << ":"; + } + std::cout << "]" << std::endl; + + std::cout << "C=["; + for(int i=0;i<100;i++) { + std::cout << C[i].i << "," << C[i].q << ":"; + } + std::cout << "]" << std::endl;; +} diff --git a/src/tests/integration/test_1.cc b/src/tests/integration/test_1.cc new file mode 100644 index 000000000..4e499198f --- /dev/null +++ b/src/tests/integration/test_1.cc @@ -0,0 +1,58 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Integration test for file signal source. + * + */ + +#include + +#include +#include + +#include "in_memory_configuration.h" +#include "control_thread.h" + +TEST(SignalSource, CorrectFileSignalSource) { + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("ControlThread.wait_for_flowgraph", "true"); + + config->set_property("SignalSource.implementation", "FileSignalSource"); + config->set_property("SignalSource.samples", "0"); + config->set_property("SignalSource.filename", "./signal_samples/signal_1ms.dat"); + config->set_property("SignalSource.dump", "true"); + config->set_property("SignalSource.dump_filename", "./data/test1_dump.dat"); + + config->set_property("SignalConditioner.implementation", "PassThrough"); + + config->set_property("Channels.count", "1"); + + ControlThread* control_thread = new ControlThread(config); + control_thread->run(); + + delete control_thread; + delete config; + + std::ifstream signal_expected; + signal_expected.open("./signal_samples/signal_1ms.dat", std::ios::in|std::ios::binary|std::ios::ate); + EXPECT_FALSE(signal_expected.fail()); + + std::ifstream signal_result; + signal_result.open("./data/test_dump.dat", std::ios::in|std::ios::binary|std::ios::ate); + EXPECT_FALSE(signal_result.fail()); + + EXPECT_EQ(signal_expected.tellg(), signal_result.tellg()); + std::cout << signal_expected.tellg() << ":" << signal_result.tellg() << std::endl; + + signal_expected.close(); + signal_result.close(); +} diff --git a/src/tests/jamfile.jam b/src/tests/jamfile.jam new file mode 100644 index 000000000..e2edcc722 --- /dev/null +++ b/src/tests/jamfile.jam @@ -0,0 +1,3 @@ +build-project arithmetic ; + +obj test_main : test_main.cc ; \ No newline at end of file diff --git a/src/tests/string_converter/INIReader/INIReader.cpp b/src/tests/string_converter/INIReader/INIReader.cpp new file mode 100644 index 000000000..d4dd66fb6 --- /dev/null +++ b/src/tests/string_converter/INIReader/INIReader.cpp @@ -0,0 +1,51 @@ +// Read an INI file into easy-to-access name/value pairs. + +#include +#include +#include "ini.h" +#include "INIReader.h" + +using std::string; + +INIReader::INIReader(string filename) +{ + _error = ini_parse(filename.c_str(), ValueHandler, this); +} + +int INIReader::ParseError() +{ + return _error; +} + +string INIReader::Get(string section, string name, string default_value) +{ + string key = MakeKey(section, name); + return _values.count(key) ? _values[key] : default_value; +} + +long INIReader::GetInteger(string section, string name, long default_value) +{ + string valstr = Get(section, name, ""); + const char* value = valstr.c_str(); + char* end; + // This parses "1234" (decimal) and also "0x4D2" (hex) + long n = strtol(value, &end, 0); + return end > value ? n : default_value; +} + +string INIReader::MakeKey(string section, string name) +{ + string key = section + "." + name; + // Convert to lower case to make lookups case-insensitive + for (unsigned int i = 0; i < key.length(); i++) + key[i] = tolower(key[i]); + return key; +} + +int INIReader::ValueHandler(void* user, const char* section, const char* name, + const char* value) +{ + INIReader* reader = (INIReader*)user; + reader->_values[MakeKey(section, name)] = value; + return 1; +} diff --git a/src/tests/string_converter/INIReader/INIReader.h b/src/tests/string_converter/INIReader/INIReader.h new file mode 100644 index 000000000..e0882941d --- /dev/null +++ b/src/tests/string_converter/INIReader/INIReader.h @@ -0,0 +1,43 @@ +// Read an INI file into easy-to-access name/value pairs. + +// inih and INIReader are released under the New BSD license (see LICENSE.txt). +// Go to the project home page for more info: +// +// http://code.google.com/p/inih/ + +#ifndef __INIREADER_H__ +#define __INIREADER_H__ + +#include +#include + +// Read an INI file into easy-to-access name/value pairs. (Note that I've gone +// for simplicity here rather than speed, but it should be pretty decent.) +class INIReader +{ +public: + // Construct INIReader and parse given filename. See ini.h for more info + // about the parsing. + INIReader(std::string filename); + + // Return the result of ini_parse(), i.e., 0 on success, line number of + // first error on parse error, or -1 on file open error. + int ParseError(); + + // Get a string value from INI file, returning default_value if not found. + std::string Get(std::string section, std::string name, + std::string default_value); + + // Get an integer (long) value from INI file, returning default_value if + // not found. + long GetInteger(std::string section, std::string name, long default_value); + +private: + int _error; + std::map _values; + static std::string MakeKey(std::string section, std::string name); + static int ValueHandler(void* user, const char* section, const char* name, + const char* value); +}; + +#endif // __INIREADER_H__ diff --git a/src/tests/string_converter/INIReader/ini.c b/src/tests/string_converter/INIReader/ini.c new file mode 100644 index 000000000..c4eb2b5bc --- /dev/null +++ b/src/tests/string_converter/INIReader/ini.c @@ -0,0 +1,130 @@ +/* inih -- simple .INI file parser + +inih is released under the New BSD license (see LICENSE.txt). Go to the project +home page for more info: + +http://code.google.com/p/inih/ + +*/ + +#include +#include +#include + +#include "ini.h" + +#define MAX_LINE 200 +#define MAX_SECTION 50 +#define MAX_NAME 50 + +/* Strip whitespace chars off end of given string, in place. Return s. */ +static char* rstrip(char* s) +{ + char* p = s + strlen(s); + while (p > s && isspace(*--p)) + *p = '\0'; + return s; +} + +/* Return pointer to first non-whitespace char in given string. */ +static char* lskip(const char* s) +{ + while (*s && isspace(*s)) + s++; + return (char*)s; +} + +/* Return pointer to first char c or ';' in given string, or pointer to + null at end of string if neither found. */ +static char* find_char_or_comment(const char* s, char c) +{ + while (*s && *s != c && *s != ';') + s++; + return (char*)s; +} + +/* Version of strncpy that ensures dest (size bytes) is null-terminated. */ +static char* strncpy0(char* dest, const char* src, size_t size) +{ + strncpy(dest, src, size); + dest[size - 1] = '\0'; + return dest; +} + +/* See documentation in header file. */ +int ini_parse(const char* filename, + int (*handler)(void*, const char*, const char*, const char*), + void* user) +{ + /* Uses a fair bit of stack (use heap instead if you need to) */ + char line[MAX_LINE]; + char section[MAX_SECTION] = ""; + char prev_name[MAX_NAME] = ""; + + FILE* file; + char* start; + char* end; + char* name; + char* value; + int lineno = 0; + int error = 0; + + file = fopen(filename, "r"); + if (!file) + return -1; + + /* Scan through file line by line */ + while (fgets(line, sizeof(line), file) != NULL) { + lineno++; + start = lskip(rstrip(line)); + +#if INI_ALLOW_MULTILINE + if (*prev_name && *start && start > line) { + /* Non-black line with leading whitespace, treat as continuation + of previous name's value (as per Python ConfigParser). */ + if (!handler(user, section, prev_name, start) && !error) + error = lineno; + } + else +#endif + if (*start == '[') { + /* A "[section]" line */ + end = find_char_or_comment(start + 1, ']'); + if (*end == ']') { + *end = '\0'; + strncpy0(section, start + 1, sizeof(section)); + *prev_name = '\0'; + } + else if (!error) { + /* No ']' found on section line */ + error = lineno; + } + } + else if (*start && *start != ';') { + /* Not a comment, must be a name=value pair */ + end = find_char_or_comment(start, '='); + if (*end == '=') { + *end = '\0'; + name = rstrip(start); + value = lskip(end + 1); + end = find_char_or_comment(value, ';'); + if (*end == ';') + *end = '\0'; + rstrip(value); + + /* Valid name=value pair found, call handler */ + strncpy0(prev_name, name, sizeof(prev_name)); + if (!handler(user, section, name, value) && !error) + error = lineno; + } + else if (!error) { + /* No '=' found on name=value line */ + error = lineno; + } + } + } + + fclose(file); + + return error; +} diff --git a/src/tests/string_converter/INIReader/ini.h b/src/tests/string_converter/INIReader/ini.h new file mode 100644 index 000000000..e4d0daf2f --- /dev/null +++ b/src/tests/string_converter/INIReader/ini.h @@ -0,0 +1,45 @@ +/* inih -- simple .INI file parser + +inih is released under the New BSD license (see LICENSE.txt). Go to the project +home page for more info: + +http://code.google.com/p/inih/ + +*/ + +#ifndef __INI_H__ +#define __INI_H__ + +/* Make this header file easier to include in C++ code */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Parse given INI-style file. May have [section]s, name=value pairs + (whitespace stripped), and comments starting with ';' (semicolon). Section + is "" if name=value pair parsed before any section heading. + + For each name=value pair parsed, call handler function with given user + pointer as well as section, name, and value (data only valid for duration + of handler call). Handler should return nonzero on success, zero on error. + + Returns 0 on success, line number of first error on parse error, or -1 on + file open error. +*/ +int ini_parse(const char* filename, + int (*handler)(void* user, const char* section, + const char* name, const char* value), + void* user); + +/* Nonzero to allow multi-line value parsing, in the style of Python's + ConfigParser. If allowed, ini_parse() will call the handler with the same + name for each subsequent line parsed. */ +#ifndef INI_ALLOW_MULTILINE +#define INI_ALLOW_MULTILINE 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __INI_H__ */ diff --git a/src/tests/string_converter/INIReader/jamfile.jam b/src/tests/string_converter/INIReader/jamfile.jam new file mode 100644 index 000000000..b2fd75e59 --- /dev/null +++ b/src/tests/string_converter/INIReader/jamfile.jam @@ -0,0 +1,2 @@ +obj INIParser : ini.c ; +obj INIReader : INIReader.cpp ; \ No newline at end of file diff --git a/src/tests/string_converter/string_converter.cc b/src/tests/string_converter/string_converter.cc new file mode 100644 index 000000000..1d20c9241 --- /dev/null +++ b/src/tests/string_converter/string_converter.cc @@ -0,0 +1,101 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +#include "string_converter.h" + +#include +#include + +StringConverter::StringConverter() { +} + +StringConverter::~StringConverter() { +} + +bool StringConverter::convert(std::string value, bool default_value) { + + if(value.compare("true") == 0) { + return true; + } else if(value.compare("false") == 0) { + return false; + } else { + return default_value; + } +} + + +long StringConverter::convert(std::string value, long default_value) { + + std::stringstream stream(value); + + long result; + stream >> result; + + if(stream.fail()) { + return default_value; + } else { + return result; + } +} + +int StringConverter::convert(std::string value, int default_value) { + + std::stringstream stream(value); + + int result; + stream >> result; + + if(stream.fail()) { + return default_value; + } else { + return result; + } +} + +unsigned int StringConverter::convert(std::string value, unsigned int default_value) { + + std::stringstream stream(value); + + unsigned int result; + stream >> result; + + if(stream.fail()) { + return default_value; + } else { + return result; + } +} + +float StringConverter::convert(std::string value, float default_value) { + + std::stringstream stream(value); + + float result; + stream >> result; + + if(stream.fail()) { + return default_value; + } else { + return result; + } +} + +double StringConverter::convert(std::string value, double default_value) { + + std::stringstream stream(value); + + double result; + stream >> result; + + if(stream.fail()) { + return default_value; + } else { + return result; + } +} diff --git a/src/tests/string_converter/string_converter.h b/src/tests/string_converter/string_converter.h new file mode 100644 index 000000000..1cbc05169 --- /dev/null +++ b/src/tests/string_converter/string_converter.h @@ -0,0 +1,34 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class interprets the contents of a string and converts it into + * different types. + */ + +#ifndef STRING_CONVERTER_H_ +#define STRING_CONVERTER_H_ + +#include + +class StringConverter { + +public: + StringConverter(); + virtual ~StringConverter(); + + bool convert(std::string value, bool default_value); + long convert(std::string value, long default_value); + int convert(std::string value, int default_value); + unsigned int convert(std::string value, unsigned int default_value); + float convert(std::string value, float default_value); + double convert(std::string value, double default_value); +}; + +#endif /*STRING_CONVERTER_H_*/ diff --git a/src/tests/string_converter/string_converter_test.cc b/src/tests/string_converter/string_converter_test.cc new file mode 100644 index 000000000..36e1dcb7b --- /dev/null +++ b/src/tests/string_converter/string_converter_test.cc @@ -0,0 +1,61 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * This class implements a Unit Tests for the class StringConverter. + * + */ + +#include + +#include "string_converter.h" + +TEST(StringConverter, StringToBool) { + + StringConverter *converter = new StringConverter(); + + bool conversion_result = converter->convert("false", true); + + EXPECT_EQ(false, conversion_result); + + delete converter; +} + +TEST(StringConverter, StringToSizeT) { + + StringConverter *converter = new StringConverter(); + + size_t conversion_result = converter->convert("8", 1); + + EXPECT_EQ(8, conversion_result); + + delete converter; +} + +TEST(StringConverter, StringToBoolFail) { + + StringConverter *converter = new StringConverter(); + + bool conversion_result = converter->convert("lse", true); + + EXPECT_EQ(true, conversion_result); + + delete converter; +} + +TEST(StringConverter, StringToSizeTFail) { + + StringConverter *converter = new StringConverter(); + + size_t conversion_result = converter->convert("false", 1); + + EXPECT_EQ(1, conversion_result); + + delete converter; +} \ No newline at end of file diff --git a/src/tests/test_main.cc b/src/tests/test_main.cc new file mode 100644 index 000000000..2a1b6b99e --- /dev/null +++ b/src/tests/test_main.cc @@ -0,0 +1,13 @@ +#include +#include +#include +#include + +int main(int argc, char **argv) { + std::cout << "Running main() from test_main.cc\n"; + + testing::InitGoogleTest(&argc, argv); + google::InitGoogleLogging(argv[0]); + + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/src/tests/utils/gr_complex_to_short.cc b/src/tests/utils/gr_complex_to_short.cc new file mode 100644 index 000000000..d127fafa2 --- /dev/null +++ b/src/tests/utils/gr_complex_to_short.cc @@ -0,0 +1,37 @@ + +#include + +#include +#include + +#include +#include +#include +#include + +using google::LogMessage; + +DEFINE_string(in_file, "", "Path to the file containing the samples in gr_complex"); +DEFINE_string(out_file, "", "Path to the file containing the samples in short"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + DLOG(INFO) << "in_file " << FLAGS_in_file; + DLOG(INFO) << "out_file " << FLAGS_out_file; + + gr_block_sptr file_source = gr_make_file_source(sizeof(gr_complex), FLAGS_in_file.c_str(), false); + gr_block_sptr file_sink = gr_make_file_sink(sizeof(short), FLAGS_out_file.c_str()); + gr_block_sptr converter = gr_make_complex_to_interleaved_short(); + + gr_top_block_sptr top_block = gr_make_top_block("complex to short"); + + top_block->connect(file_source, 0, converter, 0); + top_block->connect(converter, 0, file_sink, 0); + + top_block->run(); + + DLOG(INFO) << "Finished"; +} diff --git a/src/tests/utils/prn_codes_generator.cc b/src/tests/utils/prn_codes_generator.cc new file mode 100644 index 000000000..1e086f01d --- /dev/null +++ b/src/tests/utils/prn_codes_generator.cc @@ -0,0 +1,54 @@ + +#include + +#include +#include + +#include +#include +#include +#include + +#include "dbfcttc_gpsprn.h" +#include "gnss_sdr_direct_resampler_ccf.h" + +using google::LogMessage; + +DEFINE_string(filename, "./data/prn_code.dat", "Path to the file where the prn code will be stored."); +DEFINE_int32(fs, 2048000, "FS of the resulting code."); +DEFINE_int32(satellite, 0, "ID of the satellite"); +DEFINE_int32(time,0.001,"Signal duration"); // javi + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + // unsigned int number_of_codes = 1023; // not needed (javi) + unsigned int phase = 0; + + DLOG(INFO) << "satellite " << FLAGS_satellite; + DLOG(INFO) << "fs " << FLAGS_fs; + DLOG(INFO) << "filename " << FLAGS_filename; + + dbfcttc_gpsprn_sptr prn_source = dbfcttc_make_gpsprn(FLAGS_satellite, phase); + + gr_float_to_complex_sptr float2complex = gr_make_float_to_complex(1); + // resample prn_codes from 1,023 Msps to 2,048 Msps + gnss_sdr_direct_resampler_ccf_sptr resampler = gnss_sdr_make_direct_resampler_ccf(1023000, FLAGS_fs); + // Valve is used to stop the flow after an amount of samples went through the block + gr_block_sptr valve = gr_make_head(sizeof(gr_complex), FLAGS_fs*FLAGS_time); + gr_file_sink_sptr file = gr_make_file_sink(sizeof(gr_complex), FLAGS_filename.c_str()); + + gr_top_block_sptr top_block = gr_make_top_block("prn codes generator"); + + top_block->connect(prn_source, 0, float2complex, 0); + top_block->connect(float2complex, 0, resampler , 0); + top_block->connect(resampler, 0, valve, 0); + top_block->connect(valve, 0, file, 0); + + top_block->run(); + + DLOG(INFO) << "Finished"; + +} diff --git a/src/tests/utils/saw_signal_generator.cc b/src/tests/utils/saw_signal_generator.cc new file mode 100644 index 000000000..02e8184f7 --- /dev/null +++ b/src/tests/utils/saw_signal_generator.cc @@ -0,0 +1,41 @@ + +#include + +#include +#include + +#include +#include +#include +#include + +using google::LogMessage; + +DEFINE_string(filename, "./signal_samples/saw_signal.dat", "Path to the file where the prn code will be stored."); +DEFINE_int32(fs, 4000000, "FS of the resulting code."); +DEFINE_int32(samples, 16000, "Number of samples to be generated"); +DEFINE_int32(f, 250, "Frequency of the signal"); +DEFINE_int32(a, 16000, "Amplitude of the signal"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + DLOG(INFO) << "fs " << FLAGS_fs; + DLOG(INFO) << "filename " << FLAGS_filename; + DLOG(INFO) << "samples " << FLAGS_samples; + + gr_block_sptr source = gr_make_sig_source_c(FLAGS_fs, GR_SAW_WAVE, FLAGS_f, FLAGS_a, 0); + gr_block_sptr file_sink = gr_make_file_sink(sizeof(gr_complex), FLAGS_filename.c_str()); + gr_block_sptr valve = gr_make_head(sizeof(gr_complex), FLAGS_samples); + + gr_top_block_sptr top_block = gr_make_top_block("saw signal generator"); + + top_block->connect(source, 0, valve, 0); + top_block->connect(valve, 0, file_sink, 0); + + top_block->run(); + + DLOG(INFO) << "Finished"; +} diff --git a/src/tests/utils/short_to_gr_complex.cc b/src/tests/utils/short_to_gr_complex.cc new file mode 100644 index 000000000..5024064b0 --- /dev/null +++ b/src/tests/utils/short_to_gr_complex.cc @@ -0,0 +1,37 @@ + +#include + +#include +#include + +#include +#include +#include +#include + +using google::LogMessage; + +DEFINE_string(in_file, "", "Path to the file containing the samples in shorts"); +DEFINE_string(out_file, "", "Path to the file containing the samples in gr_complex"); + +int main(int argc, char** argv) { + + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + + DLOG(INFO) << "in_file " << FLAGS_in_file; + DLOG(INFO) << "out_file " << FLAGS_out_file; + + gr_block_sptr file_source = gr_make_file_source(sizeof(short), FLAGS_in_file.c_str(), false); + gr_block_sptr file_sink = gr_make_file_sink(sizeof(gr_complex), FLAGS_out_file.c_str()); + gr_block_sptr converter = gr_make_interleaved_short_to_complex(); + + gr_top_block_sptr top_block = gr_make_top_block("short to complex"); + + top_block->connect(file_source, 0, converter, 0); + top_block->connect(converter, 0, file_sink, 0); + + top_block->run(); + + DLOG(INFO) << "Finished"; +} diff --git a/src/tests/utils/test_1.cc b/src/tests/utils/test_1.cc new file mode 100644 index 000000000..4e499198f --- /dev/null +++ b/src/tests/utils/test_1.cc @@ -0,0 +1,58 @@ + +/** + * Copyright notice + */ + +/** + * Author: Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com + */ + +/** + * Integration test for file signal source. + * + */ + +#include + +#include +#include + +#include "in_memory_configuration.h" +#include "control_thread.h" + +TEST(SignalSource, CorrectFileSignalSource) { + + InMemoryConfiguration* config = new InMemoryConfiguration(); + + config->set_property("ControlThread.wait_for_flowgraph", "true"); + + config->set_property("SignalSource.implementation", "FileSignalSource"); + config->set_property("SignalSource.samples", "0"); + config->set_property("SignalSource.filename", "./signal_samples/signal_1ms.dat"); + config->set_property("SignalSource.dump", "true"); + config->set_property("SignalSource.dump_filename", "./data/test1_dump.dat"); + + config->set_property("SignalConditioner.implementation", "PassThrough"); + + config->set_property("Channels.count", "1"); + + ControlThread* control_thread = new ControlThread(config); + control_thread->run(); + + delete control_thread; + delete config; + + std::ifstream signal_expected; + signal_expected.open("./signal_samples/signal_1ms.dat", std::ios::in|std::ios::binary|std::ios::ate); + EXPECT_FALSE(signal_expected.fail()); + + std::ifstream signal_result; + signal_result.open("./data/test_dump.dat", std::ios::in|std::ios::binary|std::ios::ate); + EXPECT_FALSE(signal_result.fail()); + + EXPECT_EQ(signal_expected.tellg(), signal_result.tellg()); + std::cout << signal_expected.tellg() << ":" << signal_result.tellg() << std::endl; + + signal_expected.close(); + signal_result.close(); +} diff --git a/src/utils/plot_acquisition_magnitudes.m b/src/utils/plot_acquisition_magnitudes.m new file mode 100755 index 000000000..02c71c67a --- /dev/null +++ b/src/utils/plot_acquisition_magnitudes.m @@ -0,0 +1,7 @@ +#!/usr/bin/octave +arg_list = argv (); +x=read_float_binary (arg_list{1}); +figure(1); +plot(x); +figure(2) +input "press any key to end..." \ No newline at end of file diff --git a/src/utils/plot_carrier_spectrum.m b/src/utils/plot_carrier_spectrum.m new file mode 100644 index 000000000..c122d65bf --- /dev/null +++ b/src/utils/plot_carrier_spectrum.m @@ -0,0 +1,15 @@ +# Load number of used satellites +satellites = load("./data/satellites.dat") +samples = load("./data/samples.dat") +sampling_frequency = load("./data/sampling_frequency.dat") +signal_duration = 1/(sampling_frequency/samples) + +# Plot carrier spectrum +for i = [0:satellites-1] + figure(i+1); + file_sufix = strcat("_", num2str(i), ".dat"); + carrier = read_float_binary(strcat("./data/carrier_signal", file_sufix)); + plot_spectrum(carrier, sampling_frequency, signal_duration, ";carrier spectrum;"); +endfor +figure(satellites+1); +input "press any key to end..." \ No newline at end of file diff --git a/src/utils/plot_delay_signal.m b/src/utils/plot_delay_signal.m new file mode 100644 index 000000000..8d786c2e8 --- /dev/null +++ b/src/utils/plot_delay_signal.m @@ -0,0 +1,15 @@ +# Load number of used satellites +satellites = load("./data/satellites.dat") + +# Plot delayed and resampled prn codes +for i = [0:satellites-1] + figure(i+1); + file_sufix = strcat("_", num2str(i), ".dat"); + delay = read_float_binary(strcat("./data/delay_signal", file_sufix)); + delay = prn_code(1:999); + delay = [prn_code; -0.5; +0.5]; + plot(prn_code, "1*"); + +endfor +figure(satellites+1); +input "press any key to end..." \ No newline at end of file diff --git a/src/utils/plot_delay_spectrum.m b/src/utils/plot_delay_spectrum.m new file mode 100644 index 000000000..015034e4d --- /dev/null +++ b/src/utils/plot_delay_spectrum.m @@ -0,0 +1,15 @@ +# Load number of used satellites +satellites = load("./data/satellites.dat") +samples = load("./data/samples.dat") +sampling_frequency = load("./data/sampling_frequency.dat") +signal_duration = 1/(sampling_frequency/samples) + +# Plot delayed and resampled prn codes spectrum +for i = [0:satellites-1] + figure(i+1); + file_sufix = strcat("_", num2str(i), ".dat"); + delay = read_float_binary(strcat("./data/delay_signal", file_sufix)); + plot_spectrum(delay, sampling_frequency, signal_duration, ";delayed and resampled prn code spectrum;"); +endfor +figure(satellites+1); +input "press any key to end..." \ No newline at end of file diff --git a/src/utils/plot_gps_signal_spectrum.m b/src/utils/plot_gps_signal_spectrum.m new file mode 100644 index 000000000..4a95ab58e --- /dev/null +++ b/src/utils/plot_gps_signal_spectrum.m @@ -0,0 +1,12 @@ +# Load number of used satellites +satellites = load("./data/satellites.dat") +samples = load("./data/samples.dat") +sampling_frequency = load("./data/sampling_frequency.dat") +signal_duration = 1/(sampling_frequency/samples) + +# Plot gps signal spectrum +figure(1); +gps_signal = read_float_binary("./data/gps_signal.dat"); +plot_spectrum(prn_code, sampling_frequency, signal_duration, ";gps signal spectrum;"); +figure(2); +input "press any key to end..." \ No newline at end of file diff --git a/src/utils/plot_pfssa.m b/src/utils/plot_pfssa.m new file mode 100644 index 000000000..b5dad8f26 --- /dev/null +++ b/src/utils/plot_pfssa.m @@ -0,0 +1,5 @@ +x=read_float_binary("./data/pfssa.dat"); +figure(1); +plot(x) +figure(2); +input("Press any key..."); \ No newline at end of file diff --git a/src/utils/plot_prn_code_signal.m b/src/utils/plot_prn_code_signal.m new file mode 100644 index 000000000..c0fc8d11e --- /dev/null +++ b/src/utils/plot_prn_code_signal.m @@ -0,0 +1,15 @@ +# Load number of used satellites +satellites = load("./data/satellites.dat") + +# Plot prn codes +for i = [0:satellites-1] + figure(i+1); + file_sufix = strcat("_", num2str(i), ".dat"); + prn_code = read_float_binary(strcat("./data/prn_code_signal", file_sufix)); + prn_code = prn_code(1:99); + prn_code = [prn_code; -2; +2]; + plot(prn_code, "1*"); + +endfor +figure(satellites+1); +input "press any key to end..." \ No newline at end of file diff --git a/src/utils/plot_resampled_prn_code_signal.m b/src/utils/plot_resampled_prn_code_signal.m new file mode 100644 index 000000000..09ccd44e1 --- /dev/null +++ b/src/utils/plot_resampled_prn_code_signal.m @@ -0,0 +1,15 @@ +# Load number of used satellites +satellites = load("./data/satellites.dat") + +# Plot resampled prn codes +for i = [0:satellites-1] + figure(i+1); + file_sufix = strcat("_", num2str(i), ".dat"); + resampled_prn_code = read_float_binary(strcat("./data/resampled_prn_code_signal", file_sufix)); + resampled_prn_code = resampled_prn_code(1:599); + resampled_prn_code = [resampled_prn_code; -2; +2]; + plot(resampled_prn_code, "1*"); + +endfor +figure(satellites+1); +input "press any key to end..." \ No newline at end of file diff --git a/src/utils/plot_resampled_prn_code_spectrum.m b/src/utils/plot_resampled_prn_code_spectrum.m new file mode 100644 index 000000000..ee27db3f8 --- /dev/null +++ b/src/utils/plot_resampled_prn_code_spectrum.m @@ -0,0 +1,15 @@ +# Load number of used satellites +satellites = load("./data/satellites.dat") +samples = load("./data/samples.dat") +sampling_frequency = load("./data/sampling_frequency.dat") +signal_duration = 1/(sampling_frequency/samples) + +# Plot resampled prn codes spectrum +for i = [0:satellites-1] + figure(i+1); + file_sufix = strcat("_", num2str(i), ".dat"); + resampled_prn_code = read_float_binary(strcat("./data/resampled_prn_code_signal", file_sufix)); + plot_spectrum(resampled_prn_code, sampling_frequency, signal_duration, ";resampled prn code spectrum;"); +endfor +figure(satellites+1); +input "press any key to end..." \ No newline at end of file diff --git a/src/utils/prn_spectrum_analysis.m b/src/utils/prn_spectrum_analysis.m new file mode 100644 index 000000000..9e3338bae --- /dev/null +++ b/src/utils/prn_spectrum_analysis.m @@ -0,0 +1,18 @@ +phase=load("./data/prn_code_phase.dat"); +samples_per_code=load("./data/prn_code_samples_per_code.dat"); +fs=load("./data/prn_code_fs.dat"); +signal=read_float_binary("./data/prn_code_signal.dat"); + +phase +samples_per_code +fs + +if( phase == -1 ) + for i = [0:1022] + i + prn_code=signal([(i*samples_per_code)+1:(i+1)*samples_per_code]); + spectrum_analysis (prn_code,fs,0.001); + endfor +else + spectrum_analysis(signal, fs,0.001); +endif \ No newline at end of file diff --git a/src/utils/spectrum_analysis.m b/src/utils/spectrum_analysis.m new file mode 100755 index 000000000..1fe6c8430 --- /dev/null +++ b/src/utils/spectrum_analysis.m @@ -0,0 +1,28 @@ +function spectrum_analysis(x,fs,duration) + +figure(1); + +subplot(2,1,1); +t=(0:1:length(x)-1)/fs; +plot(t,x); +axis([0, duration, -1, 1]); +xlabel('Time (s)'); +ylabel('Amplitude'); +axis([0,duration,min(x)*1.1,max(x)*1.1]); + +subplot(2,1,2); +X=fft(x); +N=length(x); +ws=2*pi/N; +wnorm=-pi:ws:pi; +wnorm=wnorm(1:length(x)); +w=(wnorm*fs)/(2*pi); +fft_shift_abs=abs(fftshift(X)); +plot(w,fft_shift_abs); +xlabel('Frequency (Hz)'); +ylabel('Amplitude'); +axis([w(1),w(length(w)),min(fft_shift_abs)*1.1,max(fft_shift_abs)*1.1]); + +figure(2); + +input("Press any key..."); \ No newline at end of file diff --git a/src/utils/spectrum_analysis_complex.m b/src/utils/spectrum_analysis_complex.m new file mode 100755 index 000000000..02bb02e46 --- /dev/null +++ b/src/utils/spectrum_analysis_complex.m @@ -0,0 +1,16 @@ +function spectrum_analysis_complex(x,fs,duration) + +figure(1); +X=fft(x); +N=length(x); +ws=2*pi/N; +wnorm=-pi:ws:pi; +wnorm=wnorm(1:length(x)); +w=(wnorm*fs)/(2*pi); +fft_shift_abs=abs(fftshift(X)); +plot(w,fft_shift_abs); +xlabel('Frequency (Hz)'); +ylabel('Amplitude'); +axis([w(1),w(length(w)),min(fft_shift_abs)*1.1,max(fft_shift_abs)*1.1]); + +input("Press any key...");