tworld-1.3.0/0000755000175000017500000000000010420664541013166 5ustar breadboxbreadboxtworld-1.3.0/BUGS0000644000175000017500000000523510420664541013656 0ustar breadboxbreadboxContents * Bugs in the MS game logic emulation * Bugs in the Lynx game logic emulation * Other bugs and misfeatures ___________________________________________________________________________ Bugs in the MS game logic emulation * There are numerous situations in the MS game that cause a moused goal to be cancelled for which TW will keep trying. A clearer understanding of those situations is needed. * The MS game checks for input more than once per tick. Probably this was done to catch last-minute keyboard events, but it has the effect that by having more than one input event in the queue, Chip can, under certain circumstances, have the latter keystroke processed after he has moved but before any other creatures move. * In TW, the keyboard is scanned twice per tick, once at the beginning and once in the middle. As a result, if Chip makes a move at the beginning of a tick, the game does not update the display twice in a row (once after the creatures move and once after Chip moves), but just does it once. I do not believe that this optimization has a real effect on the gameplay. It does, however, make it easier to examine the screen when pushing against a force floor. * There are a number of miscellaneous emulation bugs, mostly involving "illegal" tile combinations. These are documented more thoroughly in the msbugs.txt file on the website. ___________________________________________________________________________ Bugs in the Lynx game logic emulation * Under the real Lynx game it is possible to push a block diagonally without moving at all. This is done by pushing against a wall, and then pushing diagonally against a neighboring block very briefly. The block will get pushed, but Chip doesn't follow. This is impossible to do in TW. * Under the real Lynx game it is possible, with carefully constructed circumstances, for Chip to push a block away from him as it's heading towards him. That is, a block starts moving into the square that Chip occupies, but in the same frame, Chip starts pushing the block in the opposite direction. This is impossible to do in TW. * There are a number of miscellaneous emulation bugs, mostly involving Chip being stuck on teleports. These are documented more thoroughly in the lxbugs.txt file on the website. ___________________________________________________________________________ Other bugs and misfeatures * TW ignores field 8 entries in the .dat file unless they are exactly five bytes long. In this case, it simply ignores the field 6 password. The MS game will remember both passwords and allow either one to be used (although if both are present it will only show the field 8 password). tworld-1.3.0/COPYING0000644000175000017500000004307007371455430014233 0ustar breadboxbreadbox GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. 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 convey 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) 19yy 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 2 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, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. tworld-1.3.0/Changelog0000644000175000017500000004401310420664541015002 0ustar breadboxbreadbox 2006 Apr 17: version 1.3.0 * Added mouse handling to the code. That includes modifying the SDL code to handle mouse activity, adding a large set of new commands, making it possible for Chip to move towards a goal over several ticks, and modifying the action struct (and the solution file) to permit storing the new moves in solutions. * Added the database of unsolvable levels, which warns users before they play a level known to be unsolvable, and automatically gives them the password to the next level. * Added the solution file display, allowing the user to manage multiple solution files for a single level set. * Changed code to accept a solution file as the sole cmdline argument, if the solution file contains the set name. Hopefully this, and the previous addition, will make it easier for people to share solution files. * Added the batch-mode verification feature, to check the existing solutions without initializing the GUI subsystem. * Fixed the old emulation bug (MS logic) involving Chip turning a cloned block into a clone of himself while going through a teleport. * Fixed the bug (MS logic) preventing Chip from pushing a slipping block parallel to its slipping direction when the push happens through a teleport. * Improved the emulation of several creatures teleporting simultaneously (Lynx logic), with assistance from ccexplore. * Minor improvements to the Lynx pedantic mode. * Fixed the password input routine. (It was completely broken; not sure when that happened.) * Rewrote the code so that level data and solutions are kept compressed in memory, and expanded only when needed, instead of decoding entire files when read. This change makes for a small reduction in memory usage, and reduces the overall level of useless work being done. * Added code to shutter the map view when MS gameplay is paused. * Numerous minor tweaks to the code, the display, and the documentation. 2006 Feb 24: version 1.2.2 * Finally got the handling of brown buttons (MS logic) working correctly. It's been a long time coming, and it's all so simple in hindsight. * Added code to grok the new solution file format. This version of Tile World will continue to use the old solution file format, but if it encounters a file in the new format, it will handle it correctly. * Added the ability to specify a solution file by name on the command-line. * Added -P option for Lynx pedantic mode. * Added the Shift-Ctrl-X feature to permanently delete solutions. * Fixed bugs in Shift-Tab feature, and formally documented this feature. * Fixed bug in the stepping UI. * Fixed bug reported by Thomas Harte, where an international keyboard generating a non-Latin-1 character could cause TW to segfault. * Fixed bug reported by Catatonic Porpoise, where SDL was being asked to blit to a locked surface. * Fixed a segfault in MS logic reported by Evan Dummit (occurring when a cloner's creature in the northwest corner is replaced by Chip). * Added casts to avoid new warnings in gcc 4. * Fixed a few other minor MS emulation bugs reported by Evan Dummit. * Added a number of unfixed MS emulation bugs to msbugs.txt, several of which were reported by Evan Dummit. * A handful of documentation errors were also found and fixed. 2004 Oct 21: version 1.2.1 * Introduced a basic stepping-control UI, and added stepping information to the solution file format. * Fixed a bug (MS logic) reported by David Stolp, involving blocks going out and back into the slip list so quickly that they weren't sent to the end of the list. * Fixed a bug (MS logic) reported by David Stolp where block and creatures were not moving into key tiles if the bottom tile prevented it (e.g. a wall). * Fixed a bug in sdltext.c, reported by Dale Bryan caused a segfault in 16-bit color mode. * Added -r (read-only) cmdline option. 2004 Oct 04: version 1.2.0 * Fixed a bug (MS logic) preventing cloned tanks from turning around when they hadn't yet left the clone machine. * Fixed another longstanding bug (MS logic) involving a tank indirectly pushing a blue button. Again, the bug was fixed explicitly instead of trying to make the behavior arise naturally from the code. * Improved some of the behavior of blocks being pushed (Lynx logic). * Improved some of the behavior of blocked teleports (Lynx logic). * Altered animations to run for either 11 or 12 frames, depending on the parity of their initial frame, as discovered by ccexplore. (This finally killed the nine-lived clone-boosting bug in ICEHOUSE!) Also modified the point during the frame when animations get removed. * Changed the Lynx walker to use a PRNG equivalent to the original, as worked out by ccexplore. * Fixed bug (MS logic) in how a block is removed from the slip list when being pushed by Chip (reported by Shmuel Siegel). * Fixed bug (MS logic) with deferred button presses; TW was incorrectly deferring Chip's button presses and not just those caused by block pushing. * Fixed a horrid bug when encountering bogus values in a dat file. (The code was meant to gracefully ignore the broken level and continue reading the next level, but it failed to move the file position out of the broken level before doing so.) * Fixed keyboard routines so that they now understand characters as well as keystrokes (thus e.g. the program recognizes "?" when entered on a European keyboard). * Added a help screen for the initial file menu. * A few other minor bug fixes and miscellaneous improvements. 2003 Mar 15: version 1.1.3 * Put the display code through another significant rewrite. This time, the rewrite seems to have succeeded in improving speeds, at all pixel depths. Instead of hand-rolled arrays and functions, the new code uses SDL surfaces and blits throughout. Tiles are stored in the screen's pixel format whenever possible, and alpha channels are used to handle transparency. * Fixed longstanding bug (MS logic) involving Chip pushing a block off of another block via a teleport. (Wasn't hard to fix -- just required some nose-holding.) * Added new fractional time display (using -t) for MS. It's still imperfect, but it doesn't hurt to make the feature available. * Added -f switch to get fullscreen mode (change requested by Philippe Brochard). 2003 Mar 08: version 1.1.2 * Added frame-skipping code, so that gameplay doesn't slow down on slower hardware. * Blocks on beartraps were getting default initial direction of nil (Lynx logic). Default changed to north. (Reported by ccexplore.) * Fixed broken handling (Lynx logic) of creatures that start out on ice (reported by ccexplore). * Fixed bug where tanks could be turned around while sliding (Lynx logic). * It is now possible to finish a level with exactly zero seconds left (Lynx logic). * Improved fixlynx feature to also fix the maps for levels 121 and 127. * Reorganized logic code to use fewer static variables. 2003 Mar 01: version 1.1.1 * Fixed broken handling (MS logic) of tanks not stopping in traps, and the fact that tanks on clone machines can sometimes turn around (reported by ccexplore). * Attempted to fix controller bug, where a controller being added to the slip list sets the controller direction according to its slipping direction rather than its visible direction (reported by ccexplore). Hopefully fixing this hasn't broken anything else. 2003 Feb 22: version 1.1 * Fixed most of the broken handling of controllers (MS logic). * Added guards against bad data in encoded maps. * Added -a cmdline switch to help improve sound. * Removed unintentional trigraphs from source. * Added missing initialization of PRNGs. * New images for the chip and the socket -- and, finally, a real icon (courtesy of Anders Kaseorg). * Upgraded the Windows copy of SDL to 1.2.5a. 2002 May 06: version 1.0 * Added "(paused)" message when game is paused. * Minor bugfix in behavior when the creature count maxes out (Lynx). * Added intro-ms.dat and intro-lynx.dat. * Fleshed out the README file. * First official release to the general public. 2002 Apr 06: version 0.10.6 * Fixed off-by-one timing bug (MS logic) when last move of a level is involuntary (discovered by Anders Kaseorg). * Changed pause button to work as a toggle (i.e., no other keys will exit pause mode), as requested by Hallgeir Fl. 2002 Feb 25: version 0.10.5 * Amended the Lynx ruleset to follow the button-wiring lists in the dat file, instead of using the original Lynx method of implicit wiring. * Fixed uninitialized variable in password-entry function (reported by Ruben Spaans). * Fixed moving-block behavior so that they will always enter a square that Chip occupies, regardless of what Chip is standing on (MS). * Fixed force-floor behavior so that Chip gets to make a voluntary move immediately after stepping on a force floor if his forced move failed. (Hopefully this is an accurate coverage of the case that TW was getting wrong, and only of that.) 2002 Feb 04: version 0.10.4 * Separated out the two kinds of splashes. * Fixed changing level by password (broken in 0.10.3; reported by Hallgeir Fl). * Fixed a couple of bugs in handling invalid levels under Lynx (reported by Chuck Sommerville). * Fixed several minor bugs (including several reported by Anders Kaseorg). * Began a final code cleanup pass. Improved the comments in most of the source. * More documentation changes, including a new README. 2002 Jan 28: version 0.10.3 * Added "Melinda" feature. * Reformatted documentation, so man and html versions come from a single source. 2002 Jan 20: version 0.10.2 * Auto-deprecate saved games that are broken. * Added some more protection against Ctrl-Ms in text files. * Fix for die-if-no-soundcard bug (reported by Bill Darrah). * Added resources entries for changing the color scheme. * Added hackish "fixlynx" keyword. * New: first draft of some real documentation. 2002 Jan 13: version 0.10.1 * Fixed the bug in the lynx emulation where Chip survived when he shouldn't, using a gross little hack. I hate it. But I've been sitting on this bug for over a month now. It's time to give up and put it out of its misery. * Fixed the Lynx clock (it was off by one). * Added a simple end-screen to display when the player finishes the last level of a set. * Added a little more error-checking in the map decoding. * Added some basic documentation. 2002 Jan 03: version 0.10.0 * Vastly improved the Lynx emulation of "diagonal" moves. Had to change the save file format (again!!) so that diagonal moves could be properly stored. * Added a volume control. * Fixed bug in Lynx logic that prevented Chip from standing still on the very first frame when starting on a force floor. * Fixes for a few other random things. 2002 Jan 01: version 0.9.3 * Added a proper Chip-dies sequence to the Lynx emulation. Also removed redundant "dirt splash" sequence. * A rough attempt at handling "diagonal" moves in Lynx emulation has been put in place. 2001 Dec 27: version 0.9.2 * A couple more memory leaks fixed (these inside of SDL). * New tile bitmap format, which permits the use of animated tiles. * A couple of stupid crashes that slipped into the previous version have been repaired. * Miscellaneous other tweaks. 2001 Dec 07: version 0.9.1 * Added the ability to return to the initial file display. At last! * Full-scale assault on the code to weed out memory leaks. (In my defense, the majority of them technically weren't leaks before the prior change was implemented.) * Added -t option (unfortunately it's not as useful as I'd hoped it would be). * Fixed segfault when trying to play back solution on an unsolved level. * Improved the onomatopoeia display. * Reorganized the online help. 2001 Dec 03: version 0.9.0 * Found and fixed the obscure slide delay bug that was causing the discrepancy in Eric Schmidt's level 29 ("PARAMECIA")! * Threw out all the text-drawing code and replaced it with routines that deal in proportional fonts. Which naturally necessitated rewriting a bunch of the code that displayed text. Lots of changes. Created an abstract table "object", so that my tables could be realized either on the text console or in a proportional font equally well. * Implemented sound! Spent an entire weekend making 25 wave files -- and they still sound ridiculous. (But the fact that the game finally has sound is nice.) Onomatopoeia is still available via a cmdline switch. * Added password-checking code, plus functions to allow the user to jump to a level by entering a password. * Changed the save file format (again!) to store password information, and to be a little smaller. * Added the configuration file feature, with a few configuration options. This necessitated adding yet another directory, and once again moving the old one. * Various bug fixes that I've forgotten about while working on all the other things. 2001 Nov 14: version 0.8.4 * Rewrote a lot of the display code to avoid redundant drawing of areas of the screen. Didn't really make it faster, but I did make it more to my liking. Also rewrote all of the text display code. * Removed gamestate data that was only needed by one of the logic modules and made it private to that module. * Fixed bug found by Mike L. regarding the ordering of clones (MS). * Fixed bug regarding Chip trying to move on random force floors (MS). * Added code to indicate when Chip is pushing (Lynx). 2001 Nov 10: version 0.8.3 * MS logic bug fix (clone machine would get stuck if clone died while exiting). * Mixed improvement of display code. (The really cool revamping of the display code wound out performing horribly on 24-bit displays, and so had to be tossed out.) 2001 Nov 08: version 0.8.2 * Found problem with teleports (MS): creatures provide their own teleport blockage! Fixed. * Careful investigation revealed more timing bugs with buttons, teleports, and maybe beartraps as well (MS). Rewrote the endmovement() function until everything was being done in the right order. * Added an "rc" file which can be edited to change the filenames of the external resources. * Discovered and fixed a discrepancy in the slide delay (MS). * The usual sundry tweaks. 2001 Oct 29: version 0.8.1 * Fixed bug introduced in 0.7.2, correctly this time. * Fixed intermittent memory corruption caused by an uninitialized stack variable. 2001 Oct 28: version 0.8.0 * Fixed bug introduced in 0.7.2 which caused Chip to "come to rest" when he couldn't make a forced move (MS). * Fixed buried beartrap behavior in MS game logic. * Altered the solution file format (been wanting to do that for a long time). * Gave the program an icon (a temporary one, until I can get someone to make me a real icon). 2001 Oct 23: version 0.7.2 * Fixed two bugs in MS game logic discovered by Anders Kaseorg (creatures entering random slide floors, and Chip causing slide delay). * Rewrote the clone machine code to better match the internals of the MS game (thanks to recent discoveries). Also fixed the red-button logic so that clones do not block their own clone machines. 2001 Oct 22: version 0.7.1 * Fixed bug in MS game logic found by Anders Kaseorg (button not recognized when hit by a block being pushed by Chip while on the slip list). 2001 Oct 21: version 0.7.0 * Altered handling of the slip list in the MS game logic. Creatures on the slip list now have their slip direction stored separately from their pointed direction, and the former is determined at the time they enter a tile, instead of just before moving off of it. * My first serious attempt at implementing slide delay! * Many little tweaks to the MS logic. I think it's getting close.... * The tile images are no longer compiled into the binary; instead they are loaded out of an external bitmap file. The rendering code was changed to use 32-bit images internally instead of 8-bit images, so that all types of bitmaps can be accepted. * Added a new shared subdirectory for holding the data files; the main shared directory is now used to hold images. * Altered the onomatopoeia code to ease future introduction of sound. * Fixed the Lynx bug regarding the bequeathing of a slide token, or rather the lack thereof, when Chip is at a force-floor dead end. 2001 Oct 05: version 0.6.0 * Rewrote several fundamentals of the MS game logic, in order to bring it more in line with MS's layered map, as well as its treatment of blocks as non-creatures. * Made some general changes to the game internals in order to accommodate the above changes. * Many tweaks and improvements to the MS game logic. * Added the Ctrl-X feature to permit replacement of saved games -- something I should have added a long time ago. 2001 Aug 27: version 0.5.1 * Made some changes in the game-saving code to avoid an infinite loop that was sometimes happening under Windows. * Fixed two bugs in MS game logic identified by Anders Kaseorg. (1. Chip can only attempt to move once per tick -- a failed move still counts. 2. Creatures moving onto the slide list make their first slide move in the same tick.) 2001 Aug 19: version 0.5 * First alpha version. * The SVGAlib layer has been replaced with a much more complete layer for SDL. The program can now be compiled for either X or MS Windows. (All hail SDL and gcc's cross-compiling capabilities!) SDL also works under SVGAlib, but it looks terrible on my hardware. * A version of the game logic implementing the MS ruleset (with lots of bugs) has been added. The program can now switch between the two rulesets. * I ripped the entire code base apart and put it back together again (except for the parts that were thrown out). The code is somewhat better organized now. * Code was added to select data files, display scores, and lots of little things all over the place. * Comments! They're still pretty skeletal, but they're better than what was there before. 2001 Jul 15: version 0.1 * The previous game logic has been replaced with a complete game logic module for the Lynx ruleset. * The SVGAlib layer has been heavily rewritten to do raw keyboard polling and smooth-scrolling. * Lots of other changes and bug fixes. 2001 May 19: version 0.0 * First limited public release. * Most of the basic infrastructure is in place, including a working draft of a game logic module. tworld-1.3.0/Makefile.in0000644000175000017500000000547010420415001015222 0ustar breadboxbreadbox# # Useful ./configure options with respect to this Makefile: # # --prefix=PREFIX # --exec_prefix=EXEC_PREFIX # --bindir=BINDIR # --datadir=DATADIR # --mandir=MANDIR # --with-sharedir=SHAREDIR prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ datadir = @datadir@ sharedir = @sharedir@ mandir = @mandir@ CC = @CC@ CFLAGS :=@CFLAGS@ '-DROOTDIR="$(sharedir)"' LDFLAGS :=@LDFLAGS@ LOADLIBES :=@LOADLIBES@ # # End of configure section # OBJS = \ tworld.o series.o play.o encoding.o solution.o res.o lxlogic.o mslogic.o \ unslist.o help.o score.o random.o cmdline.o fileio.o err.o liboshw.a RESOURCES = tworldres.o # # Binaries # tworld: $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ $(LOADLIBES) tworld.exe: $(OBJS) $(RESOURCES) $(CC) $(LDFLAGS) -o $@ $^ $(LOADLIBES) mklynxcc: mklynxcc.c $(CC) -Wall -W -O -o $@ $^ # # Object files # tworld.o : tworld.c defs.h gen.h err.h series.h res.h play.h score.h \ solution.h fileio.h help.h oshw.h cmdline.h ver.h series.o : series.c series.h defs.h gen.h err.h fileio.h solution.h play.o : play.c play.h defs.h gen.h err.h state.h random.h oshw.h res.h \ logic.h solution.h fileio.h encoding.o : encoding.c encoding.h defs.h gen.h err.h state.h solution.o : solution.c solution.h defs.h gen.h err.h fileio.h res.o : res.c res.h defs.h gen.h fileio.h err.h oshw.h lxlogic.o : lxlogic.c logic.h defs.h gen.h err.h state.h random.h mslogic.o : mslogic.c logic.h defs.h gen.h err.h state.h random.h unslist.o : unslist.c unslist.h gen.h err.h fileio.h help.o : help.c help.h defs.h gen.h state.h oshw.h ver.h comptime.h score.o : score.c score.h defs.h gen.h err.h play.h random.o : random.c random.h defs.h gen.h cmdline.o : cmdline.c cmdline.h gen.h fileio.o : fileio.c fileio.h defs.h gen.h err.h err.o : err.c oshw.h err.h # # Generated files # comptime.h: echo \#define COMPILE_TIME \"`date '+%Y %b %e %T %Z'`\" > comptime.h # # Libraries # liboshw.a: oshw.h defs.h gen.h state.h err.h oshw/*.c oshw/*.h (cd oshw && $(MAKE)) # # Resources # tworldres.o: tworld.ico echo SDL_app ICON $^ | windres -o $@ # # Other # install: tworld mkdir -p $(bindir) mkdir -p $(sharedir)/sets mkdir -p $(sharedir)/data mkdir -p $(sharedir)/res mkdir -p $(mandir)/man6 cp -i ./tworld $(bindir)/. cp -i sets/*.dac $(sharedir)/sets/. cp -i data/*.dat $(sharedir)/data/. cp -i res/rc $(sharedir)/res/. cp -i res/*.bmp $(sharedir)/res/. cp -i res/*.txt $(sharedir)/res/. cp -i res/*.wav $(sharedir)/res/. cp -i docs/tworld.6 $(mandir)/man6/. all: tworld mklynxcc clean: rm -f $(OBJS) tworld mklynxcc comptime.h config.* rm -f tworldres.o tworld.exe mklynxcc.exe (cd oshw && $(MAKE) clean) spotless: rm -f $(OBJS) tworld mklynxcc comptime.h config.* configure rm -f tworldres.o tworld.exe mklynxcc.exe (cd oshw && $(MAKE) spotless) rm -f Makefile tworld-1.3.0/README0000644000175000017500000002610410420664541014051 0ustar breadboxbreadbox Welcome to Tile World Tile World is an emulation of the game "Chip's Challenge" for the Atari Lynx, created by Chuck Sommerville, and later ported to MS Windows by Microsoft (among other ports). Important Note Tile World is an emulation of the "Chip's Challenge" game engines only. It does not come with the chips.dat file that contains the original level set. That file, which is copyrighted and cannot be freely distributed, was originally distributed with the MS version of "Chip's Challenge". If you have a copy of this version of the game, you can use that file to play the original games in Tile World. If you do not have a copy of this file, however, you can still play Tile World with the many freely available level files created by fans of the original game. Installing Tile World under Windows First of all, you'll want to store the files contained in this archive into its own separate directory. If you're using the self-extracting executable, you can create a new directory during the installation. Otherwise, you'll need to create a new directory beforehand -- something like c:\tworld -- and extract the files in there. If you have a copy of the chips.dat data file, copy it to the data subdirectory. This will allow you to play the original levels under Tile World (for the MS ruleset and the Lynx ruleset both). If you have other data files that you would like to try out in Tile World, copy those to the sets directory. The shell commands to do the above would look something like: cd c:\wherever\my\copy\of\chips\challenge\is\at copy chips.dat c:\tworld\data cd c:\my\collection\of\dat\files copy *.dat c:\tworld\sets That's all that needs to be done to set it up. Run the program as c:\tworld\tworld, or create a shortcut for it. Installing Tile World under Linux Before proceeding, ensure that you have SDL installed on your machine. (If you don't have SDL, you can get it by visiting http://www.libsdl.org/download.html. If you download a precompiled version -- i.e., an .rpm or .deb file -- note that you will need the development runtime, as opposed to the binary runtime.) Installing Tile World involves the usual three-part incantation: ./configure By default, the program is set up so that it will keep its shared files under /usr/local/share/tworld. If you would prefer the tworld directory to be somewhere besides /usr/local/share, use the --datadir option to change it when you run ./configure. Alternately, you can use the --with-sharedir=DIR option to explicitly specify a completely different path. (This value can also be changed at runtime, either via the TWORLDDIR environment variable or via the command line.) make There shouldn't be any serious warnings from the compiler. Use "make mklynxcc" if you want to also build a copy of mklynxcc (see below). make install Running "make install" as root will do the following: * Copy the tworld binary to /usr/local/games. * Copy the tworld.6 manpage to /usr/local/man/man6. * Create /usr/local/share/tworld if it does not exist. (Or whatever directory you specified to ./configure.) * Copy the external resources (i.e., the bitmaps and wave files) to /usr/local/share/tworld/res. * Create the directories /usr/local/share/tworld/data and /usr/local/share/tworld/sets. The sets directory is where you will generally store the .dat files that you want to use. However, if you want to make use of a configuration file with a particular data file, then you will need to store the data file in the data directory, and the configuration file goes into the sets directory instead. See the documentation for more information. Level Sets As mentioned above, the original "Chip's Challenge" level set does not come with Tile World, for reasons of copyright. If you do not already have a copy of Microsoft's Windows version of "Chip's Challenge", you might still be able to find a copy. Search the links listed below, under "Resources on the Internet", for helpful hints on finding the game online. If and when you do, you can copy the chips.dat file from there into Tile World's data directory. You will then be able to play the levels of the original set (both in MS mode and in Lynx mode). There are also many "user-created" level sets. These are sets of levels which have been invented by fans of the game. These sets are freely available for downloading. If you have a .dat file that contains a level set and you wish to use it, just copy it to Tile World's sets directory. The next time you start Tile World, the new .dat should appear in the list of available level sets. At http://groups.yahoo.com/group/chips_challenge/files/ is a repository of the available level sets that have been created. The biggest fans of the game try to provide a copy of every known user-created level set at this place. I have not included any of these level sets in this distribution, as the authors continue to add new levels to their sets over time. Actually, this distribution does contain one small level set. This is included so that even if you don't have the original level set, you can still get a brief glimpse of how the game works, and what some of the most basic challenges are. Also, the same set of levels can be played with both the MS and Lynx ruleset, so you can see how they differ. Finally, there is one level set that is special and deserves particular mention. That is CCLP2.dat, or "Chip's Challenge Level Pack 2". This set was assembled by the fans, who voted on all of the user-created levels that existed at the time. The levels that were voted as being the most fun were then all put together to become CCLP2. It is the closest thing we have to a sequel for the original game. (But be careful: CCLP2 is much harder than the original!) You can download a copy of Tile World with this set already installed. If instead you download it separately, you will want to store it in your data directory instead of your sets directory. (This is because Tile World comes with a special configuration file for CCLP2.) The Complete Documentation The full documentation for Tile World is included with the distribution, in the file tworld.html. There you will find information on how to play the game, adding new level sets, customizing Tile World, and more. Creating New Level Sets The most widely used program for creating new level sets is ChipEdit. It comes with excellent documentation, and you should have little trouble learning how to use it. Some other editors have recently been made available, such as CCEdit and Chip's Workshop. Normally, ChipEdit creates levels for the MS ruleset. If you wish to make a level set for the Lynx ruleset, you have a few options: * A very simple command-line utility is included with Tile World, called mklynxcc. This program will change a normal .dat file to one that will use the Lynx ruleset instead of the MS ruleset. Running mklynxcc foo.dat will change foo.dat's ruleset from MS to Lynx. * You can use a configuration file to override the builtin ruleset. This method requires creating an extra file, but does allows you to avoid making changes to the .dat file. See the complete documentation for information on how to set up a configuration file. * Finally, ChipEdit has an obscure feature which allows you to control the signature of the data file. This is done by adding a SIGNATURE entry to the chipedit.ini file. The default signature value is 0x0002AAAC, which indicates a data file that uses the MS ruleset. If you set the SIGNATURE to be 0x0102AAAC, then ChipEdit will create data files marked to use the Lynx ruleset instead. Resources on the Internet There is quite a bit of information about "Chip's Challenge" available on the internet. Much of it is focused on maximizing your score on the original level set for the MS game, but you will also find lots of general help and useful information as well. Jimmy Vermeer maintains a site that tracks people's scores on the original level set and CCLP2, as well as information on other levels and links to many other pages. http://www.geocities.com/purpletentacle1977ca/ Anders Kaseorg's site contains the Chip's Challenge FAQ, as well as the AVI repository and a web interface to the newsgroup: http://chips.kaseorg.com/ The grand repository of user-created level sets can be found at the chips_challenge Yahoo group: http://groups.yahoo.com/group/chips_challenge/files/ ChipEdit's home page is at: http://www.stage62.com/chipedit/chipedit.htm Finally, Tile World's home page is at: http://www.muppetlabs.com/~breadbox/software/tworld/ License Tile World is copyright (C) 2001-2006 by Brian Raiter. 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 2 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, included in this distribution in the file COPYING, for more details. Bugs Bug reports are always appreciated, and can be sent to the author at breadboxmuppetlabs.comcom. The list of known bugs is at http://www.muppetlabs.com/~breadbox/software/tworld/BUGS.html. Please check here before sending a bug report, to to make sure the bug has not already been documented. Credits Tile World was written by Brian Raiter. The sound effects included in this distribution were created by Brian Raiter, with assistance from SoX. Brian Raiter has explictly placed these files in the public domain. The tile images included in this distribution were created by Anders Kaseorg, with assistance from POV-Ray. Anders Kaseorg has explicitly placed these files in the public domain. The introductory set of levels included in this distribution were created by Brian Raiter. Brian Raiter has explictly placed these levels in the public domain. "Chip's Challenge" was designed by Chuck Sommerville, who is also the author of the original Lynx program. "Chip's Challenge" is a registered trademark of Alpha Omega Publications. Creating this program would have been flatly impossible without the help of several fans of "Chip's Challenge". The author would particularly like to acknowledge Anders Kaseorg for sharing the fruits of his investigations into the game logic of the MS version and for being an effective bug hunter, Chuck Sommerville for his pointers regarding the game logic of the Lynx version and his unfailing support of this project, and "CCExplore" for his in-depth investigations of esoteric game behavior. Many other regulars of the annexcafe.chips.challenge newsgroup assisted with bug reports, suggestions, and all-around encouragement. Their help is gratefully acknowledged. The anonymous author of the document describing the .dat file format, Don Gregory, the "Charter Chipsters", and the contributors to the CC AVI library all deserve mention as well -- this program would never have been written without the information they made freely available. Last but not least, a tip of the hat to John K. Elion for writing ChipEdit. Brian Raiter April 2006 tworld-1.3.0/cmdline.c0000644000175000017500000000550607413637134014761 0ustar breadboxbreadbox/* cmdline.c: a reentrant version of getopt(). * * Written 1997-2001 by Brian Raiter. This code is in the public * domain. */ #include #include #include #include "gen.h" #include "cmdline.h" /* Initialize the state structure. */ void initoptions(cmdlineinfo *opt, int argc, char **argv, char const *list) { opt->options = list; opt->argc = argc; opt->argv = argv; opt->index = 0; opt->argptr = NULL; opt->stop = FALSE; } /* Find the next option on the cmdline. */ int readoption(cmdlineinfo *opt) { char const *str; if (!opt->options || !opt->argc || !opt->argv) return -1; /* If argptr is NULL or points to a \0, then we're done with this * argument, and it's time to move on to the next one (if any). */ redo: if (!opt->argptr || !*opt->argptr) { if (opt->index >= opt->argc) { opt->type = OPT_END; return -1; } opt->argptr = opt->argv[opt->index]; ++opt->index; /* Special case: if the next argument is "--", we skip over it and * stop looking for options for the rest of the cmdline. */ if (!opt->stop && opt->argptr && opt->argptr[0] == '-' && opt->argptr[1] == '-' && opt->argptr[2] == '\0') { opt->argptr = NULL; opt->stop = TRUE; goto redo; } /* Arguments not starting with a '-' or appearing after a * "--" argument are not options. */ if (*opt->argptr != '-' || opt->stop) { opt->opt = 0; opt->val = opt->argptr; opt->type = OPT_NONOPTION; opt->argptr = NULL; return 0; } /* Check for special cases. */ ++opt->argptr; if (!*opt->argptr) { /* The "-" case. */ opt->opt = 0; opt->val = opt->argptr - 1; opt->type = OPT_DASH; return 0; } if (*opt->argptr == '-') { opt->opt = 0; /* The "--foo" case. */ opt->val = opt->argptr - 1; opt->type = OPT_LONG; opt->argptr = NULL; return '-'; } } /* We are currently looking at the next option. */ opt->type = OPT_OPTION; opt->opt = *opt->argptr; ++opt->argptr; /* Is it on the list? If so, does it expect a value to follow? */ str = strchr(opt->options, opt->opt); if (!str) { opt->val = opt->argptr - 1; opt->type = OPT_BADOPTION; return '?'; } else if (str[1] == ':') { if (*opt->argptr) { /* Is the value here? */ opt->val = opt->argptr; opt->argptr = NULL; } else { if (opt->index >= opt->argc) { /* Or in the next argument? */ opt->val = NULL; opt->type = OPT_NOVALUE; return ':'; } else { opt->val = opt->argv[opt->index]; ++opt->index; } } } else opt->val = NULL; return opt->opt; } /* Ignore the next argument on the cmdline. */ int skipoption(cmdlineinfo *opt) { if (opt->index >= opt->argc) return -1; opt->val = opt->argv[opt->index]; ++opt->index; return 0; } tworld-1.3.0/cmdline.h0000644000175000017500000001013007427047760014760 0ustar breadboxbreadbox/* cmdline.h: a reentrant version of getopt(). * * Written 1997-2001 by Brian Raiter. This code is in the public * domain. */ #ifndef _cmdline_h_ #define _cmdline_h_ /* Begin by calling initoptions with your argc-argv pair, a string * containing a list of valid options, and an cmdlineinfo structure. * In the string listing the valid options, a character can have a * colon after it to indicate that the option is to be followed with a * value. (If -: is a valid option, put it first in the string.) The * cmdlineinfo structure is used when calling readoption, and also * contains information about each option (analagous to the extern * variables in getopt). After this, call readoption repeatedly to * find and identify an option on the command line. * * For example: * * initoptions(&opt, "cdL:rnx:", argc - 1, argv + 1); * * indicates that -c, -d, -r, and -n are legal boolean options, and that * -L and -x are legal options that include a value. If the cmdline was: * * prog -dLfoo -n bar -x baz * * then the first three calls to readoption would find -d, -L, and -n * with -L having the value "foo" attached to it. Calling readoption a * fourth time would find the non-option argument "bar". The fifth * call would find -x with "baz" as its accompanying value. A sixth * call to readoption would return EOF, indicating the end of the * cmdline. * * Written by Brian Raiter, 1997, with minor modifications 1997-2001. * This code is in the public domain. */ /* Possible values for the type field, indicating the various kinds of * creatures to be found on the cmdline. */ enum { OPT_OPTION, /* a legal option */ OPT_NONOPTION, /* a plain, non-option argument */ OPT_BADOPTION, /* an unrecognized option */ OPT_NOVALUE, /* a legal option without a value */ OPT_LONG, /* a GNU-style --long-option */ OPT_DASH, /* a bare "-" */ OPT_END /* end of the cmdline */ }; /* The cmdline info structure. The first three fields are supplied by * the caller via initoptions(). The next three fields provide * information back to the caller. The remaining fields are used * internally by readoption(). */ typedef struct cmdlineinfo { char const *options; /* the list of valid options */ int argc; /* cmdline's argc */ char **argv; /* cmdline's argv */ int opt; /* the current option (character value) */ int type; /* type of current option (see below) */ char *val; /* value accompanying the option */ int index; /* index of the next argument */ char *argptr; /* ptr to the next option/argument */ int stop; /* flag indicating no further options */ } cmdlineinfo; /* initoptions() initializes the cmdline parsing. opt is an empty * cmdlineinfo structure to initialize. list is a string containing * the recognized options, in the same style as used by getopt. argc * and argv give the cmdline to parse. Note that argv[0] is NOT * automatically skipped; the caller should use argc - 1 and argv + 1. */ extern void initoptions(cmdlineinfo *opt, int argc, char **argv, char const* list); /* readoption() locates and identifies the next option on the cmdline. * Returns the character of the option found, which is also stored in * opt->opt, and opt->type will be set to OPT_OPTION (and opt->val * will point to the option's associated value if appropriate), or * OPT_BADOPTION if the option character is not recognized, or * OPT_NOVALUE if the option requires a value which is not present. A * return value of 0 indicates that a non-option argument has been * found, in which case opt->type will contain OPT_NONOPTION or * OPT_DASH, and opt->val will contain a pointer to the argument. A * return value of EOF indicates that the entire cmdline has been * parsed. */ extern int readoption(cmdlineinfo *opt); /* skipoption() causes the current cmdline argument to be skipped over * on the next call to readoption(). This is useful for situations * when an option has multiple values (i.e., a value with spaces). The * return value is 0, or EOF if the end of the cmdline is reached. */ extern int skipoption(cmdlineinfo *opt); #endif tworld-1.3.0/configure0000755000175000017500000007203710400001214015062 0ustar breadboxbreadbox#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --with-debug Build with debugging info" ac_help="$ac_help --with-sharedir=DIR Explicitly set the shared data directory" ac_help="$ac_help --with-sdl Build SDL version (default)" ac_help="$ac_help --with-win32 Set defaults for a windows build" # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=tworld.c # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi test -z "$CC" && CC="gcc" test -z "$CFLAGS" && CFLAGS=" -Wall -W -O2 -fomit-frame-pointer -DNDEBUG" test -z "$LDFLAGS" && LDFLAGS=" -Wall -W -s" # Check whether --with-debug or --without-debug was given. if test "${with_debug+set}" = set; then withval="$with_debug" if test $withval = yes ; then CFLAGS=" -Wall -W -ggdb" LDFLAGS=" -Wall -W -ggdb" fi fi LOADLIBES="" OSHWCFLAGS=$CFLAGS sharedir='${datadir}/tworld' otherobjs="" # Check whether --with-sharedir or --without-sharedir was given. if test "${with_sharedir+set}" = set; then withval="$with_sharedir" sharedir=$withval fi OSHWDIR="sdl" # Check whether --with-sdl or --without-sdl was given. if test "${with_sdl+set}" = set; then withval="$with_sdl" if test $withval = yes ; then OSHWDIR="sdl" fi fi if test -d "oshw-$OSHWDIR" ; then echo using $OSHWDIR for OS/hardware layer ... rm -f oshw ln -s oshw-$OSHWDIR oshw else { echo "configure: error: OS/hardware layer "$OSHWDIR" not available" 1>&2; exit 1; } fi if test "$OSHWDIR" = "sdl" ; then # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:586: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_sdlpresent'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$sdlpresent"; then ac_cv_prog_sdlpresent="$sdlpresent" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_sdlpresent="yes" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_sdlpresent" && ac_cv_prog_sdlpresent="no" fi fi sdlpresent="$ac_cv_prog_sdlpresent" if test -n "$sdlpresent"; then echo "$ac_t""$sdlpresent" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$sdlpresent" ; then { echo "configure: error: SDL installation not found." 1>&2; exit 1; } fi OSHWCFLAGS=$OSHWCFLAGS' $(shell sdl-config --cflags)' LOADLIBES=$LOADLIBES' $(shell sdl-config --libs)' fi # Check whether --with-win32 or --without-win32 was given. if test "${with_win32+set}" = set; then withval="$with_win32" if test $withval = yes ; then sharedir="." otherobjs=" tworldres.o" fi fi trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. cat > conftest.defs <<\EOF s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g s%\[%\\&%g s%\]%\\&%g s%\$%$$%g EOF DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` rm -f conftest.defs # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir trap 'rm -fr `echo "Makefile oshw/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@sdlpresent@%$sdlpresent%g s%@CC@%$CC%g s%@OSHWCFLAGS@%$OSHWCFLAGS%g s%@LOADLIBES@%$LOADLIBES%g s%@sharedir@%$sharedir%g s%@otherobjs@%$otherobjs%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 tworld-1.3.0/configure.in0000644000175000017500000000370610375557245015520 0ustar breadboxbreadboxdnl dnl configure.in script for Tile World dnl AC_INIT(tworld.c) test -z "$CC" && CC="gcc" test -z "$CFLAGS" && CFLAGS=" -Wall -W -O2 -fomit-frame-pointer -DNDEBUG" test -z "$LDFLAGS" && LDFLAGS=" -Wall -W -s" dnl dnl --with-debug turns on debugging options dnl AC_ARG_WITH(debug, [ --with-debug Build with debugging info], [if test $withval = yes ; then CFLAGS=" -Wall -W -ggdb" LDFLAGS=" -Wall -W -ggdb" fi]) LOADLIBES="" OSHWCFLAGS=$CFLAGS sharedir='${datadir}/tworld' otherobjs="" dnl dnl --with-sharedir=DIR overrides default value of $datadir/tworld dnl for the shared data directory. dnl AC_ARG_WITH(sharedir, [ --with-sharedir=DIR Explicitly set the shared data directory], [sharedir=$withval]) dnl dnl --with-sdl selects SDL as the OS/hardware layer. dnl (Currently this is the only OS/hardware layer option.) dnl OSHWDIR="sdl" AC_ARG_WITH(sdl, [ --with-sdl Build SDL version (default)], [if test $withval = yes ; then OSHWDIR="sdl" fi]) if test -d "oshw-$OSHWDIR" ; then echo using $OSHWDIR for OS/hardware layer ... rm -f oshw ln -s oshw-$OSHWDIR oshw else AC_MSG_ERROR([OS/hardware layer "$OSHWDIR" not available]) fi if test "$OSHWDIR" = "sdl" ; then AC_CHECK_PROG(sdlpresent, sdl-config, yes, no) if test -z "$sdlpresent" ; then AC_MSG_ERROR([SDL installation not found.]) fi OSHWCFLAGS=$OSHWCFLAGS' $(shell sdl-config --cflags)' LOADLIBES=$LOADLIBES' $(shell sdl-config --libs)' fi dnl dnl --with-win32 puts some Windows-specific lines in the Makefile dnl AC_ARG_WITH(win32, [ --with-win32 Set defaults for a windows build], [if test $withval = yes ; then sharedir="." otherobjs=" tworldres.o" fi]) dnl dnl Done with processing. dnl AC_SUBST(CC) AC_SUBST(CFLAGS) AC_SUBST(OSHWCFLAGS) AC_SUBST(LDFLAGS) AC_SUBST(LOADLIBES) AC_SUBST(sharedir) AC_SUBST(otherobjs) AC_OUTPUT(Makefile oshw/Makefile) tworld-1.3.0/defs.h0000644000175000017500000001556610420313274014267 0ustar breadboxbreadbox/* defs.h: Definitions used throughout the program. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _defs_h_ #define _defs_h_ #include #include "gen.h" /* * Miscellaneous definitions. */ /* The various rulesets the program can emulate. */ enum { Ruleset_None = 0, Ruleset_Lynx = 1, Ruleset_MS = 2, Ruleset_Count }; /* File I/O structure. */ typedef struct fileinfo { char *name; /* the name of the file */ FILE *fp; /* the real file handle */ char alloc; /* TRUE if name was allocated internally */ } fileinfo; /* Pseudorandom number generators. */ typedef struct prng { unsigned long initial; /* initial seed value */ unsigned long value; /* latest random value */ char shared; /* FALSE if independent sequence */ } prng; /* * Definitions used in game play. */ /* Turning macros. */ #define left(dir) ((((dir) << 1) | ((dir) >> 3)) & 15) #define back(dir) ((((dir) << 2) | ((dir) >> 2)) & 15) #define right(dir) ((((dir) << 3) | ((dir) >> 1)) & 15) /* A move is specified by its direction and when it takes place. */ typedef struct action { unsigned int when:23, dir:9; } action; /* A structure for managing the memory holding the moves of a game. */ typedef struct actlist { int allocated; /* number of elements allocated */ int count; /* size of the actual array */ action *list; /* the array */ } actlist; /* A structure holding all the data needed to reconstruct a solution. */ typedef struct solutioninfo { actlist moves; /* the actual moves of the solution */ unsigned long rndseed; /* the PRNG's initial seed */ unsigned long flags; /* other flags (currently unused) */ unsigned char rndslidedir; /* random slide's initial direction */ signed char stepping; /* the timer offset */ } solutioninfo; /* The range of relative mouse moves is a 19x19 square around Chip. * (Mouse moves are stored as a relative offset in order to fit all * possible moves in nine bits.) */ #define MOUSERANGEMIN -9 #define MOUSERANGEMAX +9 #define MOUSERANGE 19 /* The complete list of commands that the user can given. */ enum { CmdNone = NIL, CmdNorth = NORTH, CmdWest = WEST, CmdSouth = SOUTH, CmdEast = EAST, CmdKeyMoveFirst = NORTH, CmdKeyMoveLast = NORTH | WEST | SOUTH | EAST, CmdMouseMoveFirst, CmdMoveNop = CmdMouseMoveFirst - MOUSERANGEMIN * (MOUSERANGE + 1), CmdMouseMoveLast = CmdMouseMoveFirst + MOUSERANGE * MOUSERANGE - 1, CmdReservedFirst, CmdReservedLast = 511, CmdAbsMouseMoveFirst, CmdAbsMouseMoveLast = CmdAbsMouseMoveFirst + CXGRID * CYGRID - 1, CmdMoveFirst = CmdKeyMoveFirst, CmdMoveLast = CmdAbsMouseMoveLast, CmdPrevLevel, CmdNextLevel, CmdSameLevel, CmdQuitLevel, CmdGotoLevel, CmdPrev, CmdNext, CmdSame, CmdPrev10, CmdNext10, CmdPauseGame, CmdHelp, CmdPlayback, CmdCheckSolution, CmdReplSolution, CmdKillSolution, CmdSeeScores, CmdSeeSolutionFiles, CmdVolumeUp, CmdVolumeDown, CmdStepping, CmdSubStepping, CmdProceed, CmdDebugCmd1, CmdDebugCmd2, CmdQuit, CmdPreserve, CmdCheatNorth, CmdCheatWest, CmdCheatSouth, CmdCheatEast, CmdCheatHome, CmdCheatKeyRed, CmdCheatKeyBlue, CmdCheatKeyYellow, CmdCheatKeyGreen, CmdCheatBootsIce, CmdCheatBootsSlide, CmdCheatBootsFire, CmdCheatBootsWater, CmdCheatICChip, CmdCount }; /* True if cmd is a simple directional command, i.e. a single * orthogonal or diagonal move (or CmdNone). */ #define directionalcmd(cmd) (((cmd) & ~CmdKeyMoveLast) == 0) /* The list of available sound effects. */ #define SND_CHIP_LOSES 0 #define SND_CHIP_WINS 1 #define SND_TIME_OUT 2 #define SND_TIME_LOW 3 #define SND_DEREZZ 4 #define SND_CANT_MOVE 5 #define SND_IC_COLLECTED 6 #define SND_ITEM_COLLECTED 7 #define SND_BOOTS_STOLEN 8 #define SND_TELEPORTING 9 #define SND_DOOR_OPENED 10 #define SND_SOCKET_OPENED 11 #define SND_BUTTON_PUSHED 12 #define SND_TILE_EMPTIED 13 #define SND_WALL_CREATED 14 #define SND_TRAP_ENTERED 15 #define SND_BOMB_EXPLODES 16 #define SND_WATER_SPLASH 17 #define SND_ONESHOT_COUNT 18 #define SND_BLOCK_MOVING 18 #define SND_SKATING_FORWARD 19 #define SND_SKATING_TURN 20 #define SND_SLIDING 21 #define SND_SLIDEWALKING 22 #define SND_ICEWALKING 23 #define SND_WATERWALKING 24 #define SND_FIREWALKING 25 #define SND_COUNT 26 /* * Structures for defining the games proper. */ /* The collection of data maintained for each level. */ typedef struct gamesetup { int number; /* numerical ID of the level */ int time; /* no. of seconds allotted */ int besttime; /* time (in ticks) of best solution */ int sgflags; /* saved-game flags (see below) */ int levelsize; /* size of the level data */ int solutionsize; /* size of the saved solution data */ unsigned char *leveldata; /* the data defining the level */ unsigned char *solutiondata; /* the player's best solution so far */ unsigned long levelhash; /* the level data's hash value */ char const *unsolvable; /* why level is unsolvable, or NULL */ char name[256]; /* name of the level */ char passwd[256]; /* the level's password */ } gamesetup; /* Flags associated with a saved game. */ #define SGF_HASPASSWD 0x0001 /* player knows the level's password */ #define SGF_REPLACEABLE 0x0002 /* solution is marked as replaceable */ #define SGF_SETNAME 0x0004 /* internal to solution.c */ /* The collection of data maintained for each series. */ typedef struct gameseries { int count; /* number of levels in the series */ int allocated; /* number of elements allocated */ int final; /* number of the ending level */ int ruleset; /* the ruleset for the game file */ int gsflags; /* series flags (see below) */ gamesetup *games; /* the array of levels */ fileinfo mapfile; /* the file containing the levels */ char *mapfilename; /* the name of said file */ fileinfo savefile; /* the file holding the solutions */ char *savefilename; /* non-default name for said file */ int solheaderflags; /* solution flags (none defined yet) */ int solheadersize; /* size of extra solution header */ char filebase[256]; /* the level set's filename */ char name[256]; /* the filename minus any path */ unsigned char solheader[256]; /* extra solution header bytes */ } gameseries; /* Flags associated with a series. */ #define GSF_ALLMAPSREAD 0x0001 /* finished reading the data file */ #define GSF_NOSAVING 0x0002 /* treat solution file as read-only */ #define GSF_NODEFAULTSAVE 0x0004 /* don't use default tws filename */ #define GSF_IGNOREPASSWDS 0x0008 /* don't require passwords */ #define GSF_LYNXFIXES 0x0010 /* change MS data into Lynx levels */ #endif tworld-1.3.0/encoding.c0000644000175000017500000002521410416667120015125 0ustar breadboxbreadbox/* encoding.c: Functions to read the level data. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include "defs.h" #include "state.h" #include "err.h" #include "encoding.h" /* Read a 16-bit value, stored little-endian, from the level data * stream. */ #define readword(p) ((p)[0] | ((p)[1] << 8)) /* Read an x-y coordinate pair from the level data stream. Ensure that * an invalid x value always produces an invalid coordinate. */ #define readpos(x, y) (*(x) < CXGRID ? *(x) + CYGRID * *(y) : CXGRID*CYGRID) /* Translation table for the codes used by the data file to define the * initial state of a level. */ static int const fileids[] = { /* 00 empty space */ Empty, /* 01 wall */ Wall, /* 02 chip */ ICChip, /* 03 water */ Water, /* 04 fire */ Fire, /* 05 invisible wall, perm. */ HiddenWall_Perm, /* 06 blocked north */ Wall_North, /* 07 blocked west */ Wall_West, /* 08 blocked south */ Wall_South, /* 09 blocked east */ Wall_East, /* 0A block */ Block_Static, /* 0B dirt */ Dirt, /* 0C ice */ Ice, /* 0D force south */ Slide_South, /* 0E cloning block N */ crtile(Block, NORTH), /* 0F cloning block W */ crtile(Block, WEST), /* 10 cloning block S */ crtile(Block, SOUTH), /* 11 cloning block E */ crtile(Block, EAST), /* 12 force north */ Slide_North, /* 13 force east */ Slide_East, /* 14 force west */ Slide_West, /* 15 exit */ Exit, /* 16 blue door */ Door_Blue, /* 17 red door */ Door_Red, /* 18 green door */ Door_Green, /* 19 yellow door */ Door_Yellow, /* 1A SE ice slide */ IceWall_Southeast, /* 1B SW ice slide */ IceWall_Southwest, /* 1C NW ice slide */ IceWall_Northwest, /* 1D NE ice slide */ IceWall_Northeast, /* 1E blue block, tile */ BlueWall_Fake, /* 1F blue block, wall */ BlueWall_Real, /* 20 not used */ Overlay_Buffer, /* 21 thief */ Burglar, /* 22 socket */ Socket, /* 23 green button */ Button_Green, /* 24 red button */ Button_Red, /* 25 switch block, closed */ SwitchWall_Closed, /* 26 switch block, open */ SwitchWall_Open, /* 27 brown button */ Button_Brown, /* 28 blue button */ Button_Blue, /* 29 teleport */ Teleport, /* 2A bomb */ Bomb, /* 2B trap */ Beartrap, /* 2C invisible wall, temp. */ HiddenWall_Temp, /* 2D gravel */ Gravel, /* 2E pass once */ PopupWall, /* 2F hint */ HintButton, /* 30 blocked SE */ Wall_Southeast, /* 31 cloning machine */ CloneMachine, /* 32 force all directions */ Slide_Random, /* 33 drowning Chip */ Drowned_Chip, /* 34 burned Chip */ Burned_Chip, /* 35 burned Chip */ Bombed_Chip, /* 36 not used */ HiddenWall_Perm, /* 37 not used */ HiddenWall_Perm, /* 38 not used */ HiddenWall_Perm, /* 39 Chip in exit */ Exited_Chip, /* 3A exit - end game */ Exit_Extra_1, /* 3B exit - end game */ Exit_Extra_2, /* 3C Chip swimming N */ crtile(Swimming_Chip, NORTH), /* 3D Chip swimming W */ crtile(Swimming_Chip, WEST), /* 3E Chip swimming S */ crtile(Swimming_Chip, SOUTH), /* 3F Chip swimming E */ crtile(Swimming_Chip, EAST), /* 40 Bug N */ crtile(Bug, NORTH), /* 41 Bug W */ crtile(Bug, WEST), /* 42 Bug S */ crtile(Bug, SOUTH), /* 43 Bug E */ crtile(Bug, EAST), /* 44 Fireball N */ crtile(Fireball, NORTH), /* 45 Fireball W */ crtile(Fireball, WEST), /* 46 Fireball S */ crtile(Fireball, SOUTH), /* 47 Fireball E */ crtile(Fireball, EAST), /* 48 Pink ball N */ crtile(Ball, NORTH), /* 49 Pink ball W */ crtile(Ball, WEST), /* 4A Pink ball S */ crtile(Ball, SOUTH), /* 4B Pink ball E */ crtile(Ball, EAST), /* 4C Tank N */ crtile(Tank, NORTH), /* 4D Tank W */ crtile(Tank, WEST), /* 4E Tank S */ crtile(Tank, SOUTH), /* 4F Tank E */ crtile(Tank, EAST), /* 50 Glider N */ crtile(Glider, NORTH), /* 51 Glider W */ crtile(Glider, WEST), /* 52 Glider S */ crtile(Glider, SOUTH), /* 53 Glider E */ crtile(Glider, EAST), /* 54 Teeth N */ crtile(Teeth, NORTH), /* 55 Teeth W */ crtile(Teeth, WEST), /* 56 Teeth S */ crtile(Teeth, SOUTH), /* 57 Teeth E */ crtile(Teeth, EAST), /* 58 Walker N */ crtile(Walker, NORTH), /* 59 Walker W */ crtile(Walker, WEST), /* 5A Walker S */ crtile(Walker, SOUTH), /* 5B Walker E */ crtile(Walker, EAST), /* 5C Blob N */ crtile(Blob, NORTH), /* 5D Blob W */ crtile(Blob, WEST), /* 5E Blob S */ crtile(Blob, SOUTH), /* 5F Blob E */ crtile(Blob, EAST), /* 60 Paramecium N */ crtile(Paramecium, NORTH), /* 61 Paramecium W */ crtile(Paramecium, WEST), /* 62 Paramecium S */ crtile(Paramecium, SOUTH), /* 63 Paramecium E */ crtile(Paramecium, EAST), /* 64 Blue key */ Key_Blue, /* 65 Red key */ Key_Red, /* 66 Green key */ Key_Green, /* 67 Yellow key */ Key_Yellow, /* 68 Flippers */ Boots_Water, /* 69 Fire boots */ Boots_Fire, /* 6A Ice skates */ Boots_Ice, /* 6B Suction boots */ Boots_Slide, /* 6C Chip N */ crtile(Chip, NORTH), /* 6D Chip W */ crtile(Chip, WEST), /* 6E Chip S */ crtile(Chip, SOUTH), /* 6F Chip E */ crtile(Chip, EAST) }; /* Initialize the gamestate by reading the level data, in MS dat-file * format, from the state's setup. */ static int expandmsdatlevel(gamestate *state) { gamesetup *setup; unsigned char const *data; unsigned char const *dataend; int size, pos, id; int i, n; memset(state->map, 0, sizeof state->map); state->trapcount = 0; state->clonercount = 0; state->crlistcount = 0; state->hinttext[0] = '\0'; setup = state->game; if (setup->levelsize < 10) goto badlevel; data = setup->leveldata; dataend = data + setup->levelsize; if (readword(data) == 0) goto badlevel; state->chipsneeded = readword(data + 4); if (readword(data + 6) > 1) goto badlevel; size = readword(data + 8); data += 10; if (data + size + 2 > dataend) goto badlevel; for (n = pos = 0 ; n < size && pos < CXGRID * CYGRID ; ++n) { if (data[n] == 0xFF) { i = data[++n]; id = data[++n]; } else { i = 1; id = data[n]; } if (id >= (int)(sizeof fileids / sizeof *fileids)) { id = Wall; state->statusflags |= SF_BADTILES; } else { id = fileids[id]; } while (i-- && pos < CXGRID * CYGRID) state->map[pos++].top.id = id; } if (n < size) warn("level %d: %d extra bytes in upper map layer", setup->number, size - n); else if (pos < CXGRID * CYGRID) warn("level %d: %d missing bytes in upper map layer", setup->number, CXGRID * CYGRID - pos); data += size + 2; size = readword(data - 2); if (data + size > dataend) goto badlevel; for (n = pos = 0 ; n < size && pos < CXGRID * CYGRID ; ++n) { if (data[n] == 0xFF) { i = data[++n]; id = data[++n]; } else { i = 1; id = data[n]; } if (id >= (int)(sizeof fileids / sizeof *fileids)) { id = Wall; state->statusflags |= SF_BADTILES; } else { id = fileids[id]; } while (i-- && pos < CXGRID * CYGRID) state->map[pos++].bot.id = id; } if (n < size) warn("level %d: %d extra bytes in lower map layer", setup->number, size - n); else if (pos < CXGRID * CYGRID) warn("level %d: %d missing bytes in lower map layer", setup->number, CXGRID * CYGRID - pos); data += size; size = readword(data); data += 2; if (data + size != dataend) warn("level %d: inconsistent metadata", setup->number); while (data + 2 < dataend) { size = data[1]; data += 2; if (data + size > dataend) size = dataend - data; switch (data[-2]) { case 1: /* time */ break; case 2: if (size < 2) warn("level %d: ignoring field 2 data of size %d", setup->number, size); else state->chipsneeded = readword(data); break; case 3: /* level name */ break; case 4: if (size % 10) warn("level %d: ignoring %d extra bytes at end of field 4", setup->number, size % 10); state->trapcount = size / 10; for (i = 0 ; i < state->trapcount ; ++i) { state->traps[i].from = readpos(data + i * 10, data + i * 10 + 2); state->traps[i].to = readpos(data + i * 10 + 4, data + i * 10 + 6); } break; case 5: if (size % 8) warn("level %d: ignoring %d extra bytes at end of field 5", setup->number, size % 8); state->clonercount = size / 8; for (i = 0 ; i < state->clonercount ; ++i) { state->cloners[i].from = readpos(data + i * 8, data + i * 8 + 2); state->cloners[i].to = readpos(data + i * 8 + 4, data + i * 8 + 6); } break; case 6: /* passwd */ break; case 7: memcpy(state->hinttext, data, size); state->hinttext[size] = '\0'; break; case 8: /* field 8 passwd */ break; case 10: if (size % 2) warn("level %d: ignoring extra byte at end of field 10", setup->number); state->crlistcount = size / 2; for (i = 0 ; i < state->crlistcount ; ++i) state->crlist[i] = readpos(data + i * 2, data + i * 2 + 1); break; default: warn("level %d: ignoring unrecognized field %d (%d bytes)", setup->number, data[-2], size); break; } data += size; } return TRUE; badlevel: errmsg(NULL, "level %d: invalid data", setup->number); return FALSE; } /* Exported interface. */ int expandleveldata(gamestate *state) { return expandmsdatlevel(state); } /* Return the setup for a small level to display at the completion of * a series. */ void getenddisplaysetup(gamestate *state) { static unsigned char endingdata[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6D, 0x00, 0x15, 0x39, 0x39, 0x39, 0x15, 0x39, 0x39, 0x15, 0x39, 0xFF, 0x17, 0x00, 0x39, 0x39, 0x15, 0x15, 0x15, 0x39, 0x39, 0x15, 0x39, 0xFF, 0x17, 0x00, 0x39, 0x39, 0x15, 0x15, 0x15, 0xFF, 0x04, 0x39, 0xFF, 0x17, 0x00, 0x15, 0x39, 0x39, 0x39, 0x15, 0x39, 0x39, 0x15, 0x39, 0xFF, 0x17, 0x00, 0xFF, 0x04, 0x15, 0x6E, 0xFF, 0x04, 0x15, 0xFF, 0x17, 0x00, 0xFF, 0x04, 0x39, 0x15, 0x39, 0x39, 0x39, 0x15, 0xFF, 0x17, 0x00, 0x15, 0x39, 0x39, 0x15, 0x15, 0x39, 0x39, 0x15, 0x39, 0xFF, 0x17, 0x00, 0x15, 0x39, 0x39, 0x15, 0x15, 0x39, 0x39, 0x39, 0x15, 0xFF, 0x17, 0x00, 0xFF, 0x04, 0x39, 0x15, 0x39, 0x39, 0x15, 0x15, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xF9, 0x00, 0x10, 0x00, 0xFF, 0x84, 0x00, 0x15, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x7E, 0x00, 0x00, 0x00 }; static gamesetup ending; ending.number = 1; ending.time = 0; ending.besttime = TIME_NIL; ending.sgflags = 0; ending.levelsize = sizeof endingdata; ending.leveldata = endingdata; ending.solutionsize = 0; ending.solutiondata = NULL; strcpy(ending.name, "CONGRATULATIONS!"); ending.passwd[0] = '\0'; state->game = &ending; expandmsdatlevel(state); ending.number = 0; } tworld-1.3.0/encoding.h0000644000175000017500000000112010416444420015114 0ustar breadboxbreadbox/* encoding.h: Functions to read the level data. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _encoding_h_ #define _encoding_h_ #include "state.h" /* Initialize the gamestate by reading the level data from the setup. * FALSE is returned if the level data is invalid. */ extern int expandleveldata(gamestate *state); /* Return the setup for a small level, created at runtime, that can be * displayed at the completion of a series. */ extern void getenddisplaysetup(gamestate *state); #endif tworld-1.3.0/err.c0000644000175000017500000000217210362156001014114 0ustar breadboxbreadbox/* err.c: Error handling and reporting. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include "oshw.h" #include "err.h" /* "Hidden" arguments to _warn, _errmsg, and _die. */ char const *_err_cfile = NULL; unsigned long _err_lineno = 0; /* Log a warning message. */ void _warn(char const *fmt, ...) { va_list args; va_start(args, fmt); usermessage(NOTIFY_LOG, NULL, _err_cfile, _err_lineno, fmt, args); va_end(args); _err_cfile = NULL; _err_lineno = 0; } /* Display an error message to the user. */ void _errmsg(char const *prefix, char const *fmt, ...) { va_list args; va_start(args, fmt); usermessage(NOTIFY_ERR, prefix, _err_cfile, _err_lineno, fmt, args); va_end(args); _err_cfile = NULL; _err_lineno = 0; } /* Display an error message to the user and exit. */ void _die(char const *fmt, ...) { va_list args; va_start(args, fmt); usermessage(NOTIFY_DIE, NULL, _err_cfile, _err_lineno, fmt, args); va_end(args); exit(EXIT_FAILURE); } tworld-1.3.0/err.h0000644000175000017500000000177510362156006014136 0ustar breadboxbreadbox/* err.h: Error handling and reporting. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _err_h_ #define _err_h_ /* Simple macros for dealing with memory allocation simply. */ #define memerrexit() (die("out of memory")) #define xalloc(p, n) (((p) = realloc((p), (n))) || (memerrexit(), NULL)) /* Log an error message and continue. */ extern void _warn(char const *fmt, ...); /* Display an error message. */ extern void _errmsg(char const *prefix, char const *fmt, ...); /* Display an error message and abort. */ extern void _die(char const *fmt, ...); /* A really ugly hack used to smuggle extra arguments into variadic * functions. */ extern char const *_err_cfile; extern unsigned long _err_lineno; #define warn (_err_cfile = __FILE__, _err_lineno = __LINE__, _warn) #define errmsg (_err_cfile = __FILE__, _err_lineno = __LINE__, _errmsg) #define die (_err_cfile = __FILE__, _err_lineno = __LINE__, _die) #endif tworld-1.3.0/fileio.c0000644000175000017500000002512010377477336014620 0ustar breadboxbreadbox/* fileio.c: Simple file/directory access functions with error-handling. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include #include #include #include "err.h" #include "fileio.h" /* Determine the proper directory delimiter and mkdir() arguments. */ #ifdef WIN32 #define DIRSEP_CHAR '\\' #define createdir(name) (mkdir(name) == 0) #else #define DIRSEP_CHAR '/' #define createdir(name) (mkdir(name, 0755) == 0) #endif /* Determine a compile-time number to use as the maximum length of a * path. Use a value of 1023 if we can't get anything usable from the * header files. */ #include #if !defined(PATH_MAX) || PATH_MAX <= 0 # if defined(MAXPATHLEN) && MAXPATHLEN > 0 # define PATH_MAX MAXPATHLEN # else # include # if !defined(PATH_MAX) || PATH_MAX <= 0 # if defined(MAXPATHLEN) && MAXPATHLEN > 0 # define PATH_MAX MAXPATHLEN # else # define PATH_MAX 1023 # endif # endif # endif #endif /* The function used to display error messages relating to file I/O. */ int _fileerr(char const *cfile, unsigned long lineno, fileinfo *file, char const *msg) { if (msg) { _err_cfile = cfile; _err_lineno = lineno; _errmsg(file->name ? file->name : "file error", errno ? strerror(errno) : msg); } return FALSE; } /* * File-handling functions. */ /* Clear the fields of the fileinfo struct. */ void clearfileinfo(fileinfo *file) { file->name = NULL; file->fp = NULL; file->alloc = FALSE; } /* Open a file. If the fileinfo structure does not already have a * filename assigned to it, use name (after making an independent * copy). */ int fileopen(fileinfo *file, char const *name, char const *mode, char const *msg) { int n; if (!file->name) { n = strlen(name) + 1; if ((file->name = malloc(n))) { memcpy(file->name, name, n); file->alloc = TRUE; } else { file->name = (char*)name; file->alloc = FALSE; } } errno = 0; file->fp = fopen(name, mode); if (file->fp) return TRUE; return fileerr(file, msg); } /* Close the file, clear the file pointer, and free the name buffer if * necessary. */ void fileclose(fileinfo *file, char const *msg) { errno = 0; if (file->fp) { if (!fclose(file->fp)) fileerr(file, msg); file->fp = NULL; } if (file->alloc) { free(file->name); file->name = NULL; file->alloc = FALSE; } } /* fgetpos(). */ int filegetpos(fileinfo *file, fpos_t *pos, char const *msg) { errno = 0; if (!fgetpos(file->fp, pos)) return TRUE; return fileerr(file, msg); } /* fsetpos(). */ int filesetpos(fileinfo *file, fpos_t *pos, char const *msg) { errno = 0; if (!fsetpos(file->fp, pos)) return TRUE; return fileerr(file, msg); } /* rewind(). */ int filerewind(fileinfo *file, char const *msg) { (void)msg; rewind(file->fp); return TRUE; } /* fseek(). */ int fileskip(fileinfo *file, int offset, char const *msg) { errno = 0; if (!fseek(file->fp, offset, SEEK_CUR)) return TRUE; return fileerr(file, msg); } /* feof(). */ int filetestend(fileinfo *file) { int ch; if (feof(file->fp)) return TRUE; ch = fgetc(file->fp); if (ch == EOF) return TRUE; ungetc(ch, file->fp); return FALSE; } /* read(). */ int fileread(fileinfo *file, void *data, unsigned long size, char const *msg) { if (!size) return TRUE; errno = 0; if (fread(data, size, 1, file->fp) == 1) return TRUE; return fileerr(file, msg); } /* Read size bytes from the given file into a newly allocated buffer. */ void *filereadbuf(fileinfo *file, unsigned long size, char const *msg) { void *buf; if (!(buf = malloc(size))) { fileerr(file, msg); return NULL; } if (!size) return buf; errno = 0; if (fread(buf, size, 1, file->fp) != 1) { fileerr(file, msg); free(buf); return NULL; } return buf; } /* Read one full line from fp and store the first len characters, * including any trailing newline. */ int filegetline(fileinfo *file, char *buf, int *len, char const *msg) { int n, ch; if (!*len) { *buf = '\0'; return TRUE; } errno = 0; if (!fgets(buf, *len, file->fp)) return fileerr(file, msg); n = strlen(buf); if (n == *len - 1 && buf[n] != '\n') { do ch = fgetc(file->fp); while (ch != EOF && ch != '\n'); } else buf[n--] = '\0'; *len = n; return TRUE; } /* write(). */ int filewrite(fileinfo *file, void const *data, unsigned long size, char const *msg) { if (!size) return TRUE; errno = 0; if (fwrite(data, size, 1, file->fp) == 1) return TRUE; return fileerr(file, msg); } /* Read one byte as an unsigned integer value. */ int filereadint8(fileinfo *file, unsigned char *val8, char const *msg) { int byte; errno = 0; if ((byte = fgetc(file->fp)) == EOF) return fileerr(file, msg); *val8 = (unsigned char)byte; return TRUE; } /* Write one byte as an unsigned integer value. */ int filewriteint8(fileinfo *file, unsigned char val8, char const *msg) { errno = 0; if (fputc(val8, file->fp) != EOF) return TRUE; return fileerr(file, msg); } /* Read two bytes as an unsigned integer value stored in little-endian. */ int filereadint16(fileinfo *file, unsigned short *val16, char const *msg) { int byte; errno = 0; if ((byte = fgetc(file->fp)) != EOF) { *val16 = (unsigned char)byte; if ((byte = fgetc(file->fp)) != EOF) { *val16 |= (unsigned char)byte << 8; return TRUE; } } return fileerr(file, msg); } /* Write two bytes as an unsigned integer value in little-endian. */ int filewriteint16(fileinfo *file, unsigned short val16, char const *msg) { errno = 0; if (fputc(val16 & 0xFF, file->fp) != EOF && fputc((val16 >> 8) & 0xFF, file->fp) != EOF) return TRUE; return fileerr(file, msg); } /* Read four bytes as an unsigned integer value stored in little-endian. */ int filereadint32(fileinfo *file, unsigned long *val32, char const *msg) { int byte; errno = 0; if ((byte = fgetc(file->fp)) != EOF) { *val32 = (unsigned char)byte; if ((byte = fgetc(file->fp)) != EOF) { *val32 |= (unsigned char)byte << 8; if ((byte = fgetc(file->fp)) != EOF) { *val32 |= (unsigned char)byte << 16; if ((byte = fgetc(file->fp)) != EOF) { *val32 |= (unsigned char)byte << 24; return TRUE; } } } } return fileerr(file, msg); } /* Write four bytes as an unsigned integer value in little-endian. */ int filewriteint32(fileinfo *file, unsigned long val32, char const *msg) { errno = 0; if (fputc(val32 & 0xFF, file->fp) != EOF && fputc((val32 >> 8) & 0xFF, file->fp) != EOF && fputc((val32 >> 16) & 0xFF, file->fp) != EOF && fputc((val32 >> 24) & 0xFF, file->fp) != EOF) return TRUE; return fileerr(file, msg); } /* * Directory-handling functions. */ /* Return the size of a buffer big enough to hold a pathname. */ int getpathbufferlen(void) { return PATH_MAX; } /* Return a buffer big enough to hold a pathname. */ char *getpathbuffer(void) { char *buf; if (!(buf = malloc(PATH_MAX + 1))) memerrexit(); return buf; } /* Return TRUE if name contains a path but is not a directory itself. */ int haspathname(char const *name) { struct stat st; if (!strchr(name, DIRSEP_CHAR)) return FALSE; if (stat(name, &st) || S_ISDIR(st.st_mode)) return FALSE; return TRUE; } /* Return a pointer to the filename, skipping over any directories in * the front. */ char *skippathname(char const *name) { char const *p; p = strrchr(name, DIRSEP_CHAR); return (char*)(p ? p + 1 : name); } /* Append the path and/or file contained in path to dir. If path is * an absolute path, the contents of dir are ignored. */ int combinepath(char *dest, char const *dir, char const *path) { int m, n; if (path[0] == DIRSEP_CHAR) { n = strlen(path); if (n > PATH_MAX) { errno = ENAMETOOLONG; return FALSE; } strcpy(dest, path); return TRUE; } n = strlen(dir); if (n >= PATH_MAX) { errno = ENAMETOOLONG; return FALSE; } if (dest != dir) memcpy(dest, dir, n); if (dest[n - 1] != DIRSEP_CHAR) dest[n++] = DIRSEP_CHAR; m = strlen(path); if (m + n + 1 > PATH_MAX) { errno = ENAMETOOLONG; return FALSE; } memcpy(dest + n, path, m + 1); return TRUE; } /* Create the directory dir if it doesn't already exist. */ int finddir(char const *dir) { struct stat st; return stat(dir, &st) ? createdir(dir) : S_ISDIR(st.st_mode); } /* Return the pathname for a directory and/or filename, using the * same algorithm to construct the path as openfileindir(). */ char *getpathforfileindir(char const *dir, char const *filename) { char *path; int m, n; m = strlen(filename); if (!dir || !*dir || strchr(filename, DIRSEP_CHAR)) { if (m > PATH_MAX) { errno = ENAMETOOLONG; return NULL; } path = getpathbuffer(); strcpy(path, filename); } else { n = strlen(dir); if (m + n + 1 > PATH_MAX) { errno = ENAMETOOLONG; return NULL; } path = getpathbuffer(); memcpy(path, dir, n); path[n++] = DIRSEP_CHAR; memcpy(path + n, filename, m + 1); } return path; } /* Open a file, using dir as the directory if filename is not a path. */ int openfileindir(fileinfo *file, char const *dir, char const *filename, char const *mode, char const *msg) { char buf[PATH_MAX + 1]; int m, n; if (!dir || !*dir || strchr(filename, DIRSEP_CHAR)) return fileopen(file, filename, mode, msg); n = strlen(dir); m = strlen(filename); if (m + n + 1 > PATH_MAX) { errno = ENAMETOOLONG; return fileerr(file, NULL); } memcpy(buf, dir, n); buf[n++] = DIRSEP_CHAR; memcpy(buf + n, filename, m + 1); return fileopen(file, buf, mode, msg); } /* Read the given directory and call filecallback once for each file * contained in it. */ int findfiles(char const *dir, void *data, int (*filecallback)(char*, void*)) { char *filename = NULL; DIR *dp; struct dirent *dent; int r; if (!(dp = opendir(dir))) { fileinfo tmp; tmp.name = (char*)dir; return fileerr(&tmp, "couldn't access directory"); } while ((dent = readdir(dp))) { if (dent->d_name[0] == '.') continue; xalloc(filename, strlen(dent->d_name) + 1); strcpy(filename, dent->d_name); r = (*filecallback)(filename, data); if (r < 0) break; else if (r > 0) filename = NULL; } if (filename) free(filename); closedir(dp); return TRUE; } tworld-1.3.0/fileio.h0000644000175000017500000001314210377472317014620 0ustar breadboxbreadbox/* fileio.h: Simple file/directory access functions with error-handling. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _fileio_h_ #define _fileio_h_ #include "defs.h" /* Reset a fileinfo structure to indicate no file. */ extern void clearfileinfo(fileinfo *file); /* Open a file. If the fileinfo structure does not already have a * filename assigned to it, name will be used as the filename. If msg * is NULL, no error will be displayed if the file cannot be opened. * If msg points to a string, an error will be displayed. The text of * msg will be used only if errno is zero; otherwise a message * appropriate to the error will be used. */ extern int fileopen(fileinfo *file, char const *name, char const *mode, char const *msg); /* The following functions correspond directly to C's standard I/O * functions. The extra msg parameter works as described above for * fileopen(). */ extern int filerewind(fileinfo *file, char const *msg); extern int filegetpos(fileinfo *file, fpos_t *pos, char const *msg); extern int filesetpos(fileinfo *file, fpos_t *pos, char const *msg); extern int fileread(fileinfo *file, void *data, unsigned long size, char const *msg); extern int filewrite(fileinfo *file, void const *data, unsigned long size, char const *msg); extern void fileclose(fileinfo *file, char const *msg); /* fileskip() works like fseek() with whence set to SEEK_CUR. */ extern int fileskip(fileinfo *file, int offset, char const *msg); /* filetestend() forces a check for EOF by attempting to read a byte * from the file, and ungetting the byte if one is successfully read. */ extern int filetestend(fileinfo *file); /* The following functions read and write an unsigned integer value * from the current position in the given file. For the multi-byte * values, the value is assumed to be stored in little-endian. */ extern int filereadint8(fileinfo *file, unsigned char *val8, char const *msg); extern int filewriteint8(fileinfo *file, unsigned char val8, char const *msg); extern int filereadint16(fileinfo *file, unsigned short *val16, char const *msg); extern int filewriteint16(fileinfo *file, unsigned short val16, char const *msg); extern int filereadint32(fileinfo *file, unsigned long *val32, char const *msg); extern int filewriteint32(fileinfo *file, unsigned long val32, char const *msg); /* Read size bytes from the given file and return the bytes in a * newly allocated buffer. */ extern void *filereadbuf(fileinfo *file, unsigned long size, char const *msg); /* Read one full line from fp and store the first len characters, * including any trailing newline. len receives the length of the line * stored in buf, minus any trailing newline, upon return. */ extern int filegetline(fileinfo *file, char *buf, int *len, char const *msg); /* Read a config-style line from a file, looking for the pattern * "name=value". FALSE is returned if the end of the file is found * first. */ extern int filegetconfigline(fileinfo *file, char **name, char **value, char const *msg); /* Return the maximum size of a legal pathname. */ extern int getpathbufferlen(void); /* Return an allocated buffer big enough to hold any legal pathname. */ extern char *getpathbuffer(void); /* Return TRUE if name contains a path but is not a directory itself. */ extern int haspathname(char const *name); /* Return a pointer to the filename, skipping over any directories in * the front. */ extern char *skippathname(char const *name); /* Append the path and/or file contained in path to dir, storing the * result in dest. dest and dir can point to the same buffer. dest is * assumed to be a buffer of size getpathbufferlen(). If the resulting * path is longer than this, FALSE is returned and errno is set to * ENAMETOOLONG. */ extern int combinepath(char *dest, char const *dir, char const *path); /* Return the pathname for a directory and/or filename, using the same * algorithm to construct the path as openfileindir(). The caller must * free the returned buffer. */ extern char *getpathforfileindir(char const *dir, char const *filename); /* Verify that the given directory exists, or create it if it doesn't. */ extern int finddir(char const *dir); /* Open a file, using dir as the directory if filename is not already * a complete pathname. FALSE is returned if the directory could not * be created. */ extern int openfileindir(fileinfo *file, char const *dir, char const *filename, char const *mode, char const *msg); /* Call filecallback once for every file in dir. The first argument to * the callback function is an allocated buffer containing the * filename. data is passed as the second argument to the callback. If * the callback's return value is zero, the buffer is deallocated * normally; if the return value is positive, the callback function * inherits the buffer and the responsibility of freeing it. If the * return value is negative, findfiles() stops scanning the directory * and returns. FALSE is returned if the directory could not be * examined. */ extern int findfiles(char const *dir, void *data, int (*filecallback)(char*, void*)); /* Display a simple error message prefixed by the name of the given * file. If errno is set, a message appropriate to the value is used; * otherwise the text pointed to by msg is used. If msg is NULL, the * function does nothing. The return value is always FALSE. */ extern int _fileerr(char const *cfile, unsigned long lineno, fileinfo *file, char const *msg); #define fileerr(file, msg) (_fileerr(__FILE__, __LINE__, (file), (msg))) #endif tworld-1.3.0/gen.h0000644000175000017500000000412410416667244014121 0ustar breadboxbreadbox/* gen.h: General definitions belonging to no single module. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _gen_h_ #define _gen_h_ /* The standard Boolean values. */ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* Definition of the contents and layout of a table. * * The strings making up the contents of a table are each prefixed * with two characters that indicate the formatting of their cell. The * first character is a digit, usually "1", indicating the number of * columns that cell occupies. The second character indicates the * placement of the string in that cell: "-" to align to the left of * the cell, "+" to align to the right, "." to center the text, and * "!" to permit the cell to occupy multiple lines, with word * wrapping. At most one cell in a given row can be word-wrapped. */ typedef struct tablespec { short rows; /* number of rows */ short cols; /* number of columns */ short sep; /* amount of space between columns */ short collapse; /* the column to squeeze if necessary */ char **items; /* the table's contents */ } tablespec; /* The dimensions of a level. */ #define CXGRID 32 #define CYGRID 32 /* The four directions plus one non-direction. */ #define NIL 0 #define NORTH 1 #define WEST 2 #define SOUTH 4 #define EAST 8 /* Translating directions to and from a two-bit representation. (Note * that NIL will map to the same value as NORTH.) */ #define diridx(dir) ((0x30210 >> ((dir) * 2)) & 3) #define idxdir(idx) (1 << ((idx) & 3)) /* The frequency of the gameplay timer. Note that "seconds" refers to * seconds in the game, which are not necessarily the same length as * real-time seconds. */ #define TICKS_PER_SECOND 20 /* The gameplay timer's value is forced to remain within 23 bits. * Thus, gameplay of a single level cannot exceed 4 days 20 hours 30 * minutes and 30.4 seconds. */ #define MAXIMUM_TICK_COUNT 0x7FFFFF /* A magic number used to indicate an undefined time value. */ #define TIME_NIL 0x7FFFFFFF #endif tworld-1.3.0/help.c0000644000175000017500000002730310420602146014260 0ustar breadboxbreadbox/* help.c: Displaying online help. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include "defs.h" #include "err.h" #include "state.h" #include "oshw.h" #include "ver.h" #include "comptime.h" #include "help.h" #define array(a) a, (sizeof a / sizeof *a) /* Help for command-line options. */ static char *yowzitch_items[] = { "1-Usage:", "1!tworld [-hvVdlsbtpqrPFa] [-n N] [-DLRS DIR] " "[NAME] [SNAME] [LEVEL]", "1- -D", "1!Read data files from DIR instead of the default.", "1- -L", "1!Read level sets from DIR instead of the default.", "1- -R", "1!Read resource files from DIR instead of the default.", "1- -S", "1!Save games in DIR instead of the default.", "1- -p", "1!Disable password checking.", "1- -F", "1!Run in fullscreen mode.", "1- -q", "1!Run quietly.", "1- -r", "1!Run in read-only mode; solutions will not be saved.", "1- -P", "1!Put Lynx ruleset emulation in pedantic mode.", "1- -n", "1!Set initial volume level to N.", "1- -a", "1!Double the size of the sound buffer (can be repeated).", "1- -l", "1!Display the list of available data files and exit.", "1- -s", "1!Display scores for the selected data file and exit.", "1- -t", "1!Display times for the selected data file and exit.", "1- -b", "1!Batch-verify solutions for the selected data file and exit.", "1- -h", "1!Display this help and exit.", "1- -d", "1!Display default directories and exit.", "1- -v", "1!Display version number and exit.", "1- -V", "1!Display version and license information and exit.", "2!NAME specifies which data file to use.", "2!LEVEL specifies which level to start at.", "2!SNAME specifies an alternate solution file." }; static tablespec const yowzitch_table = { 23, 2, 2, -1, yowzitch_items }; tablespec const *yowzitch = &yowzitch_table; /* Version and license information. */ static char *vourzhon_items[] = { "1+\267", "1-Tile World: version " VERSION, "1+", "1-Copyright \251 2001-2006 by Brian Raiter", "1+", "1-compiled " COMPILE_TIME, "1+\267", "1!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 2 of" " the License, or (at your option) any later version.", "1+\267", "1!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.", "1+\267", "1!Bug reports are appreciated, and can be sent to" " breadbox@muppetlabs.com." }; static tablespec const vourzhon_table = { 6, 2, 1, -1, vourzhon_items }; tablespec const *vourzhon = &vourzhon_table; /* Descriptions of the different surfaces of the levels. */ static tiletablerow const help_floors[] = { { TRUE, Fire, 0, "Fire is fatal unless Chip has fire boots." }, { TRUE, Water, 0, "Chip drowns in Water without water boots." }, { TRUE, Ice, 0, "Chip slides across Ice without ice boots." }, { TRUE, Slide_East, 0, "Force floors push Chip along unless he has the force boots." }, { TRUE, Gravel, 0, "Gravel is safe to walk on, and no one but Chip can touch it." }, { TRUE, Dirt, 0, "Chip is also the only one that can walk on Dirt, but it" " turns into a normal floor when he steps on it." } }; /* Descriptions of the various kinds of wall-like obstacles. */ static tiletablerow const help_walls[] = { { TRUE, Wall_North, Wall, "Walls can either take up an entire square," " or just cut off one direction." }, { TRUE, BlueWall_Fake, 0, "Blue Walls can either be real walls, or just mirages. They show" " their true nature when Chip tries to walk through them." }, { TRUE, PopupWall, 0, "Popup Walls spring up when Chip walks across them, blocking retreat." }, { TRUE, Door_Green, Door_Red, "Doors can be opened if Chip has a matching key." } }; /* Descriptions of various objects to be found. */ static tiletablerow const help_objects[] = { { TRUE, Bomb, 0, "A Bomb is always fatal to whatever steps on it." }, { TRUE, CloneMachine, Button_Red, "Clone Machines produce duplicates of whatever is shown atop them" " at the touch of a Red Button." }, { TRUE, Beartrap, Button_Brown, "A Bear Trap holds fast whatever steps on it. A Brown Button" " resets the trap and permits escape." }, { TRUE, Teleport, 0, "A Teleport instantly transports you to another teleport." }, { TRUE, SwitchWall_Open, Button_Green, "Toggle Walls come and go when any Green Button is pressed." }, { TRUE, Button_Blue, 0, "A Blue Button causes tanks to turn around." }, { TRUE, HintButton, 0, "The Hint Button provides a brief suggestion on how to proceed." }, { TRUE, Burglar, 0, "The Thief takes back all your special footgear." } }; /* Descriptions of things that Chip can use. */ static tiletablerow const help_tools[] = { { TRUE, ICChip, 0, "IC Chips are what Chip needs to collect in order to pass through" " the socket." }, { TRUE, Key_Green, Key_Yellow, "Keys permit Chip to open doors of the matching color." }, { TRUE, Boots_Water, Boots_Fire, "Boots allow Chip to get past fire and water, and to traverse" " ice and force floors as if they were normal floors." }, { TRUE, Block_Static, 0, "Blocks are obstacles, but they can be pushed around. When pushed into" " water, the water square turns into dirt." }, { TRUE, Socket, 0, "The Socket can only be passed when Chip has acquired" " the necessary number of IC chips." }, { TRUE, Exit, 0, "The Exit takes Chip out. Finding and reaching the Exit" " is the main goal of every level." } }; /* Descriptions of the roaming creatures. */ static tiletablerow const help_monsters[] = { { FALSE, Tank, 0, "Tanks only move in one direction, until a blue button" " makes them turn around." }, { FALSE, Ball, 0, "Balls bounce back and forth in a straight line." }, { FALSE, Glider, 0, "Gliders fly straight until they hit an obstacle," " whereupon they turn left." }, { FALSE, Fireball, 0, "Fireballs turn to the right upon hitting an obstacle." }, { FALSE, Walker, 0, "Walkers turn in a random direction when stopped." }, { FALSE, Bug, 0, "Bugs march around things, keeping the wall to their left-hand side." }, { FALSE, Paramecium, 0, "Paramecia move along with the wall on their right-hand side." }, { FALSE, Blob, 0, "Blobs move about completely at random, albeit slowly." }, { FALSE, Teeth, 0, "Finally, Teeth home in on you; like Blobs, they can be outrun." } }; /* Wrapper function for displaying illustrated help and then waiting * for a key command. */ static int helptilescreen(char const *title, tiletablerow const *table, int count, int completed) { displaytiletable(title, table, count, completed); return anykey(); } /* Display the illustrated help sequence for the game. */ int gameplayhelp(void) { int ret; ret = helptilescreen("FLOORS", array(help_floors), +1) && helptilescreen("WALLS", array(help_walls), +1) && helptilescreen("OBJECTS", array(help_objects), +1) && helptilescreen("TOOLS", array(help_tools), +1) && helptilescreen("MONSTERS", array(help_monsters), 0); cleardisplay(); return ret; } /* An input callback used while displaying the list of help topics. */ static int scrollinputcallback(int *move) { switch (input(TRUE)) { case CmdPrev10: *move = SCROLL_ALLTHEWAY_UP; break; case CmdNorth: *move = SCROLL_UP; break; case CmdPrev: *move = SCROLL_UP; break; case CmdPrevLevel: *move = SCROLL_UP; break; case CmdSouth: *move = SCROLL_DN; break; case CmdNext: *move = SCROLL_DN; break; case CmdNextLevel: *move = SCROLL_DN; break; case CmdNext10: *move = SCROLL_ALLTHEWAY_DN; break; case CmdProceed: *move = TRUE; return FALSE; case CmdQuitLevel: *move = FALSE; return FALSE; case CmdQuit: exit(0); } return TRUE; } /* Display the list of help topics and allow the user to select which * ones to view. */ void onlinemainhelp(int topic) { static char *items[] = { "2-", "1+\267", "1-Key commands during the game", "1+\267", "1-Key commands inbetween games", "1+\267", "1-Objects of the game", "1+\267", "1-Command-line options", "1+\267", "1-About Tile World", "1+\267", "1-Return to the program" }; static tablespec const table = { 7, 2, 4, 1, items }; int n; switch (topic) { case Help_KeysDuringGame: n = 0; break; case Help_KeysBetweenGames: n = 1; break; case Help_ObjectsOfGame: n = 2; break; case Help_CmdlineOptions: n = 3; break; case Help_AboutGame: n = 4; break; default: n = 5; break; } while (displaylist("HELP", &table, &n, scrollinputcallback)) { if (n == 5) break; switch (n) { case 0: displaytable("KEYS - DURING THE GAME", keyboardhelp(KEYHELP_INGAME), -1); anykey(); break; case 1: displaytable("KEYS - INBETWEEN GAMES", keyboardhelp(KEYHELP_TWIXTGAMES), -1); anykey(); break; case 2: (void)(helptilescreen("FLOORS", array(help_floors), +1) && helptilescreen("WALLS", array(help_walls), +1) && helptilescreen("OBJECTS", array(help_objects), +1) && helptilescreen("TOOLS", array(help_tools), +1) && helptilescreen("MONSTERS", array(help_monsters), 0)); break; case 3: displaytable("COMMAND-LINE OPTIONS", &yowzitch_table, -1); anykey(); break; case 4: displaytable("ABOUT TILE WORLD", &vourzhon_table, -1); anykey(); break; } } cleardisplay(); } /* Display a single online help screen for the given topic. */ void onlinecontexthelp(int topic) { static char *firsthelp_items[] = { "1!Welcome to Tile World!", "1-", "1!In order to begin, you must first decide which level set you" " wish to play. The opening screen shows you the list of all the" " level sets that are currently available. Use the up and down" " arrows to move the selection. When the level set of your choice" " is selected, press Enter to begin.", "1-", "1!If the list is long, you may also use the PgUp and PgDn keys to" " scroll one windowful at a time.", "1-", "1!At any point in the program, you may use the Q key to quit the" " current activity and go back up one step. Typing Shift-Q will" " exit Tile World completely. Typing ? or F1 at any time will bring" " up a list of online help topics.", "1-", "1!Tile World also comes with offline documentation. Please see the" " tworld.html file included for more help on playing the game and" " using this program.", "1-", "1!Now, press any key to go back to the list of level sets." }; static tablespec const firsthelp_table = { 9, 1, 0, 1, firsthelp_items }; switch (topic) { case Help_First: displaytable("HELP", &firsthelp_table, -1); break; case Help_KeysDuringGame: displaytable("KEYS - DURING THE GAME", keyboardhelp(KEYHELP_INGAME), -1); break; case Help_KeysBetweenGames: displaytable("KEYS - INBETWEEN GAMES", keyboardhelp(KEYHELP_TWIXTGAMES), -1); break; case Help_FileListKeys: displaytable("KEYS - FILE LIST", keyboardhelp(KEYHELP_FILELIST), -1); break; case Help_ScoreListKeys: displaytable("KEYS - SCORE LIST", keyboardhelp(KEYHELP_SCORELIST), -1); break; } anykey(); cleardisplay(); } tworld-1.3.0/help.h0000644000175000017500000000153210417636230014270 0ustar breadboxbreadbox/* help.h: Displaying online help screens. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _help_h_ #define _help_h_ /* The available help topics. */ enum { Help_None = 0, Help_First, Help_KeysDuringGame, Help_KeysBetweenGames, Help_FileListKeys, Help_ScoreListKeys, Help_ObjectsOfGame, Help_CmdlineOptions, Help_AboutGame }; /* Help for the command-line options. */ extern tablespec const *yowzitch; /* Version and license information. */ extern tablespec const *vourzhon; /* Display online help screens for the game, using the given topic as * the default topic. */ extern void onlinemainhelp(int topic); /* Display a single online help screen for the given topic. */ extern void onlinecontexthelp(int topic); #endif tworld-1.3.0/lxlogic.c0000644000175000017500000014710710417716214015006 0ustar breadboxbreadbox/* lxlogic.c: The game logic for the Lynx ruleset. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include "defs.h" #include "err.h" #include "state.h" #include "random.h" #include "logic.h" /* A number well above the maximum number of creatures that could possibly * exist simultaneously. */ #define MAX_CREATURES (2 * CXGRID * CYGRID) /* The maximum number of creatures on the original Atari Lynx version. */ #define PMAX_CREATURES 128 /* Temporary "holding" values used in place of a direction. */ #define WALKER_TURN (NORTH | SOUTH | EAST) #define BLOB_TURN (NORTH | SOUTH | WEST) /* TRUE if dir is a diagonal move. */ #define isdiagonal(dir) (((dir) & (NORTH | SOUTH)) && ((dir) & (EAST | WEST))) /* My internal assertion macro. */ #ifdef NDEBUG #define _assert(test) ((void)0) #else #define _assert(test) ((test) || (die("internal error: failed sanity check" \ " (%s)\nPlease report this error to" \ " breadbox@muppetlabs.com", #test), 0)) #endif /* A list of ways for Chip to lose. */ enum { CHIP_OKAY = 0, CHIP_DROWNED, CHIP_BURNED, CHIP_BOMBED, CHIP_OUTOFTIME, CHIP_COLLIDED, CHIP_NOTOKAY }; /* Status information specific to the Lynx game logic. */ struct lxstate { creature *chiptocr; /* is Chip colliding with a creature */ creature *crend; /* near the end of the creature list */ short chiptopos; /* just starting to move itself? */ unsigned char prng1; /* the values used to make the */ unsigned char prng2; /* pseudorandom number sequence */ signed char xviewoffset; /* offset of map view center */ signed char yviewoffset; /* position from position of Chip */ unsigned char endgametimer; /* end-game countdown timer */ unsigned char togglestate; /* extra state of the toggle walls */ unsigned char completed; /* level completed successfully */ unsigned char stuck; /* Chip is stuck on a teleport */ unsigned char pushing; /* Chip is pushing against something */ unsigned char couldntmove; /* can't-move sound has been played */ unsigned char mapbreached; /* Border of map has been breached */ }; /* Pedantic mode flag. (Having this variable defined here is a hack, * but this is the only module that actually uses it.) */ int pedanticmode = FALSE; /* Declarations of (indirectly recursive) functions. */ static int canmakemove(creature const *cr, int dir, int flags); static int advancecreature(creature *cr, int releasing); /* Used to calculate movement offsets. */ static int const delta[] = { 0, -CXGRID, -1, 0, +CXGRID, 0, 0, 0, +1 }; /* The direction used the last time something stepped onto a random * slide floor. */ static int lastrndslidedir = NORTH; /* The most recently used stepping phase value. */ static int laststepping = 0; /* The memory used to hold the list of creatures. */ static creature *creaturearray = NULL; /* A pointer to the game state, used so that it doesn't have to be * passed to every single function. */ static gamestate *state; /* * Accessor macros for various fields in the game state. Many of the * macros can be used as an lvalue. */ #define setstate(p) (state = (p)->state) #define creaturelist() (state->creatures) #define getchip() (creaturelist()) #define chippos() (getchip()->pos) #define chipisalive() (getchip()->id == Chip) #define mainprng() (&state->mainprng) #define timelimit() (state->timelimit) #define timeoffset() (state->timeoffset) #define currenttime() (state->currenttime) #define currentinput() (state->currentinput) #define lastmove() (state->lastmove) #define stepping() (state->stepping) #define rndslidedir() (state->initrndslidedir) #define xviewpos() (state->xviewpos) #define yviewpos() (state->yviewpos) #define setnosaving() (state->statusflags |= SF_NOSAVING) #define showhint() (state->statusflags |= SF_SHOWHINT) #define hidehint() (state->statusflags &= ~SF_SHOWHINT) #define markinvalid() (state->statusflags |= SF_INVALID) #define ismarkedinvalid() (state->statusflags & SF_INVALID) #define chipsneeded() (state->chipsneeded) #define clonerlist() (state->cloners) #define clonerlistsize() (state->clonercount) #define traplist() (state->traps) #define traplistsize() (state->trapcount) #define getlxstate() ((struct lxstate*)state->localstateinfo) #define completed() (getlxstate()->completed) #define togglestate() (getlxstate()->togglestate) #define couldntmove() (getlxstate()->couldntmove) #define chippushing() (getlxstate()->pushing) #define chipstuck() (getlxstate()->stuck) #define mapbreached() (getlxstate()->mapbreached) #define chiptopos() (getlxstate()->chiptopos) #define chiptocr() (getlxstate()->chiptocr) #define prngvalue1() (getlxstate()->prng1) #define prngvalue2() (getlxstate()->prng2) #define xviewoffset() (getlxstate()->xviewoffset) #define yviewoffset() (getlxstate()->yviewoffset) #define creaturelistend() (getlxstate()->crend) #define inendgame() (getlxstate()->endgametimer) #define startendgametimer() (getlxstate()->endgametimer = 12 + 1) #define decrendgametimer() (--getlxstate()->endgametimer) #define resetendgametimer() (getlxstate()->endgametimer = 0) #define addsoundeffect(sfx) (state->soundeffects |= 1 << (sfx)) #define stopsoundeffect(sfx) (state->soundeffects &= ~(1 << (sfx))) #define floorat(pos) (state->map[pos].top.id) #define possession(obj) (*_possession(obj)) static short *_possession(int obj) { switch (obj) { case Key_Red: return &state->keys[0]; case Key_Blue: return &state->keys[1]; case Key_Yellow: return &state->keys[2]; case Key_Green: return &state->keys[3]; case Boots_Ice: return &state->boots[0]; case Boots_Slide: return &state->boots[1]; case Boots_Fire: return &state->boots[2]; case Boots_Water: return &state->boots[3]; case Door_Red: return &state->keys[0]; case Door_Blue: return &state->keys[1]; case Door_Yellow: return &state->keys[2]; case Door_Green: return &state->keys[3]; case Ice: return &state->boots[0]; case IceWall_Northwest: return &state->boots[0]; case IceWall_Northeast: return &state->boots[0]; case IceWall_Southwest: return &state->boots[0]; case IceWall_Southeast: return &state->boots[0]; case Slide_North: return &state->boots[1]; case Slide_West: return &state->boots[1]; case Slide_South: return &state->boots[1]; case Slide_East: return &state->boots[1]; case Slide_Random: return &state->boots[1]; case Fire: return &state->boots[2]; case Water: return &state->boots[3]; } warn("Invalid object %d handed to possession()\n", obj); _assert(!"possession() called with an invalid object"); return NULL; } /* The pseudorandom number generator, used by walkers and blobs. This * exactly matches the PRNG used in the original Lynx game. */ static unsigned char lynx_prng(void) { unsigned char n; n = (prngvalue1() >> 2) - prngvalue1(); if (!(prngvalue1() & 0x02)) --n; prngvalue1() = (prngvalue1() >> 1) | (prngvalue2() & 0x80); prngvalue2() = (prngvalue2() << 1) | (n & 0x01); return (prngvalue1() ^ prngvalue2()) & 0xFF; } /* * Simple floor functions. */ /* Floor state flags. */ #define FS_CLAIMED 0x40 /* spot is claimed by a creature */ #define FS_ANIMATED 0x20 /* spot is playing an animation */ /* Accessor macros for the floor states. */ #define claimlocation(pos) (state->map[pos].top.state |= FS_CLAIMED) #define removeclaim(pos) (state->map[pos].top.state &= ~FS_CLAIMED) #define islocationclaimed(pos) (state->map[pos].top.state & FS_CLAIMED) #define markanimated(pos) (state->map[pos].top.state |= FS_ANIMATED) #define clearanimated(pos) (state->map[pos].top.state &= ~FS_ANIMATED) #define ismarkedanimated(pos) (state->map[pos].top.state & FS_ANIMATED) /* Translate a slide floor into the direction it points in. In the * case of a random slide floor, if advance is TRUE a new direction * shall be selected; otherwise the current direction is used. */ static int getslidedir(int floor, int advance) { switch (floor) { case Slide_North: return NORTH; case Slide_West: return WEST; case Slide_South: return SOUTH; case Slide_East: return EAST; case Slide_Random: if (advance) lastrndslidedir = right(lastrndslidedir); return lastrndslidedir; } warn("Invalid floor %d handed to getslidedir()\n", floor); _assert(!"getslidedir() called with an invalid object"); return NIL; } /* Alter a creature's direction if they are at an ice wall. */ static void applyicewallturn(creature *cr) { int floor, dir; floor = floorat(cr->pos); dir = cr->dir; switch (floor) { case IceWall_Northeast: dir = dir == SOUTH ? EAST : dir == WEST ? NORTH : dir; break; case IceWall_Southwest: dir = dir == NORTH ? WEST : dir == EAST ? SOUTH : dir; break; case IceWall_Northwest: dir = dir == SOUTH ? WEST : dir == EAST ? NORTH : dir; break; case IceWall_Southeast: dir = dir == NORTH ? EAST : dir == WEST ? SOUTH : dir; break; } cr->dir = dir; } /* Find the location of a beartrap from one of its buttons. */ static int trapfrombutton(int pos) { xyconn *xy; int i; if (pedanticmode) { i = pos; for (;;) { ++i; if (i == CXGRID * CYGRID) i = 0; if (i == pos) break; if (floorat(i) == Beartrap) return i; } } else { for (xy = traplist(), i = traplistsize() ; i ; ++xy, --i) if (xy->from == pos) return xy->to; } return -1; } /* Find the location of a clone machine from one of its buttons. */ static int clonerfrombutton(int pos) { xyconn *xy; int i; if (pedanticmode) { i = pos; for (;;) { ++i; if (i == CXGRID * CYGRID) i = 0; if (i == pos) break; if (floorat(i) == CloneMachine) return i; } } else { for (xy = clonerlist(), i = clonerlistsize() ; i ; ++xy, --i) if (xy->from == pos) return xy->to; } return -1; } /* Quell any continuous sound effects coming from what Chip is * standing on. If includepushing is TRUE, also quell the sound of any * blocks being pushed. */ static void resetfloorsounds(int includepushing) { stopsoundeffect(SND_SKATING_FORWARD); stopsoundeffect(SND_SKATING_TURN); stopsoundeffect(SND_FIREWALKING); stopsoundeffect(SND_WATERWALKING); stopsoundeffect(SND_ICEWALKING); stopsoundeffect(SND_SLIDEWALKING); stopsoundeffect(SND_SLIDING); if (includepushing) stopsoundeffect(SND_BLOCK_MOVING); } /* * Functions that manage the list of entities. */ /* Creature state flags. */ #define CS_FDIRMASK 0x0F /* temp storage for forced moves */ #define CS_SLIDETOKEN 0x10 /* can move off of a slide floor */ #define CS_REVERSE 0x20 /* needs to turn around */ #define CS_PUSHED 0x40 /* block was pushed by Chip */ #define CS_TELEPORTED 0x80 /* creature was just teleported */ #define getfdir(cr) ((cr)->state & CS_FDIRMASK) #define setfdir(cr, d) ((cr)->state = ((cr)->state & ~CS_FDIRMASK) \ | ((d) & CS_FDIRMASK)) /* Return the creature located at pos. Ignores Chip unless includechip * is TRUE. (This is important in the case when Chip and a second * creature are currently occupying a single location.) */ static creature *lookupcreature(int pos, int includechip) { creature *cr; cr = creaturelist(); if (!includechip) ++cr; for ( ; cr->id ; ++cr) if (cr->pos == pos && !cr->hidden && !isanimation(cr->id)) return cr; return NULL; } /* Return a fresh creature. */ static creature *newcreature(void) { creature *cr; for (cr = creaturelist() + 1 ; cr->id ; ++cr) { if (cr->hidden) return cr; } if (cr - creaturelist() >= MAX_CREATURES) { warn("Ran out of room in the creatures array!"); return NULL; } if (pedanticmode && cr - creaturelist() >= PMAX_CREATURES) return NULL; cr->hidden = TRUE; cr[1].id = Nothing; creaturelistend() = cr; return cr; } /* Flag all tanks to turn around. */ static void turntanks(void) { creature *cr; for (cr = creaturelist() ; cr->id ; ++cr) { if (cr->hidden) continue; if (cr->id != Tank) continue; if (floorat(cr->pos) == CloneMachine || isice(floorat(cr->pos))) continue; cr->state ^= CS_REVERSE; } } /* Start an animation sequence at the spot (formerly) occupied by the * given creature. The creature's slot in the creature list is reused * by the animation sequence. */ static void removecreature(creature *cr, int animationid) { if (cr->id != Chip) removeclaim(cr->pos); if (cr->state & CS_PUSHED) stopsoundeffect(SND_BLOCK_MOVING); cr->id = animationid; cr->frame = ((currenttime() + stepping()) & 1) ? 12 : 11; --cr->frame; cr->hidden = FALSE; cr->state = 0; cr->tdir = NIL; if (cr->moving == 8) { cr->pos -= delta[cr->dir]; cr->moving = 0; } markanimated(cr->pos); } /* End the given animation sequence (thus removing the final vestige * of an ex-creature). */ static void removeanimation(creature *cr) { cr->hidden = TRUE; clearanimated(cr->pos); if (cr == creaturelistend()) { cr->id = Nothing; --creaturelistend(); } } /* Abort the animation sequence occuring at the given location. */ static int stopanimationat(int pos) { creature *anim; for (anim = creaturelist() ; anim->id ; ++anim) { if (!anim->hidden && anim->pos == pos && isanimation(anim->id)) { removeanimation(anim); return TRUE; } } return FALSE; } /* What happens when Chip dies. reason indicates the cause of death. * also is either NULL or points to a creature that dies with Chip. */ static void removechip(int reason, creature *also) { creature *chip = getchip(); switch (reason) { case CHIP_DROWNED: addsoundeffect(SND_WATER_SPLASH); removecreature(chip, Water_Splash); break; case CHIP_BOMBED: addsoundeffect(SND_BOMB_EXPLODES); removecreature(chip, Bomb_Explosion); break; case CHIP_OUTOFTIME: removecreature(chip, Entity_Explosion); break; case CHIP_BURNED: addsoundeffect(SND_CHIP_LOSES); removecreature(chip, Entity_Explosion); break; case CHIP_COLLIDED: addsoundeffect(SND_CHIP_LOSES); removecreature(chip, Entity_Explosion); if (also && also != chip) removecreature(also, Entity_Explosion); break; } resetfloorsounds(FALSE); startendgametimer(); timeoffset() = 1; } /* * The laws of movement across the various floors. * * Chip, blocks, and other creatures all have slightly different rules * about what sort of tiles they are permitted to move into and out * of. The following lookup table encapsulates these rules. Note that * these rules are only the first check; a creature may be generally * permitted a particular type of move but still prevented in a * specific situation. */ #define DIR_IN(dir) (dir) #define DIR_OUT(dir) ((dir) << 4) #define NORTH_IN DIR_IN(NORTH) #define WEST_IN DIR_IN(WEST) #define SOUTH_IN DIR_IN(SOUTH) #define EAST_IN DIR_IN(EAST) #define NORTH_OUT DIR_OUT(NORTH) #define WEST_OUT DIR_OUT(WEST) #define SOUTH_OUT DIR_OUT(SOUTH) #define EAST_OUT DIR_OUT(EAST) #define ALL_IN (NORTH_IN | WEST_IN | SOUTH_IN | EAST_IN) #define ALL_OUT (NORTH_OUT | WEST_OUT | SOUTH_OUT | EAST_OUT) #define ALL_IN_OUT (ALL_IN | ALL_OUT) static struct { unsigned char chip, block, creature; } const movelaws[] = { /* Nothing */ { 0, 0, 0 }, /* Empty */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Slide_North */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Slide_West */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Slide_South */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Slide_East */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Slide_Random */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Ice */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* IceWall_Northwest */ { NORTH_OUT | WEST_OUT | SOUTH_IN | EAST_IN, NORTH_OUT | WEST_OUT | SOUTH_IN | EAST_IN, NORTH_OUT | WEST_OUT | SOUTH_IN | EAST_IN }, /* IceWall_Northeast */ { NORTH_OUT | EAST_OUT | SOUTH_IN | WEST_IN, NORTH_OUT | EAST_OUT | SOUTH_IN | WEST_IN, NORTH_OUT | EAST_OUT | SOUTH_IN | WEST_IN }, /* IceWall_Southwest */ { SOUTH_OUT | WEST_OUT | NORTH_IN | EAST_IN, SOUTH_OUT | WEST_OUT | NORTH_IN | EAST_IN, SOUTH_OUT | WEST_OUT | NORTH_IN | EAST_IN }, /* IceWall_Southeast */ { SOUTH_OUT | EAST_OUT | NORTH_IN | WEST_IN, SOUTH_OUT | EAST_OUT | NORTH_IN | WEST_IN, SOUTH_OUT | EAST_OUT | NORTH_IN | WEST_IN }, /* Gravel */ { ALL_IN_OUT, ALL_IN_OUT, ALL_OUT }, /* Dirt */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Water */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Fire */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Bomb */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Beartrap */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Burglar */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* HintButton */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Button_Blue */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Button_Green */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Button_Red */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Button_Brown */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Teleport */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Wall */ { ALL_OUT, ALL_OUT, ALL_OUT }, /* Wall_North */ { NORTH_IN | WEST_IN | EAST_IN | WEST_OUT | SOUTH_OUT | EAST_OUT, NORTH_IN | WEST_IN | EAST_IN | WEST_OUT | SOUTH_OUT | EAST_OUT, NORTH_IN | WEST_IN | EAST_IN | WEST_OUT | SOUTH_OUT | EAST_OUT }, /* Wall_West */ { NORTH_IN | WEST_IN | SOUTH_IN | NORTH_OUT | SOUTH_OUT | EAST_OUT, NORTH_IN | WEST_IN | SOUTH_IN | NORTH_OUT | SOUTH_OUT | EAST_OUT, NORTH_IN | WEST_IN | SOUTH_IN | NORTH_OUT | SOUTH_OUT | EAST_OUT }, /* Wall_South */ { WEST_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | EAST_OUT, WEST_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | EAST_OUT, WEST_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | EAST_OUT }, /* Wall_East */ { NORTH_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | SOUTH_OUT, NORTH_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | SOUTH_OUT, NORTH_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | SOUTH_OUT }, /* Wall_Southeast */ { SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT, SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT, SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT }, /* HiddenWall_Perm */ { ALL_OUT, ALL_OUT, ALL_OUT }, /* HiddenWall_Temp */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* BlueWall_Real */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* BlueWall_Fake */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* SwitchWall_Open */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* SwitchWall_Closed */ { ALL_OUT, ALL_OUT, ALL_OUT }, /* PopupWall */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* CloneMachine */ { ALL_OUT, ALL_OUT, ALL_OUT }, /* Door_Red */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Door_Blue */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Door_Yellow */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Door_Green */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Socket */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Exit */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* ICChip */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Key_Red */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Key_Blue */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Key_Yellow */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Key_Green */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Boots_Slide */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Boots_Ice */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Boots_Water */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Boots_Fire */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Block_Static */ { 0, 0, 0 }, /* Drowned_Chip */ { 0, 0, 0 }, /* Burned_Chip */ { 0, 0, 0 }, /* Bombed_Chip */ { 0, 0, 0 }, /* Exited_Chip */ { 0, 0, 0 }, /* Exit_Extra_1 */ { 0, 0, 0 }, /* Exit_Extra_2 */ { 0, 0, 0 }, /* Overlay_Buffer */ { 0, 0, 0 }, /* Floor_Reserved2 */ { 0, 0, 0 }, /* Floor_Reserved1 */ { 0, 0, 0 } }; /* Including the flag CMM_RELEASING in a call to canmakemove() * indicates that the creature in question is being moved out of a * beartrap or clone machine, moves that would normally be forbidden. * CMM_CLEARANIMATIONS causes animations in the destination square to * be immediately quelled. CMM_STARTMOVEMENT indicates that this is * the final check before movement begins, thus triggering side * effects such as exposing hidden walls. CMM_PUSHBLOCKS causes blocks * to be pushed when in the way of Chip. CMM_PUSHBLOCKSNOW causes * blocks to be pushed immediately, instead of waiting for the block's * turn to move. */ #define CMM_RELEASING 0x0001 #define CMM_CLEARANIMATIONS 0x0002 #define CMM_STARTMOVEMENT 0x0004 #define CMM_PUSHBLOCKS 0x0008 #define CMM_PUSHBLOCKSNOW 0x0010 /* Return TRUE if the given block is allowed to be moved in the given * direction. If flags includes CMM_PUSHBLOCKSNOW, then the indicated * movement of the block will be initiated. */ static int canpushblock(creature *block, int dir, int flags) { _assert(block && block->id == Block); _assert(floorat(block->pos) != CloneMachine); _assert(dir != NIL); if (!canmakemove(block, dir, flags)) { if (!block->moving && (flags & (CMM_PUSHBLOCKS | CMM_PUSHBLOCKSNOW))) block->dir = dir; return FALSE; } if (flags & (CMM_PUSHBLOCKS | CMM_PUSHBLOCKSNOW)) { block->dir = dir; block->tdir = dir; block->state |= CS_PUSHED; if (flags & CMM_PUSHBLOCKSNOW) advancecreature(block, FALSE); } return TRUE; } /* Return TRUE if the given creature is allowed to attempt to move in * the given direction. Side effects can and will occur from calling * this function, as indicated by flags. */ static int canmakemove(creature const *cr, int dir, int flags) { creature *other; int leavingmap = FALSE; int floorfrom, floorto; int to, y, x; _assert(cr); _assert(dir != NIL); y = cr->pos / CXGRID; x = cr->pos % CXGRID; y += dir == NORTH ? -1 : dir == SOUTH ? +1 : 0; x += dir == WEST ? -1 : dir == EAST ? +1 : 0; to = y * CXGRID + x; if (y < 0 || y >= CYGRID || x < 0 || x >= CXGRID) { if (!pedanticmode) return FALSE; leavingmap = TRUE; to = cr->pos; } floorfrom = floorat(cr->pos); floorto = floorat(to); if ((floorfrom == Beartrap || floorfrom == CloneMachine) && !(flags & CMM_RELEASING)) return FALSE; if (isslide(floorfrom) && (cr->id != Chip || !possession(Boots_Slide))) if (getslidedir(floorfrom, FALSE) == back(dir)) return FALSE; if (floorto == SwitchWall_Open || floorto == SwitchWall_Closed) floorto ^= togglestate(); if (cr->id == Chip) { if (!(movelaws[floorfrom].chip & DIR_OUT(dir))) return FALSE; if (leavingmap) { if (flags & CMM_STARTMOVEMENT) mapbreached() = TRUE; return TRUE; } if (!(movelaws[floorto].chip & DIR_IN(dir))) return FALSE; if (floorto == Socket && chipsneeded() > 0) return FALSE; if (isdoor(floorto) && !possession(floorto)) return FALSE; if (ismarkedanimated(to)) return FALSE; other = lookupcreature(to, FALSE); if (other && other->id == Block) { if (!canpushblock(other, dir, flags & ~CMM_RELEASING)) return FALSE; } if (floorto == HiddenWall_Temp || floorto == BlueWall_Real) { if (flags & CMM_STARTMOVEMENT) floorat(to) = Wall; return FALSE; } } else if (cr->id == Block) { if (cr->moving > 0) return FALSE; if (!(movelaws[floorfrom].block & DIR_OUT(dir))) return FALSE; if (leavingmap) { if (flags & (CMM_STARTMOVEMENT | CMM_PUSHBLOCKSNOW)) mapbreached() = TRUE; return TRUE; } if (!(movelaws[floorto].block & DIR_IN(dir))) return FALSE; if (islocationclaimed(to)) return FALSE; if (flags & CMM_CLEARANIMATIONS) if (ismarkedanimated(to)) stopanimationat(to); } else { if (!(movelaws[floorfrom].creature & DIR_OUT(dir))) return FALSE; if (leavingmap) { if (flags & CMM_STARTMOVEMENT) mapbreached() = TRUE; return TRUE; } if (!(movelaws[floorto].creature & DIR_IN(dir))) return FALSE; if (islocationclaimed(to)) return FALSE; if (floorto == Fire && cr->id != Fireball) return FALSE; if (flags & CMM_CLEARANIMATIONS) if (ismarkedanimated(to)) stopanimationat(to); } return TRUE; } /* * How everyone selects their move. */ /* This function embodies the movement behavior of all the creatures. * Given a creature, this function enumerates its desired direction * of movement and selects the first one that is permitted. */ static void choosecreaturemove(creature *cr) { int choices[4] = { NIL, NIL, NIL, NIL }; int dir, pdir; int floor; int y, x, m, n; if (isanimation(cr->id)) return; cr->tdir = NIL; if (cr->id == Block) return; if (getfdir(cr) != NIL) return; floor = floorat(cr->pos); if (floor == CloneMachine || floor == Beartrap) { cr->tdir = cr->dir; return; } dir = cr->dir; pdir = NIL; _assert(dir != NIL); switch (cr->id) { case Tank: choices[0] = dir; break; case Ball: choices[0] = dir; choices[1] = back(dir); break; case Glider: choices[0] = dir; choices[1] = left(dir); choices[2] = right(dir); choices[3] = back(dir); break; case Fireball: choices[0] = dir; choices[1] = right(dir); choices[2] = left(dir); choices[3] = back(dir); break; case Bug: choices[0] = left(dir); choices[1] = dir; choices[2] = right(dir); choices[3] = back(dir); break; case Paramecium: choices[0] = right(dir); choices[1] = dir; choices[2] = left(dir); choices[3] = back(dir); break; case Walker: choices[0] = dir; choices[1] = WALKER_TURN; break; case Blob: choices[0] = BLOB_TURN; break; case Teeth: if ((currenttime() + stepping()) & 4) return; if (getchip()->hidden) return; y = chippos() / CXGRID - cr->pos / CXGRID; x = chippos() % CXGRID - cr->pos % CXGRID; n = y < 0 ? NORTH : y > 0 ? SOUTH : NIL; if (y < 0) y = -y; m = x < 0 ? WEST : x > 0 ? EAST : NIL; if (x < 0) x = -x; if (x > y) { choices[0] = m; choices[1] = n; } else { choices[0] = n; choices[1] = m; } pdir = choices[0]; break; } for (n = 0 ; n < 4 && choices[n] != NIL ; ++n) { if (choices[n] == WALKER_TURN) { m = lynx_prng() & 3; choices[n] = cr->dir; while (m--) choices[n] = right(choices[n]); } else if (choices[n] == BLOB_TURN) { int cw[4] = { NORTH, EAST, SOUTH, WEST }; choices[n] = cw[random4(mainprng())]; } cr->tdir = choices[n]; if (canmakemove(cr, choices[n], CMM_CLEARANIMATIONS)) return; } if (pdir != NIL) cr->tdir = pdir; } /* Determine the direction of Chip's next move. If discard is TRUE, * then Chip is not currently permitted to select a direction of * movement, and the player's input should not be retained. */ static void choosechipmove(creature *cr, int discard) { int dir; int f1, f2; chippushing() = FALSE; dir = currentinput(); currentinput() = NIL; if (!directionalcmd(dir)) dir = NIL; if (dir == NIL || discard) { cr->tdir = NIL; return; } lastmove() = dir; cr->tdir = dir; if (cr->tdir != NIL) dir = cr->tdir; else if (getfdir(cr) != NIL) dir = getfdir(cr); else return; if (isdiagonal(dir)) { if (cr->dir & dir) { f1 = canmakemove(cr, cr->dir, CMM_PUSHBLOCKS); f2 = canmakemove(cr, cr->dir ^ dir, CMM_PUSHBLOCKS); dir = !f1 && f2 ? dir ^ cr->dir : cr->dir; } else { if (canmakemove(cr, dir & (EAST | WEST), CMM_PUSHBLOCKS)) dir &= EAST | WEST; else dir &= NORTH | SOUTH; } cr->tdir = dir; } else { (void)canmakemove(cr, dir, CMM_PUSHBLOCKS); } } /* This function determines if the given creature is currently being * forced to move. (Ice, slide floors, and teleports are the three * possible causes of this. Bear traps and clone machines also cause * forced movement, but these are handled outside of the normal * movement sequence.) If so, the direction is stored in the * creature's fdir field, and TRUE is returned unless the creature can * override the forced move. */ static int getforcedmove(creature *cr) { int floor; setfdir(cr, NIL); floor = floorat(cr->pos); if (currenttime() == 0) return FALSE; if (isice(floor)) { if (cr->id == Chip && possession(Boots_Ice)) return FALSE; if (cr->dir == NIL) return FALSE; setfdir(cr, cr->dir); return TRUE; } else if (isslide(floor)) { if (cr->id == Chip && possession(Boots_Slide)) return FALSE; setfdir(cr, getslidedir(floor, TRUE)); return !(cr->state & CS_SLIDETOKEN); } else if (cr->state & CS_TELEPORTED) { cr->state &= ~CS_TELEPORTED; setfdir(cr, cr->dir); return TRUE; } return FALSE; } /* Return the move a creature will make on the current tick. */ static int choosemove(creature *cr) { if (cr->id == Chip) { choosechipmove(cr, getforcedmove(cr)); if (cr->tdir == NIL && getfdir(cr) == NIL) resetfloorsounds(FALSE); } else { if (getforcedmove(cr)) cr->tdir = NIL; else choosecreaturemove(cr); } return cr->tdir != NIL || getfdir(cr) != NIL; } /* Update the location that Chip is currently moving into (and reset * the pointer to the creature that Chip is colliding with). */ static void checkmovingto(void) { creature *cr; int dir; cr = getchip(); dir = cr->tdir; if (dir == NIL || isdiagonal(dir)) { chiptopos() = -1; chiptocr() = NULL; return; } chiptopos() = cr->pos + delta[dir]; chiptocr() = NULL; } /* * Special movements. */ /* Teleport the given creature instantaneously from one teleport tile * to another. */ static int teleportcreature(creature *cr) { int pos, origpos; _assert(floorat(cr->pos) == Teleport); origpos = pos = cr->pos; for (;;) { --pos; if (pos < 0) pos += CXGRID * CYGRID; if (floorat(pos) == Teleport) { if (cr->id != Chip) removeclaim(cr->pos); cr->pos = pos; if (!islocationclaimed(pos) && canmakemove(cr, cr->dir, 0)) break; if (pos == origpos) { if (cr->id == Chip) chipstuck() = TRUE; else claimlocation(cr->pos); return FALSE; } } } if (cr->id == Chip) addsoundeffect(SND_TELEPORTING); else claimlocation(cr->pos); cr->state |= CS_TELEPORTED; return TRUE; } /* Release a creature currently inside a clone machine. If the * creature successfully exits, a new clone is created to replace it. */ static int activatecloner(int pos) { creature *cr; creature *clone; if (pos < 0) return FALSE; if (pos >= CXGRID * CYGRID) { warn("Off-map cloning attempted: (%d %d)", pos % CXGRID, pos / CXGRID); return FALSE; } if (floorat(pos) != CloneMachine) { warn("Red button not connected to a clone machine at (%d %d)", pos % CXGRID, pos / CXGRID); return FALSE; } cr = lookupcreature(pos, TRUE); if (!cr) return FALSE; clone = newcreature(); if (!clone) return advancecreature(cr, TRUE) != 0; *clone = *cr; if (advancecreature(cr, TRUE) <= 0) { clone->hidden = TRUE; return FALSE; } return TRUE; } /* Release any creature on a beartrap at the given location. */ static void springtrap(int pos) { creature *cr; if (pos < 0) return; if (pos >= CXGRID * CYGRID) { warn("Off-map trap opening attempted: (%d %d)", pos % CXGRID, pos / CXGRID); return; } if (floorat(pos) != Beartrap) { warn("Brown button not connected to a beartrap at (%d %d)", pos % CXGRID, pos / CXGRID); return; } cr = lookupcreature(pos, TRUE); if (cr && cr->dir != NIL) advancecreature(cr, TRUE); } /* * When something actually moves. */ /* Initiate a move by the given creature. The direction of movement is * given by the tdir field, or the fdir field if tdir is NIL. * releasing must be TRUE if the creature is moving out of a bear trap * or clone machine. +1 is returned if the creature succeeded in * moving, 0 is returned if the move could not be initiated, and -1 is * returned if the creature was killed in the attempt. */ static int startmovement(creature *cr, int releasing) { creature *other; int dir; int floorfrom; _assert(cr->moving <= 0); if (cr->tdir != NIL) dir = cr->tdir; else if (getfdir(cr) != NIL) dir = getfdir(cr); else return 0; _assert(!isdiagonal(dir)); cr->dir = dir; floorfrom = floorat(cr->pos); if (cr->id == Chip) { _assert(!cr->hidden); if (!possession(Boots_Slide)) { if (isslide(floorfrom) && cr->tdir == NIL) cr->state |= CS_SLIDETOKEN; else if (!isice(floorfrom) || possession(Boots_Ice)) cr->state &= ~CS_SLIDETOKEN; } } if (!canmakemove(cr, dir, CMM_PUSHBLOCKSNOW | CMM_CLEARANIMATIONS | CMM_STARTMOVEMENT | (releasing ? CMM_RELEASING : 0))) { if (cr->id == Chip) { if (!couldntmove()) { couldntmove() = TRUE; addsoundeffect(SND_CANT_MOVE); } chippushing() = TRUE; } if (isice(floorfrom) && (cr->id != Chip || !possession(Boots_Ice))) { cr->dir = back(dir); applyicewallturn(cr); } return 0; } if (mapbreached() && chipisalive()) { removechip(CHIP_COLLIDED, cr); return -1; } if (floorfrom == CloneMachine || floorfrom == Beartrap) _assert(releasing); if (cr->id != Chip) { removeclaim(cr->pos); if (cr->id != Block && cr->pos == chiptopos()) chiptocr() = cr; } else if (chiptocr() && !chiptocr()->hidden) { chiptocr()->moving = 8; removechip(CHIP_COLLIDED, chiptocr()); return -1; } cr->pos += delta[dir]; if (cr->id != Chip) claimlocation(cr->pos); cr->moving += 8; if (cr->id != Chip && cr->pos == chippos() && !getchip()->hidden) { removechip(CHIP_COLLIDED, cr); return -1; } if (cr->id == Chip) { couldntmove() = FALSE; other = lookupcreature(cr->pos, FALSE); if (other) { removechip(CHIP_COLLIDED, other); return -1; } } if (cr->state & CS_PUSHED) { chippushing() = TRUE; addsoundeffect(SND_BLOCK_MOVING); } return +1; } /* Continue the given creature's move. */ static int continuemovement(creature *cr) { int floor, speed; if (isanimation(cr->id)) return TRUE; _assert(cr->moving > 0); if (cr->id == Chip && chipstuck()) return TRUE; speed = cr->id == Blob ? 1 : 2; floor = floorat(cr->pos); if (isslide(floor) && (cr->id != Chip || !possession(Boots_Slide))) speed *= 2; else if (isice(floor) && (cr->id != Chip || !possession(Boots_Ice))) speed *= 2; cr->moving -= speed; cr->frame = cr->moving / 2; return cr->moving > 0; } /* Complete the movement of the given creature. Most side effects * produced by moving onto a tile occur at this point. FALSE is * returned if the creature is removed by the time the function * returns. */ static int endmovement(creature *cr) { int floor; int survived = TRUE; if (isanimation(cr->id)) return TRUE; _assert(cr->moving <= 0); floor = floorat(cr->pos); if (cr->id != Chip || !possession(Boots_Ice)) applyicewallturn(cr); if (cr->id == Chip) { switch (floor) { case Water: if (!possession(Boots_Water)) { removechip(CHIP_DROWNED, NULL); survived = FALSE; } break; case Fire: if (!possession(Boots_Fire)) { removechip(CHIP_BURNED, NULL); survived = FALSE; } break; case Dirt: case BlueWall_Fake: floorat(cr->pos) = Empty; addsoundeffect(SND_TILE_EMPTIED); break; case PopupWall: floorat(cr->pos) = Wall; addsoundeffect(SND_WALL_CREATED); break; case Door_Red: case Door_Blue: case Door_Yellow: case Door_Green: _assert(possession(floor)); if (floor != Door_Green) --possession(floor); floorat(cr->pos) = Empty; addsoundeffect(SND_DOOR_OPENED); break; case Key_Red: case Key_Blue: case Key_Yellow: case Key_Green: if (pedanticmode) if (possession(floor) == 255) possession(floor) = -1; case Boots_Ice: case Boots_Slide: case Boots_Fire: case Boots_Water: ++possession(floor); floorat(cr->pos) = Empty; addsoundeffect(SND_ITEM_COLLECTED); break; case Burglar: possession(Boots_Ice) = 0; possession(Boots_Slide) = 0; possession(Boots_Fire) = 0; possession(Boots_Water) = 0; addsoundeffect(SND_BOOTS_STOLEN); break; case ICChip: if (chipsneeded()) --chipsneeded(); floorat(cr->pos) = Empty; addsoundeffect(SND_IC_COLLECTED); break; case Socket: _assert(chipsneeded() == 0); floorat(cr->pos) = Empty; addsoundeffect(SND_SOCKET_OPENED); break; case Exit: cr->hidden = TRUE; completed() = TRUE; addsoundeffect(SND_CHIP_WINS); break; } } else if (cr->id == Block) { switch (floor) { case Water: floorat(cr->pos) = Dirt; addsoundeffect(SND_WATER_SPLASH); removecreature(cr, Water_Splash); survived = FALSE; break; case Key_Blue: floorat(cr->pos) = Empty; break; } } else { switch (floor) { case Water: if (cr->id != Glider) { addsoundeffect(SND_WATER_SPLASH); removecreature(cr, Water_Splash); survived = FALSE; } break; case Key_Blue: floorat(cr->pos) = Empty; break; } } if (!survived) return FALSE; switch (floor) { case Bomb: floorat(cr->pos) = Empty; if (cr->id == Chip) { removechip(CHIP_BOMBED, NULL); } else { addsoundeffect(SND_BOMB_EXPLODES); removecreature(cr, Bomb_Explosion); } survived = FALSE; break; case Beartrap: addsoundeffect(SND_TRAP_ENTERED); break; case Button_Blue: turntanks(); addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Green: togglestate() ^= SwitchWall_Open ^ SwitchWall_Closed; addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Red: if (activatecloner(clonerfrombutton(cr->pos))) addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Brown: addsoundeffect(SND_BUTTON_PUSHED); break; } return survived; } /* Advance the movement of the given creature. If the creature is not * currently moving but should be, movement is initiated. If the * creature completes their movement, any and all appropriate side * effects are applied. If releasing is TRUE, the movement is occuring * out-of-turn, as with movement across an open beatrap or an * activated clone machine. The return value is +1 if the creature * successfully moved (or successfully remained stationary), 0 if the * creature tried to move and failed, or -1 if the creature was killed * and exists no longer. */ static int advancecreature(creature *cr, int releasing) { char tdir = NIL; int f; if (cr->moving <= 0 && !isanimation(cr->id)) { if (releasing) { _assert(cr->dir != NIL); tdir = cr->tdir; cr->tdir = cr->dir; } else if (cr->tdir == NIL && getfdir(cr) == NIL) return +1; f = startmovement(cr, releasing); if (f < 0) return f; if (f == 0) { if (releasing) cr->tdir = tdir; return 0; } cr->tdir = NIL; } if (!continuemovement(cr)) { if (!endmovement(cr)) return -1; } return +1; } #ifndef NDEBUG /* * Debugging functions. */ /* Print out a rough image of the level and the list of creatures. */ static void dumpmap(void) { creature *cr; int y, x; for (y = 0 ; y < CXGRID * CYGRID ; y += CXGRID) { for (x = 0 ; x < CXGRID ; ++x) fprintf(stderr, "%02X%c", state->map[y + x].top.id, (state->map[y + x].top.state ? state->map[y + x].top.state & 0x40 ? '*' : '.' : ' ')); fputc('\n', stderr); } fputc('\n', stderr); for (cr = creaturelist() ; cr->id ; ++cr) fprintf(stderr, "%02X%c%1d (%d %d)%s%s%s\n", cr->id, "-^"[(int)cr->dir], cr->moving, cr->pos % CXGRID, cr->pos / CXGRID, cr->hidden ? " dead" : "", cr->state & CS_SLIDETOKEN ? " slide-token" : "", cr->state & CS_REVERSE ? " reversing" : ""); fflush(stderr); } /* Run various sanity checks on the current game state. */ static void verifymap(void) { creature *cr; int pos; for (pos = 0 ; pos < CXGRID * CYGRID ; ++pos) { if (state->map[pos].top.id >= 0x40) warn("%d: Undefined floor %d at (%d %d)", currenttime(), state->map[pos].top.id, pos % CXGRID, pos / CXGRID); if (state->map[pos].top.state & 0x80) warn("%d: Undefined floor state %02X at (%d %d)", currenttime(), state->map[pos].top.id, pos % CXGRID, pos / CXGRID); } for (cr = creaturelist() ; cr->id ; ++cr) { if (isanimation(state->map[cr->pos].top.id)) { if (cr->moving > 12) warn("%d: Too-large animation frame %02X at (%d %d)", currenttime(), cr->moving, cr->pos % CXGRID, cr->pos / CXGRID); continue; } if (cr->id < 0x40 || cr->id >= 0x80) warn("%d: Undefined creature %d:%d at (%d %d)", currenttime(), cr - creaturelist(), cr->id, cr->pos % CXGRID, cr->pos / CXGRID); if (cr->pos < 0 || cr->pos >= CXGRID * CYGRID) warn("%d: Creature %d:%d has left the map: %04X", currenttime(), cr - creaturelist(), cr->id, cr->pos); if (isanimation(cr->id)) continue; if (cr->dir > EAST && (cr->dir != NIL || cr->id != Block)) warn("%d: Creature %d:%d moving in illegal direction (%d)", currenttime(), cr - creaturelist(), cr->id, cr->dir); if (cr->dir == NIL) warn("%d: Creature %d:%d lacks direction", currenttime(), cr - creaturelist(), cr->id); if (cr->moving > 8) warn("%d: Creature %d:%d has a moving time of %d", currenttime(), cr - creaturelist(), cr->id, cr->moving); if (cr->moving < 0) warn("%d: Creature %d:%d has a negative moving time: %d", currenttime(), cr - creaturelist(), cr->id, cr->moving); } } #endif /* * Per-tick maintenance functions. */ /* Actions and checks that occur at the start of every tick. */ static void initialhousekeeping(void) { creature *chip; creature *cr; int pos; #ifndef NDEBUG verifymap(); #endif if (currenttime() == 0) { lastrndslidedir = rndslidedir(); laststepping = stepping(); } chip = getchip(); if (chip->id == Pushing_Chip) chip->id = Chip; if (!inendgame()) { if (completed()) { startendgametimer(); timeoffset() = 1; } else if (timelimit() && currenttime() >= timelimit()) { removechip(CHIP_OUTOFTIME, NULL); } } for (cr = creaturelist() ; cr->id ; ++cr) { if (cr->hidden) continue; if (cr->state & CS_REVERSE) { cr->state &= ~CS_REVERSE; if (cr->moving <= 0) cr->dir = back(cr->dir); } } for (cr = creaturelist() ; cr->id ; ++cr) { if (cr->state & CS_PUSHED) { if (cr->hidden || cr->moving <= 0) { stopsoundeffect(SND_BLOCK_MOVING); cr->state &= ~CS_PUSHED; } } } if (togglestate()) { for (pos = 0 ; pos < CXGRID * CYGRID ; ++pos) { if (floorat(pos) == SwitchWall_Open || floorat(pos) == SwitchWall_Closed) floorat(pos) ^= togglestate(); } togglestate() = 0; } #ifndef NDEBUG if (currentinput() == CmdDebugCmd2) { dumpmap(); exit(0); currentinput() = NIL; } else if (currentinput() == CmdDebugCmd1) { static int mark = 0; warn("Mark %d (%d).", ++mark, currenttime()); currentinput() = NIL; } if (currentinput() >= CmdCheatNorth && currentinput() <= CmdCheatICChip) { switch (currentinput()) { case CmdCheatNorth: --yviewoffset(); break; case CmdCheatWest: --xviewoffset(); break; case CmdCheatSouth: ++yviewoffset(); break; case CmdCheatEast: ++xviewoffset(); break; case CmdCheatHome: xviewoffset()=yviewoffset()=0; break; case CmdCheatKeyRed: ++possession(Key_Red); break; case CmdCheatKeyBlue: ++possession(Key_Blue); break; case CmdCheatKeyYellow: ++possession(Key_Yellow); break; case CmdCheatKeyGreen: ++possession(Key_Green); break; case CmdCheatBootsIce: ++possession(Boots_Ice); break; case CmdCheatBootsSlide: ++possession(Boots_Slide); break; case CmdCheatBootsFire: ++possession(Boots_Fire); break; case CmdCheatBootsWater: ++possession(Boots_Water); break; case CmdCheatICChip: if (chipsneeded()) --chipsneeded(); break; } currentinput() = NIL; setnosaving(); } #endif chiptopos() = -1; chiptocr() = NULL; } /* Actions and checks that occur at the end of every tick. */ static void finalhousekeeping(void) { return; } /* Set the state fields specifically used to produce the output. */ static void preparedisplay(void) { creature *chip; int floor; chip = getchip(); floor = floorat(chip->pos); xviewpos() = (chip->pos % CXGRID) * 8 + xviewoffset() * 8; yviewpos() = (chip->pos / CXGRID) * 8 + yviewoffset() * 8; if (chip->moving) { switch (chip->dir) { case NORTH: yviewpos() += chip->moving; break; case WEST: xviewpos() += chip->moving; break; case SOUTH: yviewpos() -= chip->moving; break; case EAST: xviewpos() -= chip->moving; break; } } if (!chip->hidden) { if (floor == HintButton && chip->moving <= 0) showhint(); else hidehint(); if (chip->id == Chip && chippushing()) chip->id = Pushing_Chip; if (chip->moving) { resetfloorsounds(FALSE); floor = floorat(chip->pos); if (floor == Fire && possession(Boots_Fire)) addsoundeffect(SND_FIREWALKING); else if (floor == Water && possession(Boots_Water)) addsoundeffect(SND_WATERWALKING); else if (isice(floor)) { if (possession(Boots_Ice)) addsoundeffect(SND_ICEWALKING); else if (floor == Ice) addsoundeffect(SND_SKATING_FORWARD); else addsoundeffect(SND_SKATING_TURN); } else if (isslide(floor)) { if (possession(Boots_Slide)) addsoundeffect(SND_SLIDEWALKING); else addsoundeffect(SND_SLIDING); } } } } /* * The functions provided by the gamelogic struct. */ /* Initialize the gamestate structure to the state at the beginning of * the level, using the data in the associated gamesetup structure. * The level map is decoded and assembled, the list of creatures is * drawn up, and other miscellaneous initializations are performed. */ static int initgame(gamelogic *logic) { creature crtemp; creature *cr; mapcell *cell; xyconn *xy; int pos, num, n; setstate(logic); num = state->game->number; creaturelist() = creaturearray + 1; cr = creaturelist(); if (pedanticmode) if (state->statusflags & SF_BADTILES) markinvalid(); n = -1; for (pos = 0, cell = state->map ; pos < CXGRID * CYGRID ; ++pos, ++cell) { if (cell->top.id == Block_Static) cell->top.id = crtile(Block, NORTH); if (cell->bot.id == Block_Static) cell->bot.id = crtile(Block, NORTH); if (ismsspecial(cell->top.id) && cell->top.id != Exited_Chip) { cell->top.id = Wall; if (pedanticmode) markinvalid(); } if (ismsspecial(cell->bot.id) && cell->bot.id != Exited_Chip) { cell->bot.id = Wall; if (pedanticmode) markinvalid(); } if (cell->bot.id != Empty) { if (!isfloor(cell->bot.id) || isfloor(cell->top.id)) { warn("level %d: invalid \"buried\" tile at (%d %d)", num, pos % CXGRID, pos / CXGRID); markinvalid(); } } if (iscreature(cell->top.id)) { cr->pos = pos; cr->id = creatureid(cell->top.id); cr->dir = creaturedirid(cell->top.id); cr->moving = 0; cr->hidden = FALSE; if (cr->id == Chip) { if (n >= 0) { warn("level %d: multiple Chips on the map!", num); markinvalid(); } n = cr - creaturelist(); cr->dir = SOUTH; cr->state = 0; } else { cr->state = 0; claimlocation(pos); } setfdir(cr, NIL); cr->tdir = NIL; cr->frame = 0; ++cr; cell->top.id = cell->bot.id; cell->bot.id = Empty; } if (pedanticmode) if (cell->top.id == Wall_North || cell->top.id == Wall_West) markinvalid(); } if (n < 0) { warn("level %d: Chip isn't on the map!", num); markinvalid(); n = cr - creaturelist(); cr->pos = 0; cr->hidden = TRUE; ++cr; } cr->pos = -1; cr->id = Nothing; cr->dir = NIL; creaturelistend() = cr - 1; if (n) { cr = creaturelist(); crtemp = cr[0]; cr[0] = cr[n]; cr[n] = crtemp; } for (xy = traplist(), n = traplistsize() ; n ; --n, ++xy) { if (xy->from >= CXGRID * CYGRID || xy->to >= CXGRID * CYGRID) { warn("Level %d: ignoring off-map beartrap wiring", num); xy->from = -1; } else if (floorat(xy->from) != Button_Brown) { warn("Level %d: invalid beartrap wiring: no button at (%d %d)", num, xy->from % CXGRID, xy->to / CXGRID); } else if (floorat(xy->to) != Beartrap) { warn("Level %d: disabling miswired beartrap button at (%d %d)", num, xy->to % CXGRID, xy->to / CXGRID); xy->from = -1; } } for (xy = clonerlist(), n = clonerlistsize() ; n ; --n, ++xy) { if (xy->from >= CXGRID * CYGRID || xy->to >= CXGRID * CYGRID) { warn("Level %d: ignoring off-map cloner wiring", num); xy->from = -1; } else if (floorat(xy->from) != Button_Red) { warn("Level %d: invalid cloner wiring: no button at (%d %d)", num, xy->from % CXGRID, xy->to / CXGRID); } else if (floorat(xy->to) != CloneMachine) { warn("Level %d: disabling miswired cloner button at (%d %d)", num, xy->to % CXGRID, xy->to / CXGRID); xy->from = -1; } } possession(Key_Red) = possession(Key_Blue) = possession(Key_Yellow) = possession(Key_Green) = 0; possession(Boots_Ice) = possession(Boots_Slide) = possession(Boots_Fire) = possession(Boots_Water) = 0; resetendgametimer(); couldntmove() = FALSE; chippushing() = FALSE; chipstuck() = FALSE; mapbreached() = FALSE; completed() = FALSE; chiptopos() = -1; chiptocr() = NULL; prngvalue1() = 0; prngvalue2() = 0; rndslidedir() = lastrndslidedir; stepping() = laststepping; xviewoffset() = 0; yviewoffset() = 0; preparedisplay(); return !ismarkedinvalid(); } /* Advance the game state by one tick. */ static int advancegame(gamelogic *logic) { creature *cr; setstate(logic); initialhousekeeping(); for (cr = creaturelistend() ; cr >= creaturelist() ; --cr) { setfdir(cr, NIL); cr->tdir = NIL; if (cr->hidden) continue; if (isanimation(cr->id)) { --cr->frame; if (cr->frame < 0) removeanimation(cr); continue; } if (cr->moving <= 0) choosemove(cr); } cr = getchip(); if (getfdir(cr) == NIL && cr->tdir == NIL) couldntmove() = FALSE; else checkmovingto(); for (cr = creaturelistend() ; cr >= creaturelist() ; --cr) { if (cr->hidden) continue; if (advancecreature(cr, FALSE) < 0) continue; cr->tdir = NIL; setfdir(cr, NIL); if (floorat(cr->pos) == Button_Brown && cr->moving <= 0) springtrap(trapfrombutton(cr->pos)); } for (cr = creaturelistend() ; cr >= creaturelist() ; --cr) { if (cr->hidden) continue; if (cr->moving) continue; if (floorat(cr->pos) == Teleport) teleportcreature(cr); } finalhousekeeping(); preparedisplay(); if (inendgame()) { --timeoffset(); if (!decrendgametimer()) { resetfloorsounds(TRUE); return completed() ? +1 : -1; } } return 0; } /* Free resources associated with the current game state. */ static int endgame(gamelogic *logic) { (void)logic; return TRUE; } /* Free all allocated resources for this module. */ static void shutdown(gamelogic *logic) { (void)logic; free(creaturearray); creaturearray = NULL; } /* The exported function: Initialize and return the module's gamelogic * structure. */ gamelogic *lynxlogicstartup(void) { static gamelogic logic; creaturearray = calloc(MAX_CREATURES + 1, sizeof *creaturearray); if (!creaturearray) memerrexit(); lastrndslidedir = NORTH; laststepping = 0; logic.ruleset = Ruleset_Lynx; logic.initgame = initgame; logic.advancegame = advancegame; logic.endgame = endgame; logic.shutdown = shutdown; return &logic; } tworld-1.3.0/logic.h0000644000175000017500000000204010363151726014432 0ustar breadboxbreadbox/* logic.h: Declarations for the game logic modules. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _logic_h_ #define _logic_h_ #include "state.h" /* One game logic engine. */ typedef struct gamelogic gamelogic; struct gamelogic { int ruleset; /* the ruleset */ gamestate *state; /* ptr to the current game state */ int (*initgame)(gamelogic*); /* prepare to play a game */ int (*advancegame)(gamelogic*); /* advance the game one tick */ int (*endgame)(gamelogic*); /* clean up after the game is done */ void (*shutdown)(gamelogic*); /* turn off the logic engine */ }; /* The available game logic engines. */ extern gamelogic *lynxlogicstartup(void); extern gamelogic *mslogicstartup(void); /* The high simluation fidelity flag: if true, the simulation should * forgo "standard play" in favor of being as true as possible to the * original source material. */ extern int pedanticmode; #endif tworld-1.3.0/mklynxcc.c0000644000175000017500000000430307427477210015172 0ustar breadboxbreadbox/* mklynxcc.c: Written by Brian Raiter, 2001. * * This is a quick hack that can be used to make .dat files that use * the Lynx ruleset. Run the program, giving it the name of a .dat * file, and the program will modify the .dat file to mark it as being * for the Lynx ruleset. * * This source code is in the public domain. */ #include #include #include #include #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* The magic numbers of the .dat file. */ #define CHIPS_SIGBYTE_1 0xAC #define CHIPS_SIGBYTE_2 0xAA #define CHIPS_SIGBYTE_3 0x02 /* Error return values. */ #define ERR_BAD_CMDLINE 127 #define ERR_NOT_DATFILE 126 #define ERR_NOT_MS_DATFILE 125 /* The file to alter. */ static FILE *fp = NULL; static char const *file = NULL; /* Replace a byte in the file. */ static int changebyte(unsigned long pos, unsigned char byte) { if (fseek(fp, pos, SEEK_SET) == 0 && fputc(byte, fp) != EOF) return TRUE; perror(file); return FALSE; } /* Return FALSE if the file is not a .dat file. */ static int sanitycheck(void) { unsigned char header[4]; int n; n = fread(header, 1, 4, fp); if (n < 0) { perror(file); return FALSE; } if (n < 4 || header[0] != CHIPS_SIGBYTE_1 || header[1] != CHIPS_SIGBYTE_2 || header[2] != CHIPS_SIGBYTE_3) { fprintf(stderr, "%s is not a valid .dat file\n", file); errno = ERR_NOT_DATFILE; return FALSE; } if (header[3] != 0) { if (header[3] == 1) fprintf(stderr, "%s is already set for the Lynx ruleset\n", file); else fprintf(stderr, "%s is not set for the MS ruleset\n", file); errno = ERR_NOT_MS_DATFILE; return FALSE; } rewind(fp); return TRUE; } int main(int argc, char *argv[]) { int ret = 0; int n; if (argc < 2) { fprintf(stderr, "Usage: %s DATFILE ...\n", argv[0]); return ERR_BAD_CMDLINE; } for (n = 1 ; n < argc ; ++n) { file = argv[n]; if ((fp = fopen(file, "r+b")) == NULL) { perror(file); ret = errno; continue; } if (sanitycheck() && changebyte(3, 1)) printf("%s was successfully altered\n", file); else ret = errno; fclose(fp); } return ret; } tworld-1.3.0/mslogic.c0000644000175000017500000016047210420411243014766 0ustar breadboxbreadbox/* mslogic.c: The game logic for the MS ruleset. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include "defs.h" #include "err.h" #include "state.h" #include "random.h" #include "logic.h" #ifdef NDEBUG #define _assert(test) ((void)0) #else #define _assert(test) ((test) || (die("internal error: failed sanity check" \ " (%s)\nPlease report this error to" \ " breadbox@muppetlabs.com", #test), 0)) #endif /* A list of ways for Chip to lose. */ enum { CHIP_OKAY = 0, CHIP_DROWNED, CHIP_BURNED, CHIP_BOMBED, CHIP_OUTOFTIME, CHIP_COLLIDED, CHIP_NOTOKAY }; /* Status information specific to the MS game logic. */ struct msstate { unsigned char chipwait; /* ticks since Chip's last movement */ unsigned char chipstatus; /* Chip's status (one of CHIP_*) */ unsigned char controllerdir; /* current controller direction */ unsigned char lastslipdir; /* Chip's last involuntary movement */ unsigned char completed; /* level completed successfully */ short goalpos; /* mouse spot to move Chip towards */ signed char xviewoffset; /* offset of map view center */ signed char yviewoffset; /* position from position of Chip */ }; /* Forward declaration of a central function. */ static int advancecreature(creature *cr, int dir); /* The most recently used stepping phase value. */ static int laststepping = 0; /* A pointer to the game state, used so that it doesn't have to be * passed to every single function. */ static gamestate *state; /* * Accessor macros for various fields in the game state. Many of the * macros can be used as an lvalue. */ #define setstate(p) (state = (p)->state) #define getchip() (creatures[0]) #define chippos() (getchip()->pos) #define chipdir() (getchip()->dir) #define chipsneeded() (state->chipsneeded) #define clonerlist() (state->cloners) #define clonerlistsize() (state->clonercount) #define traplist() (state->traps) #define traplistsize() (state->trapcount) #define timelimit() (state->timelimit) #define timeoffset() (state->timeoffset) #define stepping() (state->stepping) #define currenttime() (state->currenttime) #define currentinput() (state->currentinput) #define xviewpos() (state->xviewpos) #define yviewpos() (state->yviewpos) #define mainprng() (&state->mainprng) #define lastmove() (state->lastmove) #define addsoundeffect(sfx) (state->soundeffects |= 1 << (sfx)) #define cellat(pos) (&state->map[pos]) #define setnosaving() (state->statusflags |= SF_NOSAVING) #define showhint() (state->statusflags |= SF_SHOWHINT) #define hidehint() (state->statusflags &= ~SF_SHOWHINT) #define getmsstate() ((struct msstate*)state->localstateinfo) #define completed() (getmsstate()->completed) #define chipstatus() (getmsstate()->chipstatus) #define chipwait() (getmsstate()->chipwait) #define controllerdir() (getmsstate()->controllerdir) #define lastslipdir() (getmsstate()->lastslipdir) #define xviewoffset() (getmsstate()->xviewoffset) #define yviewoffset() (getmsstate()->yviewoffset) #define goalpos() (getmsstate()->goalpos) #define hasgoal() (goalpos() >= 0) #define cancelgoal() (goalpos() = -1) #define possession(obj) (*_possession(obj)) static short *_possession(int obj) { switch (obj) { case Key_Red: return &state->keys[0]; case Key_Blue: return &state->keys[1]; case Key_Yellow: return &state->keys[2]; case Key_Green: return &state->keys[3]; case Boots_Ice: return &state->boots[0]; case Boots_Slide: return &state->boots[1]; case Boots_Fire: return &state->boots[2]; case Boots_Water: return &state->boots[3]; case Door_Red: return &state->keys[0]; case Door_Blue: return &state->keys[1]; case Door_Yellow: return &state->keys[2]; case Door_Green: return &state->keys[3]; case Ice: return &state->boots[0]; case IceWall_Northwest: return &state->boots[0]; case IceWall_Northeast: return &state->boots[0]; case IceWall_Southwest: return &state->boots[0]; case IceWall_Southeast: return &state->boots[0]; case Slide_North: return &state->boots[1]; case Slide_West: return &state->boots[1]; case Slide_South: return &state->boots[1]; case Slide_East: return &state->boots[1]; case Slide_Random: return &state->boots[1]; case Fire: return &state->boots[2]; case Water: return &state->boots[3]; } warn("Invalid object %d handed to possession()", obj); _assert(!"possession() called with an invalid object"); return NULL; } /* * Memory allocation functions for the various arenas. */ /* The data associated with a sliding object. */ typedef struct slipper { creature *cr; int dir; } slipper; /* The linked list of creature pools, forming the creature arena. */ static creature *creaturepool = NULL; static void *creaturepoolend = NULL; static int const creaturepoolchunk = 256; /* The list of active creatures. */ static creature **creatures = NULL; static int creaturecount = 0; static int creaturesallocated = 0; /* The list of "active" blocks. */ static creature **blocks = NULL; static int blockcount = 0; static int blocksallocated = 0; /* The list of sliding creatures. */ static slipper *slips = NULL; static int slipcount = 0; static int slipsallocated = 0; /* Mark all entries in the creature arena as unused. */ static void resetcreaturepool(void) { if (!creaturepoolend) return; while (creaturepoolend) { creaturepool = creaturepoolend; creaturepoolend = ((creature**)creaturepoolend)[0]; } creaturepoolend = creaturepool; creaturepool = (creature*)creaturepoolend - creaturepoolchunk + 1; } /* Destroy the creature arena. */ static void freecreaturepool(void) { if (!creaturepoolend) return; for (;;) { creaturepoolend = ((creature**)creaturepoolend)[1]; free(creaturepool); creaturepool = creaturepoolend; if (!creaturepool) break; creaturepoolend = creaturepool + creaturepoolchunk - 1; } } /* Return a pointer to a fresh creature. */ static creature *allocatecreature(void) { creature *cr; if (creaturepool == creaturepoolend) { if (creaturepoolend && ((creature**)creaturepoolend)[1]) { creaturepool = ((creature**)creaturepoolend)[1]; creaturepoolend = creaturepool + creaturepoolchunk - 1; } else { cr = creaturepoolend; creaturepool = malloc(creaturepoolchunk * sizeof *creaturepool); if (!creaturepool) memerrexit(); if (cr) ((creature**)cr)[1] = creaturepool; creaturepoolend = creaturepool + creaturepoolchunk - 1; ((creature**)creaturepoolend)[0] = cr; ((creature**)creaturepoolend)[1] = NULL; } } cr = creaturepool++; cr->id = Nothing; cr->pos = -1; cr->dir = NIL; cr->tdir = NIL; cr->state = 0; cr->frame = 0; cr->hidden = FALSE; cr->moving = 0; return cr; } /* Empty the list of active creatures. */ static void resetcreaturelist(void) { creaturecount = 0; } /* Append the given creature to the end of the creature list. */ static creature *addtocreaturelist(creature *cr) { if (creaturecount >= creaturesallocated) { creaturesallocated = creaturesallocated ? creaturesallocated * 2 : 16; creatures = realloc(creatures, creaturesallocated * sizeof *creatures); if (!creatures) memerrexit(); } creatures[creaturecount++] = cr; return cr; } /* Empty the list of "active" blocks. */ static void resetblocklist(void) { blockcount = 0; } /* Append the given block to the end of the block list. */ static creature *addtoblocklist(creature *cr) { if (blockcount >= blocksallocated) { blocksallocated = blocksallocated ? blocksallocated * 2 : 16; blocks = realloc(blocks, blocksallocated * sizeof *blocks); if (!blocks) memerrexit(); } blocks[blockcount++] = cr; return cr; } /* Empty the list of sliding creatures. */ static void resetsliplist(void) { slipcount = 0; } /* Append the given creature to the end of the slip list. */ static creature *appendtosliplist(creature *cr, int dir) { int n; for (n = 0 ; n < slipcount ; ++n) { if (slips[n].cr == cr) { slips[n].dir = dir; return cr; } } if (slipcount >= slipsallocated) { slipsallocated = slipsallocated ? slipsallocated * 2 : 16; slips = realloc(slips, slipsallocated * sizeof *slips); if (!slips) memerrexit(); } slips[slipcount].cr = cr; slips[slipcount].dir = dir; ++slipcount; return cr; } /* Add the given creature to the start of the slip list. */ static creature *prependtosliplist(creature *cr, int dir) { int n; if (slipcount && slips[0].cr == cr) { slips[0].dir = dir; return cr; } if (slipcount >= slipsallocated) { slipsallocated = slipsallocated ? slipsallocated * 2 : 16; slips = realloc(slips, slipsallocated * sizeof *slips); if (!slips) memerrexit(); } for (n = slipcount ; n ; --n) slips[n] = slips[n - 1]; ++slipcount; slips[0].cr = cr; slips[0].dir = dir; return cr; } /* Return the sliding direction of a creature on the slip list. */ static int getslipdir(creature *cr) { int n; for (n = 0 ; n < slipcount ; ++n) if (slips[n].cr == cr) return slips[n].dir; return NIL; } /* Remove the given creature from the slip list. */ static void removefromsliplist(creature *cr) { int n; for (n = 0 ; n < slipcount ; ++n) if (slips[n].cr == cr) break; if (n == slipcount) return; --slipcount; for ( ; n < slipcount ; ++n) slips[n] = slips[n + 1]; } /* * Simple floor functions. */ /* Floor state flags. */ #define FS_BUTTONDOWN 0x01 /* button press is deferred */ #define FS_CLONING 0x02 /* clone machine is activated */ #define FS_BROKEN 0x04 /* teleport/toggle wall doesn't work */ #define FS_HASMUTANT 0x08 /* beartrap contains mutant block */ #define FS_MARKER 0x10 /* marker used during initialization */ /* Translate a slide floor into the direction it points in. In the * case of a random slide floor, a new direction is selected. */ static int getslidedir(int floor) { switch (floor) { case Slide_North: return NORTH; case Slide_West: return WEST; case Slide_South: return SOUTH; case Slide_East: return EAST; case Slide_Random: return 1 << random4(mainprng()); } return NIL; } /* Alter a creature's direction if they are at an ice wall. */ static int icewallturn(int floor, int dir) { switch (floor) { case IceWall_Northeast: return dir == SOUTH ? EAST : dir == WEST ? NORTH : dir; case IceWall_Southwest: return dir == NORTH ? WEST : dir == EAST ? SOUTH : dir; case IceWall_Northwest: return dir == SOUTH ? WEST : dir == EAST ? NORTH : dir; case IceWall_Southeast: return dir == NORTH ? EAST : dir == WEST ? SOUTH : dir; } return dir; } /* Find the location of a bear trap from one of its buttons. */ static int trapfrombutton(int pos) { xyconn *traps; int i; traps = traplist(); for (i = traplistsize() ; i ; ++traps, --i) if (traps->from == pos) return traps->to; return -1; } /* Find the location of a clone machine from one of its buttons. */ static int clonerfrombutton(int pos) { xyconn *cloners; int i; cloners = clonerlist(); for (i = clonerlistsize() ; i ; ++cloners, --i) if (cloners->from == pos) return cloners->to; return -1; } /* Return the floor tile found at the given location. */ static int floorat(int pos) { mapcell *cell; cell = cellat(pos); if (!iskey(cell->top.id) && !isboots(cell->top.id) && !iscreature(cell->top.id)) return cell->top.id; if (!iskey(cell->bot.id) && !isboots(cell->bot.id) && !iscreature(cell->bot.id)) return cell->bot.id; return Empty; } /* Return a pointer to the tile that forms the floor at the given * location. */ static maptile *getfloorat(int pos) { mapcell *cell; cell = cellat(pos); if (!iskey(cell->top.id) && !isboots(cell->top.id) && !iscreature(cell->top.id)) return &cell->top; if (!iskey(cell->bot.id) && !isboots(cell->bot.id) && !iscreature(cell->bot.id)) return &cell->bot; return &cell->bot; /* ? */ } /* Return TRUE if the brown button at the give location is currently * held down. */ static int istrapbuttondown(int pos) { return pos >= 0 && pos < CXGRID * CYGRID && cellat(pos)->top.id != Button_Brown; } /* Place a new tile at the given location, causing the current upper * tile to become the lower tile. */ static void pushtile(int pos, maptile tile) { mapcell *cell; cell = cellat(pos); cell->bot = cell->top; cell->top = tile; } /* Remove the upper tile from the given location, causing the current * lower tile to become uppermost. */ static maptile poptile(int pos) { maptile tile; mapcell *cell; cell = cellat(pos); tile = cell->top; cell->top = cell->bot; cell->bot.id = Empty; cell->bot.state = 0; return tile; } /* Return TRUE if a bear trap is currently passable. */ static int istrapopen(int pos, int skippos) { xyconn *traps; int i; traps = traplist(); for (i = traplistsize() ; i ; ++traps, --i) if (traps->to == pos && traps->from != skippos && istrapbuttondown(traps->from)) return TRUE; return FALSE; } /* Flip-flop the state of any toggle walls. */ static void togglewalls(void) { mapcell *cell; int pos; for (pos = 0 ; pos < CXGRID * CYGRID ; ++pos) { cell = cellat(pos); if ((cell->top.id == SwitchWall_Open || cell->top.id == SwitchWall_Closed) && !(cell->top.state & FS_BROKEN)) cell->top.id ^= SwitchWall_Open ^ SwitchWall_Closed; if ((cell->bot.id == SwitchWall_Open || cell->bot.id == SwitchWall_Closed) && !(cell->bot.state & FS_BROKEN)) cell->bot.id ^= SwitchWall_Open ^ SwitchWall_Closed; } } /* * Functions that manage the list of entities. */ /* Creature state flags. */ #define CS_RELEASED 0x01 /* can leave a beartrap */ #define CS_CLONING 0x02 /* cannot move this tick */ #define CS_HASMOVED 0x04 /* already used current move */ #define CS_TURNING 0x08 /* is turning around */ #define CS_SLIP 0x10 /* is on the slip list */ #define CS_SLIDE 0x20 /* is on the slip list but can move */ #define CS_DEFERPUSH 0x40 /* button pushes will be delayed */ #define CS_MUTANT 0x80 /* block is mutant, looks like Chip */ /* Return the creature located at pos. Ignores Chip unless includechip * is TRUE. Return NULL if no such creature is present. */ static creature *lookupcreature(int pos, int includechip) { int n; if (!creatures) return NULL; for (n = 0 ; n < creaturecount ; ++n) { if (creatures[n]->hidden) continue; if (creatures[n]->pos == pos) if (creatures[n]->id != Chip || includechip) return creatures[n]; } return NULL; } /* Return the block located at pos. If the block in question is not * currently "active", then it is automatically added to the block * list. (Why is a block on a beartrap automatically released? Or * rather, why is this done in this function? I don't know.) */ static creature *lookupblock(int pos) { creature *cr; int id, n; if (blocks) { for (n = 0 ; n < blockcount ; ++n) if (blocks[n]->pos == pos && !blocks[n]->hidden) return blocks[n]; } cr = allocatecreature(); cr->id = Block; cr->pos = pos; id = cellat(pos)->top.id; if (id == Block_Static) cr->dir = NIL; else if (creatureid(id) == Block) cr->dir = creaturedirid(id); else _assert(!"lookupblock() called on blockless location"); if (cellat(pos)->bot.id == Beartrap) { for (n = 0 ; n < traplistsize() ; ++n) { if (traplist()[n].to == cr->pos) { cr->state |= CS_RELEASED; break; } } } return addtoblocklist(cr); } /* Update the given creature's tile on the map to reflect its current * state. */ static void updatecreature(creature const *cr) { maptile *tile; int id, dir; if (cr->hidden) return; tile = &cellat(cr->pos)->top; id = cr->id; if (id == Block) { tile->id = Block_Static; if (cr->state & CS_MUTANT) tile->id = crtile(Chip, NORTH); return; } else if (id == Chip) { if (chipstatus()) { switch (chipstatus()) { case CHIP_BURNED: tile->id = Burned_Chip; return; case CHIP_DROWNED: tile->id = Drowned_Chip; return; } } else if (cellat(cr->pos)->bot.id == Water) { id = Swimming_Chip; } } dir = cr->dir; if (cr->state & CS_TURNING) dir = right(dir); tile->id = crtile(id, dir); tile->state = 0; } /* Add the given creature's tile to the map. */ static void addcreaturetomap(creature const *cr) { static maptile const dummy = { Empty, 0 }; if (cr->hidden) return; pushtile(cr->pos, dummy); updatecreature(cr); } /* Enervate an inert creature. */ static creature *awakencreature(int pos) { creature *new; int tileid; tileid = cellat(pos)->top.id; if (!iscreature(tileid) || creatureid(tileid) == Chip) return NULL; new = allocatecreature(); new->id = creatureid(tileid); new->dir = creaturedirid(tileid); new->pos = pos; return new->id == Block ? addtoblocklist(new) : addtocreaturelist(new); } /* Mark a creature as dead. */ static void removecreature(creature *cr) { cr->state &= ~(CS_SLIP | CS_SLIDE); if (cr->id == Chip) { if (chipstatus() == CHIP_OKAY) chipstatus() = CHIP_NOTOKAY; } else cr->hidden = TRUE; } /* Turn around any and all tanks. (A tank that is halfway through the * process of moving at the time is given special treatment.) */ static void turntanks(creature const *inmidmove) { int n; for (n = 0 ; n < creaturecount ; ++n) { if (creatures[n]->hidden || creatures[n]->id != Tank) continue; creatures[n]->dir = back(creatures[n]->dir); if (!(creatures[n]->state & CS_TURNING)) creatures[n]->state |= CS_TURNING | CS_HASMOVED; if (creatures[n] != inmidmove) { if (creatureid(cellat(creatures[n]->pos)->top.id) == Tank) { updatecreature(creatures[n]); } else { if (creatures[n]->state & CS_TURNING) { creatures[n]->state &= ~CS_TURNING; updatecreature(creatures[n]); creatures[n]->state |= CS_TURNING; } creatures[n]->dir = back(creatures[n]->dir); } } } } /* * Maintaining the slip list. */ /* Add the given creature to the slip list if it is not already on it * (assuming that the given floor is a kind that causes slipping). */ static void startfloormovement(creature *cr, int floor) { int dir; cr->state &= ~(CS_SLIP | CS_SLIDE); if (isice(floor)) dir = icewallturn(floor, cr->dir); else if (isslide(floor)) dir = getslidedir(floor); else if (floor == Teleport) dir = cr->dir; else if (floor == Beartrap && cr->id == Block) dir = cr->dir; else return; if (cr->id == Chip) { cr->state |= isslide(floor) ? CS_SLIDE : CS_SLIP; prependtosliplist(cr, dir); cr->dir = dir; updatecreature(cr); } else { cr->state |= CS_SLIP; appendtosliplist(cr, dir); } } /* Remove the given creature from the slip list. */ static void endfloormovement(creature *cr) { cr->state &= ~(CS_SLIP | CS_SLIDE); removefromsliplist(cr); } /* Clean out deadwood entries in the slip list. */ static void updatesliplist() { int n; for (n = slipcount - 1 ; n >= 0 ; --n) if (!(slips[n].cr->state & (CS_SLIP | CS_SLIDE))) endfloormovement(slips[n].cr); } /* * The laws of movement across the various floors. * * Chip, blocks, and other creatures all have slightly different rules * about what sort of tiles they are permitted to move into. The * following lookup table encapsulates these rules. Note that these * rules are only the first check; a creature may be occasionally * permitted a particular type of move but still prevented in a * specific situation. */ #define NWSE (NORTH | WEST | SOUTH | EAST) static struct { unsigned char chip, block, creature; } const movelaws[] = { /* Nothing */ { 0, 0, 0 }, /* Empty */ { NWSE, NWSE, NWSE }, /* Slide_North */ { NWSE, NWSE, NWSE }, /* Slide_West */ { NWSE, NWSE, NWSE }, /* Slide_South */ { NWSE, NWSE, NWSE }, /* Slide_East */ { NWSE, NWSE, NWSE }, /* Slide_Random */ { NWSE, NWSE, 0 }, /* Ice */ { NWSE, NWSE, NWSE }, /* IceWall_Northwest */ { SOUTH | EAST, SOUTH | EAST, SOUTH | EAST }, /* IceWall_Northeast */ { SOUTH | WEST, SOUTH | WEST, SOUTH | WEST }, /* IceWall_Southwest */ { NORTH | EAST, NORTH | EAST, NORTH | EAST }, /* IceWall_Southeast */ { NORTH | WEST, NORTH | WEST, NORTH | WEST }, /* Gravel */ { NWSE, NWSE, 0 }, /* Dirt */ { NWSE, 0, 0 }, /* Water */ { NWSE, NWSE, NWSE }, /* Fire */ { NWSE, NWSE, NWSE }, /* Bomb */ { NWSE, NWSE, NWSE }, /* Beartrap */ { NWSE, NWSE, NWSE }, /* Burglar */ { NWSE, 0, 0 }, /* HintButton */ { NWSE, NWSE, NWSE }, /* Button_Blue */ { NWSE, NWSE, NWSE }, /* Button_Green */ { NWSE, NWSE, NWSE }, /* Button_Red */ { NWSE, NWSE, NWSE }, /* Button_Brown */ { NWSE, NWSE, NWSE }, /* Teleport */ { NWSE, NWSE, NWSE }, /* Wall */ { 0, 0, 0 }, /* Wall_North */ { NORTH | WEST | EAST, NORTH | WEST | EAST, NORTH | WEST | EAST }, /* Wall_West */ { NORTH | WEST | SOUTH, NORTH | WEST | SOUTH, NORTH | WEST | SOUTH }, /* Wall_South */ { WEST | SOUTH | EAST, WEST | SOUTH | EAST, WEST | SOUTH | EAST }, /* Wall_East */ { NORTH | SOUTH | EAST, NORTH | SOUTH | EAST, NORTH | SOUTH | EAST }, /* Wall_Southeast */ { SOUTH | EAST, SOUTH | EAST, SOUTH | EAST }, /* HiddenWall_Perm */ { 0, 0, 0 }, /* HiddenWall_Temp */ { NWSE, 0, 0 }, /* BlueWall_Real */ { NWSE, 0, 0 }, /* BlueWall_Fake */ { NWSE, 0, 0 }, /* SwitchWall_Open */ { NWSE, NWSE, NWSE }, /* SwitchWall_Closed */ { 0, 0, 0 }, /* PopupWall */ { NWSE, 0, 0 }, /* CloneMachine */ { 0, 0, 0 }, /* Door_Red */ { NWSE, 0, 0 }, /* Door_Blue */ { NWSE, 0, 0 }, /* Door_Yellow */ { NWSE, 0, 0 }, /* Door_Green */ { NWSE, 0, 0 }, /* Socket */ { NWSE, 0, 0 }, /* Exit */ { NWSE, NWSE, 0 }, /* ICChip */ { NWSE, 0, 0 }, /* Key_Red */ { NWSE, NWSE, NWSE }, /* Key_Blue */ { NWSE, NWSE, NWSE }, /* Key_Yellow */ { NWSE, NWSE, NWSE }, /* Key_Green */ { NWSE, NWSE, NWSE }, /* Boots_Ice */ { NWSE, NWSE, 0 }, /* Boots_Slide */ { NWSE, NWSE, 0 }, /* Boots_Fire */ { NWSE, NWSE, 0 }, /* Boots_Water */ { NWSE, NWSE, 0 }, /* Block_Static */ { NWSE, 0, 0 }, /* Drowned_Chip */ { 0, 0, 0 }, /* Burned_Chip */ { 0, 0, 0 }, /* Bombed_Chip */ { 0, 0, 0 }, /* Exited_Chip */ { 0, 0, 0 }, /* Exit_Extra_1 */ { 0, 0, 0 }, /* Exit_Extra_2 */ { 0, 0, 0 }, /* Overlay_Buffer */ { 0, 0, 0 }, /* Floor_Reserved2 */ { 0, 0, 0 }, /* Floor_Reserved1 */ { 0, 0, 0 }, }; /* Including the flag CMM_NOLEAVECHECK in a call to canmakemove() * indicates that the tile the creature is moving out of is * automatically presumed to permit such movement. CMM_NOEXPOSEWALLS * causes blue and hidden walls to remain unexposed. * CMM_CLONECANTBLOCK means that the creature will not be prevented * from moving by an identical creature standing in the way. * CMM_NOPUSHING prevents Chip from pushing blocks inside this * function. CMM_TELEPORTPUSH indicates to the block-pushing logic * that Chip is teleporting. This prevents a stack of two blocks from * being treated as a single block, and allows Chip to push a slipping * block away from him. Finally, CMM_NODEFERBUTTONS causes buttons * pressed by pushed blocks to take effect immediately. */ #define CMM_NOLEAVECHECK 0x0001 #define CMM_NOEXPOSEWALLS 0x0002 #define CMM_CLONECANTBLOCK 0x0004 #define CMM_NOPUSHING 0x0008 #define CMM_TELEPORTPUSH 0x0010 #define CMM_NODEFERBUTTONS 0x0020 /* Move a block at the given position forward in the given direction. * FALSE is returned if the block cannot be pushed. */ static int pushblock(int pos, int dir, int flags) { creature *cr; int slipdir, r; _assert(cellat(pos)->top.id == Block_Static); _assert(dir != NIL); cr = lookupblock(pos); if (!cr) { warn("%d: attempt to push disembodied block!", currenttime()); return FALSE; } if (cr->state & (CS_SLIP | CS_SLIDE)) { slipdir = getslipdir(cr); if (dir == slipdir || dir == back(slipdir)) if (!(flags & CMM_TELEPORTPUSH)) return FALSE; } if (flags & CMM_NOPUSHING) return FALSE; if (!(flags & CMM_TELEPORTPUSH) && cellat(pos)->bot.id == Block_Static) cellat(pos)->bot.id = Empty; if (!(flags & CMM_NODEFERBUTTONS)) cr->state |= CS_DEFERPUSH; r = advancecreature(cr, dir); if (!(flags & CMM_NODEFERBUTTONS)) cr->state &= ~CS_DEFERPUSH; if (!r) cr->state &= ~(CS_SLIP | CS_SLIDE); return r; } /* Return TRUE if the given creature is allowed to attempt to move in * the given direction. Side effects can and will occur from calling * this function, as indicated by flags. */ static int canmakemove(creature const *cr, int dir, int flags) { int to; int floor; int id, y, x; _assert(cr); _assert(dir != NIL); y = cr->pos / CXGRID; x = cr->pos % CXGRID; y += dir == NORTH ? -1 : dir == SOUTH ? +1 : 0; x += dir == WEST ? -1 : dir == EAST ? +1 : 0; if (y < 0 || y >= CYGRID || x < 0 || x >= CXGRID) return FALSE; to = y * CXGRID + x; if (!(flags & CMM_NOLEAVECHECK)) { switch (cellat(cr->pos)->bot.id) { case Wall_North: if (dir == NORTH) return FALSE; break; case Wall_West: if (dir == WEST) return FALSE; break; case Wall_South: if (dir == SOUTH) return FALSE; break; case Wall_East: if (dir == EAST) return FALSE; break; case Wall_Southeast: if (dir == SOUTH || dir == EAST) return FALSE; break; case Beartrap: if (!(cr->state & CS_RELEASED)) return FALSE; break; } } floor = floorat(to); if (isanimation(floor)) warn("What the hell is going on here? animation %02X at (%d %d)", floor, to % CXGRID, to / CXGRID); if (isanimation(floor)) return FALSE; if (cr->id == Chip) { floor = floorat(to); if (!(movelaws[floor].chip & dir)) return FALSE; if (floor == Socket && chipsneeded() > 0) return FALSE; if (isdoor(floor) && !possession(floor)) return FALSE; if (iscreature(cellat(to)->top.id)) { id = creatureid(cellat(to)->top.id); if (id == Chip || id == Swimming_Chip || id == Block) return FALSE; } if (floor == HiddenWall_Temp || floor == BlueWall_Real) { if (!(flags & CMM_NOEXPOSEWALLS)) getfloorat(to)->id = Wall; return FALSE; } if (floor == Block_Static) { if (!pushblock(to, dir, flags)) return FALSE; else if (flags & CMM_NOPUSHING) return TRUE; if ((flags & CMM_TELEPORTPUSH) && floorat(to) == Block_Static && cellat(to)->bot.id == Empty) return TRUE; return canmakemove(cr, dir, flags | CMM_NOPUSHING); } } else if (cr->id == Block) { floor = cellat(to)->top.id; if (iscreature(floor)) { id = creatureid(floor); return id == Chip || id == Swimming_Chip; } if (!(movelaws[floor].block & dir)) return FALSE; } else { floor = cellat(to)->top.id; if (iscreature(floor)) { id = creatureid(floor); if (id == Chip || id == Swimming_Chip) { floor = cellat(to)->bot.id; if (iscreature(floor)) { id = creatureid(floor); return id == Chip || id == Swimming_Chip; } } } if (iscreature(floor)) { if ((flags & CMM_CLONECANTBLOCK) && floor == crtile(cr->id, cr->dir)) return TRUE; return FALSE; } if (!(movelaws[floor].creature & dir)) return FALSE; if (floor == Fire && (cr->id == Bug || cr->id == Walker)) return FALSE; } if (cellat(to)->bot.id == CloneMachine) return FALSE; return TRUE; } /* * How everyone selects their move. */ /* This function embodies the movement behavior of all the creatures. * Given a creature, this function enumerates its desired direction of * movement and selects the first one that is permitted. Note that * calling this function also updates the current controller * direction. */ static void choosecreaturemove(creature *cr) { int choices[4] = { NIL, NIL, NIL, NIL }; int dir, pdir; int floor; int y, x, m, n; cr->tdir = NIL; if (cr->hidden) return; if (cr->id == Block) return; if (currenttime() & 2) return; if (cr->id == Teeth || cr->id == Blob) { if ((currenttime() + stepping()) & 4) return; } if (cr->state & CS_TURNING) { cr->state &= ~(CS_TURNING | CS_HASMOVED); updatecreature(cr); } if (cr->state & CS_HASMOVED) { controllerdir() = NIL; return; } if (cr->state & (CS_SLIP | CS_SLIDE)) return; floor = floorat(cr->pos); pdir = dir = cr->dir; if (floor == CloneMachine || floor == Beartrap) { switch (cr->id) { case Tank: case Ball: case Glider: case Fireball: case Walker: choices[0] = dir; break; case Blob: choices[0] = dir; choices[1] = left(dir); choices[2] = back(dir); choices[3] = right(dir); randomp4(mainprng(), choices); break; case Bug: case Paramecium: case Teeth: choices[0] = controllerdir(); cr->tdir = controllerdir(); return; break; default: warn("Non-creature %02X trying to move", cr->id); _assert(!"Unknown creature trying to move"); break; } } else { switch (cr->id) { case Tank: choices[0] = dir; break; case Ball: choices[0] = dir; choices[1] = back(dir); break; case Glider: choices[0] = dir; choices[1] = left(dir); choices[2] = right(dir); choices[3] = back(dir); break; case Fireball: choices[0] = dir; choices[1] = right(dir); choices[2] = left(dir); choices[3] = back(dir); break; case Walker: choices[0] = dir; choices[1] = left(dir); choices[2] = back(dir); choices[3] = right(dir); randomp3(mainprng(), choices + 1); break; case Blob: choices[0] = dir; choices[1] = left(dir); choices[2] = back(dir); choices[3] = right(dir); randomp4(mainprng(), choices); break; case Bug: choices[0] = left(dir); choices[1] = dir; choices[2] = right(dir); choices[3] = back(dir); break; case Paramecium: choices[0] = right(dir); choices[1] = dir; choices[2] = left(dir); choices[3] = back(dir); break; case Teeth: y = chippos() / CXGRID - cr->pos / CXGRID; x = chippos() % CXGRID - cr->pos % CXGRID; n = y < 0 ? NORTH : y > 0 ? SOUTH : NIL; if (y < 0) y = -y; m = x < 0 ? WEST : x > 0 ? EAST : NIL; if (x < 0) x = -x; if (x > y) { choices[0] = m; choices[1] = n; } else { choices[0] = n; choices[1] = m; } pdir = choices[2] = choices[0]; break; default: warn("Non-creature %02X trying to move", cr->id); _assert(!"Unknown creature trying to move"); break; } } for (n = 0 ; n < 4 && choices[n] != NIL ; ++n) { cr->tdir = choices[n]; controllerdir() = cr->tdir; if (canmakemove(cr, choices[n], 0)) return; } if (cr->id == Tank) { if ((cr->state & CS_RELEASED) || (floor != Beartrap && floor != CloneMachine)) cr->state |= CS_HASMOVED; } cr->tdir = pdir; } /* Select a direction for Chip to move towards the goal position. */ static int chipmovetogoalpos(void) { creature *cr; int dir, d1, d2; int x, y; if (!hasgoal()) return NIL; cr = getchip(); if (goalpos() == cr->pos) { cancelgoal(); return NIL; } y = goalpos() / CXGRID - cr->pos / CXGRID; x = goalpos() % CXGRID - cr->pos % CXGRID; d1 = y < 0 ? NORTH : y > 0 ? SOUTH : NIL; if (y < 0) y = -y; d2 = x < 0 ? WEST : x > 0 ? EAST : NIL; if (x < 0) x = -x; if (x > y) { dir = d1; d1 = d2; d2 = dir; } if (d1 != NIL && d2 != NIL) dir = canmakemove(cr, d1, 0) ? d1 : d2; else dir = d2 == NIL ? d1 : d2; return dir; } /* Translate a map position into a packed location relative to Chip. */ static int makemouserelative(int abspos) { int x, y; x = abspos % CXGRID - chippos() % CXGRID; y = abspos / CXGRID - chippos() / CXGRID; _assert(x >= MOUSERANGEMIN && x <= MOUSERANGEMAX); _assert(y >= MOUSERANGEMIN && y <= MOUSERANGEMAX); return (y - MOUSERANGEMIN) * MOUSERANGE + (x - MOUSERANGEMIN); } /* Unpack a Chip-relative map location. */ static int makemouseabsolute(int relpos) { int x, y; x = relpos % MOUSERANGE + MOUSERANGEMIN; y = relpos / MOUSERANGE + MOUSERANGEMIN; return chippos() + y * CXGRID + x; } /* Determine the direction of Chip's next move. If discard is TRUE, * then Chip is not currently permitted to select a direction of * movement, and the player's input should not be retained. */ static void choosechipmove(creature *cr, int discard) { int dir; cr->tdir = NIL; if (cr->hidden) return; if (!(currenttime() & 3)) cr->state &= ~CS_HASMOVED; if (cr->state & CS_HASMOVED) { if (currentinput() != NIL && hasgoal()) { cancelgoal(); lastmove() = CmdMoveNop; } return; } dir = currentinput(); currentinput() = NIL; if (discard || ((cr->state & CS_SLIDE) && dir == cr->dir)) { if (currenttime() && !(currenttime() & 1)) cancelgoal(); return; } if (dir >= CmdAbsMouseMoveFirst && dir <= CmdAbsMouseMoveLast) { goalpos() = dir - CmdAbsMouseMoveFirst; lastmove() = CmdMouseMoveFirst + makemouserelative(goalpos()); dir = NIL; } else if (dir >= CmdMouseMoveFirst && dir <= CmdMouseMoveLast) { lastmove() = dir; goalpos() = makemouseabsolute(dir - CmdMouseMoveFirst); dir = NIL; } else { if ((dir & (NORTH | SOUTH)) && (dir & (EAST | WEST))) dir &= NORTH | SOUTH; lastmove() = dir; } if (dir == NIL && hasgoal() && currenttime() && !(currenttime() & 1)) dir = chipmovetogoalpos(); cr->tdir = dir; } /* Teleport the given creature instantaneously from the teleport tile * at start to another teleport tile (if possible). */ static int teleportcreature(creature *cr, int start) { maptile *tile; int dest, origpos, f; _assert(!cr->hidden); if (cr->dir == NIL) { warn("%d: directionless creature %02X on teleport at (%d %d)", currenttime(), cr->id, cr->pos % CXGRID, cr->pos / CXGRID); return NIL; } origpos = cr->pos; dest = start; for (;;) { --dest; if (dest < 0) dest += CXGRID * CYGRID; if (dest == start) break; tile = &cellat(dest)->top; if (tile->id != Teleport || (tile->state & FS_BROKEN)) continue; cr->pos = dest; f = canmakemove(cr, cr->dir, CMM_NOLEAVECHECK | CMM_NOEXPOSEWALLS | CMM_NODEFERBUTTONS | CMM_TELEPORTPUSH); cr->pos = origpos; if (f) break; } return dest; } /* Determine the move(s) a creature will make on the current tick. */ static void choosemove(creature *cr) { if (cr->id == Chip) { choosechipmove(cr, cr->state & CS_SLIP); } else { if (cr->state & CS_SLIP) cr->tdir = NIL; else choosecreaturemove(cr); } } /* Initiate the cloning of a creature. */ static void activatecloner(int buttonpos) { creature dummy; creature *cr; int pos, tileid; pos = clonerfrombutton(buttonpos); if (pos < 0 || pos >= CXGRID * CYGRID) return; tileid = cellat(pos)->top.id; if (!iscreature(tileid) || creatureid(tileid) == Chip) return; if (creatureid(tileid) == Block) { cr = lookupblock(pos); if (cr->dir != NIL) advancecreature(cr, cr->dir); } else { if (cellat(pos)->bot.state & FS_CLONING) return; memset(&dummy, 0, sizeof dummy); dummy.id = creatureid(tileid); dummy.dir = creaturedirid(tileid); dummy.pos = pos; if (!canmakemove(&dummy, dummy.dir, CMM_CLONECANTBLOCK)) return; cr = awakencreature(pos); if (!cr) return; cr->state |= CS_CLONING; if (cellat(pos)->bot.id == CloneMachine) cellat(pos)->bot.state |= FS_CLONING; } } /* Open a bear trap. Any creature already in the trap is released. */ static void springtrap(int buttonpos) { creature *cr; int pos, id; pos = trapfrombutton(buttonpos); if (pos < 0) return; if (pos >= CXGRID * CYGRID) { warn("Off-map trap opening attempted: (%d %d)", pos % CXGRID, pos / CXGRID); return; } id = cellat(pos)->top.id; if (id == Block_Static || (cellat(pos)->bot.state & FS_HASMUTANT)) { cr = lookupblock(pos); if (cr) cr->state |= CS_RELEASED; } else if (iscreature(id)) { cr = lookupcreature(pos, TRUE); if (cr) cr->state |= CS_RELEASED; } } /* Mark all buttons everywhere as having been handled. */ static void resetbuttons(void) { int pos; for (pos = 0 ; pos < CXGRID * CYGRID ; ++pos) { cellat(pos)->top.state &= ~FS_BUTTONDOWN; cellat(pos)->bot.state &= ~FS_BUTTONDOWN; } } /* Apply the effects of all deferred button presses, if any. */ static void handlebuttons(void) { int pos, id; for (pos = 0 ; pos < CXGRID * CYGRID ; ++pos) { if (cellat(pos)->top.state & FS_BUTTONDOWN) { cellat(pos)->top.state &= ~FS_BUTTONDOWN; id = cellat(pos)->top.id; } else if (cellat(pos)->bot.state & FS_BUTTONDOWN) { cellat(pos)->bot.state &= ~FS_BUTTONDOWN; id = cellat(pos)->bot.id; } else { continue; } switch (id) { case Button_Blue: addsoundeffect(SND_BUTTON_PUSHED); turntanks(NULL); break; case Button_Green: togglewalls(); break; case Button_Red: activatecloner(pos); addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Brown: springtrap(pos); addsoundeffect(SND_BUTTON_PUSHED); break; default: warn("Fooey! Tile %02X is not a button!", id); break; } } } /* * When something actually moves. */ /* Initiate a move by the given creature in the given direction. * Return FALSE if the creature cannot initiate the indicated move * (side effects may still occur). */ static int startmovement(creature *cr, int dir) { int floor; _assert(dir != NIL); floor = cellat(cr->pos)->bot.id; if (!canmakemove(cr, dir, 0)) { if (cr->id == Chip || (floor != Beartrap && floor != CloneMachine && !(cr->state & CS_SLIP))) { cr->dir = dir; updatecreature(cr); } return FALSE; } if (floor == Beartrap) { _assert(cr->state & CS_RELEASED); if (cr->state & CS_MUTANT) cellat(cr->pos)->bot.state &= ~FS_HASMUTANT; } cr->state &= ~CS_RELEASED; cr->dir = dir; return TRUE; } /* Complete the movement of the given creature. Most side effects * produced by moving onto a tile occur at this point. This function * is also the only place where a creature can be added to the slip * list. */ static void endmovement(creature *cr, int dir) { static int const delta[] = { 0, -CXGRID, -1, 0, +CXGRID, 0, 0, 0, +1 }; mapcell *cell; maptile *tile; int dead = FALSE; int wasslipping; int oldpos, newpos; int floor, i; oldpos = cr->pos; newpos = cr->pos + delta[dir]; cell = cellat(newpos); tile = &cell->top; floor = tile->id; if (cr->id == Chip) { switch (floor) { case Empty: poptile(newpos); break; case Water: if (!possession(Boots_Water)) chipstatus() = CHIP_DROWNED; break; case Fire: if (!possession(Boots_Fire)) chipstatus() = CHIP_BURNED; break; case Dirt: poptile(newpos); break; case BlueWall_Fake: poptile(newpos); break; case PopupWall: tile->id = Wall; break; case Door_Red: case Door_Blue: case Door_Yellow: case Door_Green: _assert(possession(floor)); if (floor != Door_Green) --possession(floor); poptile(newpos); addsoundeffect(SND_DOOR_OPENED); break; case Boots_Ice: case Boots_Slide: case Boots_Fire: case Boots_Water: case Key_Red: case Key_Blue: case Key_Yellow: case Key_Green: if (iscreature(cell->bot.id)) chipstatus() = CHIP_COLLIDED; ++possession(floor); poptile(newpos); addsoundeffect(SND_ITEM_COLLECTED); break; case Burglar: possession(Boots_Ice) = 0; possession(Boots_Slide) = 0; possession(Boots_Fire) = 0; possession(Boots_Water) = 0; addsoundeffect(SND_BOOTS_STOLEN); break; case ICChip: if (chipsneeded()) --chipsneeded(); poptile(newpos); addsoundeffect(SND_IC_COLLECTED); break; case Socket: _assert(chipsneeded() == 0); poptile(newpos); addsoundeffect(SND_SOCKET_OPENED); break; case Bomb: chipstatus() = CHIP_BOMBED; addsoundeffect(SND_BOMB_EXPLODES); break; default: if (iscreature(floor)) chipstatus() = CHIP_COLLIDED; break; } } else if (cr->id == Block) { switch (floor) { case Empty: poptile(newpos); break; case Water: tile->id = Dirt; dead = TRUE; addsoundeffect(SND_WATER_SPLASH); break; case Bomb: tile->id = Empty; dead = TRUE; addsoundeffect(SND_BOMB_EXPLODES); break; case Teleport: if (!(tile->state & FS_BROKEN)) newpos = teleportcreature(cr, newpos); break; } } else { if (iscreature(cell->top.id)) { tile = &cell->bot; floor = cell->bot.id; } switch (floor) { case Water: if (cr->id != Glider) dead = TRUE; break; case Fire: if (cr->id != Fireball) dead = TRUE; break; case Bomb: cell->top.id = Empty; dead = TRUE; addsoundeffect(SND_BOMB_EXPLODES); break; case Teleport: if (!(tile->state & FS_BROKEN)) newpos = teleportcreature(cr, newpos); break; } } if (cellat(oldpos)->bot.id != CloneMachine || cr->id == Chip) poptile(oldpos); if (dead) { removecreature(cr); if (cellat(oldpos)->bot.id == CloneMachine) cellat(oldpos)->bot.state &= ~FS_CLONING; return; } if (cr->id == Chip && floor == Teleport && !(tile->state & FS_BROKEN)) { i = newpos; newpos = teleportcreature(cr, newpos); if (newpos != i) { addsoundeffect(SND_TELEPORTING); if (floorat(newpos) == Block_Static) { if (lastslipdir() == NIL) { cr->dir = NORTH; lookupblock(newpos)->state |= CS_MUTANT; cellat(newpos)->top.id = crtile(Chip, NORTH); floor = Empty; } else { cr->dir = lastslipdir(); } } } } cr->pos = newpos; addcreaturetomap(cr); cr->pos = oldpos; tile = &cell->bot; switch (floor) { case Button_Blue: if (cr->state & CS_DEFERPUSH) tile->state |= FS_BUTTONDOWN; else turntanks(cr); addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Green: if (cr->state & CS_DEFERPUSH) tile->state |= FS_BUTTONDOWN; else togglewalls(); break; case Button_Red: if (cr->state & CS_DEFERPUSH) tile->state |= FS_BUTTONDOWN; else activatecloner(newpos); addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Brown: if (cr->state & CS_DEFERPUSH) tile->state |= FS_BUTTONDOWN; else springtrap(newpos); addsoundeffect(SND_BUTTON_PUSHED); break; } cr->pos = newpos; if (cellat(oldpos)->bot.id == CloneMachine) cellat(oldpos)->bot.state &= ~FS_CLONING; if (floor == Beartrap) { if (istrapopen(newpos, oldpos)) cr->state |= CS_RELEASED; } else if (cellat(newpos)->bot.id == Beartrap) { for (i = 0 ; i < traplistsize() ; ++i) { if (traplist()[i].to == newpos) { cr->state |= CS_RELEASED; break; } } } if (cr->id == Chip) { if (goalpos() == cr->pos) cancelgoal(); if (chipstatus() != CHIP_OKAY) return; if (cell->bot.id == Exit) { completed() = TRUE; return; } } else { if (iscreature(cell->bot.id)) { if (creatureid(cell->bot.id) == Chip || creatureid(cell->bot.id) == Swimming_Chip) { chipstatus() = CHIP_COLLIDED; return; } } } wasslipping = cr->state & (CS_SLIP | CS_SLIDE); if (floor == Teleport) startfloormovement(cr, floor); else if (isice(floor) && (cr->id != Chip || !possession(Boots_Ice))) startfloormovement(cr, floor); else if (isslide(floor) && (cr->id != Chip || !possession(Boots_Slide))) startfloormovement(cr, floor); else if (floor == Beartrap && cr->id == Block && wasslipping) { startfloormovement(cr, floor); if (cr->state & CS_MUTANT) cell->bot.state |= FS_HASMUTANT; } else cr->state &= ~(CS_SLIP | CS_SLIDE); if (!wasslipping && (cr->state & (CS_SLIP | CS_SLIDE)) && cr->id != Chip) controllerdir() = getslipdir(cr); } /* Move the given creature in the given direction. */ static int advancecreature(creature *cr, int dir) { if (dir == NIL) return TRUE; if (cr->id == Chip) chipwait() = 0; if (!startmovement(cr, dir)) { if (cr->id == Chip) { addsoundeffect(SND_CANT_MOVE); resetbuttons(); cancelgoal(); } return FALSE; } endmovement(cr, dir); if (cr->id == Chip) handlebuttons(); return TRUE; } /* Return TRUE if gameplay is over. */ static int checkforending(void) { if (chipstatus() != CHIP_OKAY) { addsoundeffect(SND_CHIP_LOSES); return -1; } if (completed()) { addsoundeffect(SND_CHIP_WINS); return +1; } return 0; } /* * Automatic activities. */ /* Execute all forced moves for creatures on the slip list. */ static void floormovements(void) { creature *cr; int floor, slipdir; int savedcount, n; for (n = 0 ; n < slipcount ; ++n) { savedcount = slipcount; cr = slips[n].cr; if (!(slips[n].cr->state & (CS_SLIP | CS_SLIDE))) continue; slipdir = getslipdir(cr); if (slipdir == NIL) continue; if (advancecreature(cr, slipdir)) { if (cr->id == Chip) { cr->state &= ~CS_HASMOVED; lastslipdir() = slipdir; } } else { floor = cellat(cr->pos)->bot.id; if (isice(floor) || (floor == Teleport && cr->id == Chip)) { slipdir = icewallturn(floor, back(slipdir)); if (advancecreature(cr, slipdir)) { if (cr->id == Chip) cr->state &= ~CS_HASMOVED; } } else if (isslide(floor)) { if (cr->id == Chip) cr->state &= ~CS_HASMOVED; } if (cr->state & (CS_SLIP | CS_SLIDE)) { endfloormovement(cr); startfloormovement(cr, cellat(cr->pos)->bot.id); } } if (checkforending()) return; if (!(cr->state & (CS_SLIP | CS_SLIDE)) && cr->id != Chip && slipcount == savedcount + 1) ++n; } } static void createclones(void) { int n; for (n = 0 ; n < creaturecount ; ++n) if (creatures[n]->state & CS_CLONING) creatures[n]->state &= ~CS_CLONING; } #ifndef NDEBUG /* * Debugging functions. */ /* Print out a rough image of the level and the list of creatures. */ static void dumpmap(void) { creature *cr; int y, x; for (y = 0 ; y < CXGRID * CYGRID ; y += CXGRID) { for (x = 0 ; x < CXGRID ; ++x) fprintf(stderr, "%c%02x%02X%c", (cellat(y + x)->top.state ? ':' : '.'), cellat(y + x)->top.id, cellat(y + x)->bot.id, (cellat(y + x)->bot.state ? ':' : '.')); fputc('\n', stderr); } fputc('\n', stderr); for (y = 0 ; y < creaturecount ; ++y) { cr = creatures[y]; fprintf(stderr, "%02X%c (%d %d)", cr->id, "-^"[(int)cr->dir], cr->pos % CXGRID, cr->pos / CXGRID); for (x = 0 ; x < slipcount ; ++x) { if (cr == slips[x].cr) { fprintf(stderr, " [%d]", x + 1); break; } } fprintf(stderr, "%s%s%s%s%s%s%s%s%s", cr->hidden ? " hidden" : "", cr->state & CS_RELEASED ? " released" : "", cr->state & CS_CLONING ? " cloning" : "", cr->state & CS_HASMOVED ? " has-moved" : "", cr->state & CS_TURNING ? " turning" : "", cr->state & CS_SLIP ? " slipping" : "", cr->state & CS_SLIDE ? " sliding" : "", cr->state & CS_DEFERPUSH ? " deferred-push" : "", cr->state & CS_MUTANT ? " mutant" : ""); if (x < slipcount) fprintf(stderr, " %c", "-^"[(int)slips[x].dir]); fputc('\n', stderr); } for (y = 0 ; y < blockcount ; ++y) { cr = blocks[y]; fprintf(stderr, "block %d: (%d %d) %c", y, cr->pos % CXGRID, cr->pos / CXGRID, "-^"[(int)cr->dir]); for (x = 0 ; x < slipcount ; ++x) { if (cr == slips[x].cr) { fprintf(stderr, " [%d]", x + 1); break; } } fprintf(stderr, "%s%s%s%s%s%s%s%s%s", cr->hidden ? " hidden" : "", cr->state & CS_RELEASED ? " released" : "", cr->state & CS_CLONING ? " cloning" : "", cr->state & CS_HASMOVED ? " has-moved" : "", cr->state & CS_TURNING ? " turning" : "", cr->state & CS_SLIP ? " slipping" : "", cr->state & CS_SLIDE ? " sliding" : "", cr->state & CS_DEFERPUSH ? " deferred-push" : "", cr->state & CS_MUTANT ? " mutant" : ""); if (x < slipcount) fprintf(stderr, " %c", "-^"[(int)slips[x].dir]); fputc('\n', stderr); } } /* Run various sanity checks on the current game state. */ static void verifymap(void) { creature *cr; int n; for (n = 0 ; n < creaturecount ; ++n) { cr = creatures[n]; if (cr->id < 0x40 || cr->id >= 0x80) warn("%d: Undefined creature %02X at (%d %d)", state->currenttime, cr->id, cr->pos % CXGRID, cr->pos / CXGRID); if (!cr->hidden && (cr->pos < 0 || cr->pos >= CXGRID * CYGRID)) warn("%d: Creature %02X has left the map: (%d %d)", state->currenttime, cr->id, cr->pos % CXGRID, cr->pos / CXGRID); if (cr->dir > EAST && (cr->dir != NIL || cr->id != Block)) warn("%d: Creature %d lacks direction (%d)", state->currenttime, cr->id, cr->dir); } } #endif /* * Per-tick maintenance functions. */ /* Actions and checks that occur at the start of a tick. */ static void initialhousekeeping(void) { int n; #ifndef NDEBUG if (currentinput() == CmdDebugCmd2) { dumpmap(); exit(0); } else if (currentinput() == CmdDebugCmd1) { static int mark = 0; warn("Mark %d (%d).", ++mark, currenttime()); currentinput() = NIL; } verifymap(); if (currentinput() >= CmdCheatNorth && currentinput() <= CmdCheatICChip) { switch (currentinput()) { case CmdCheatNorth: --yviewoffset(); break; case CmdCheatWest: --xviewoffset(); break; case CmdCheatSouth: ++yviewoffset(); break; case CmdCheatEast: ++xviewoffset(); break; case CmdCheatHome: xviewoffset()=yviewoffset()=0; break; case CmdCheatKeyRed: ++possession(Key_Red); break; case CmdCheatKeyBlue: ++possession(Key_Blue); break; case CmdCheatKeyYellow: ++possession(Key_Yellow); break; case CmdCheatKeyGreen: ++possession(Key_Green); break; case CmdCheatBootsIce: ++possession(Boots_Ice); break; case CmdCheatBootsSlide: ++possession(Boots_Slide); break; case CmdCheatBootsFire: ++possession(Boots_Fire); break; case CmdCheatBootsWater: ++possession(Boots_Water); break; case CmdCheatICChip: if (chipsneeded()) --chipsneeded(); break; } currentinput() = NIL; setnosaving(); } #endif if (currenttime() == 0) laststepping = stepping(); if (!(currenttime() & 3)) { for (n = 1 ; n < creaturecount ; ++n) { if (creatures[n]->state & CS_TURNING) { creatures[n]->state &= ~(CS_TURNING | CS_HASMOVED); updatecreature(creatures[n]); } } ++chipwait(); if (chipwait() > 3) { chipwait() = 3; getchip()->dir = SOUTH; updatecreature(getchip()); } } } /* Actions and checks that occur at the end of a tick. */ static void finalhousekeeping(void) { return; } static void preparedisplay(void) { int pos; pos = chippos(); if (cellat(pos)->bot.id == HintButton) showhint(); else hidehint(); xviewpos() = (pos % CXGRID) * 8 + xviewoffset() * 8; yviewpos() = (pos / CYGRID) * 8 + yviewoffset() * 8; } /* * The functions provided by the gamelogic struct. */ /* Initialize the gamestate structure to the state at the beginning of * the level, using the data in the associated gamesetup structure. * The level map is decoded and assembled, the lists of beartraps, * clone machines, and active creatures are drawn up, and other * miscellaneous initializations are performed. */ static int initgame(gamelogic *logic) { static creature dummycrlist; mapcell *cell; xyconn *xy; creature *cr; creature *chip; int pos, num, n; setstate(logic); num = state->game->number; state->statusflags &= ~SF_BADTILES; state->statusflags |= SF_NOANIMATION; for (pos = 0, cell = state->map ; pos < CXGRID * CYGRID ; ++pos, ++cell) { if (isfloor(cell->top.id) || creatureid(cell->top.id) == Chip || creatureid(cell->top.id) == Block) if (cell->bot.id == Teleport || cell->bot.id == SwitchWall_Open || cell->bot.id == SwitchWall_Closed) cell->bot.state |= FS_BROKEN; } chip = allocatecreature(); chip->pos = 0; chip->id = Chip; chip->dir = SOUTH; addtocreaturelist(chip); for (n = 0 ; n < state->crlistcount ; ++n) { pos = state->crlist[n]; if (pos < 0 || pos >= CXGRID * CYGRID) { warn("level %d: invalid creature location (%d %d)", num, pos % CXGRID, pos / CXGRID); continue; } cell = cellat(pos); if (!iscreature(cell->top.id)) { warn("level %d: no creature at location (%d %d)", num, pos % CXGRID, pos / CXGRID); continue; } if (creatureid(cell->top.id) != Block && cell->bot.id != CloneMachine) { cr = allocatecreature(); cr->pos = pos; cr->id = creatureid(cell->top.id); cr->dir = creaturedirid(cell->top.id); addtocreaturelist(cr); if (iscreature(cell->bot.id) && creatureid(cell->bot.id) == Chip) { chip->pos = pos; chip->dir = creaturedirid(cell->bot.id); } } cell->top.state |= FS_MARKER; } for (pos = 0, cell = state->map ; pos < CXGRID * CYGRID ; ++pos, ++cell) { if (cell->top.state & FS_MARKER) { cell->top.state &= ~FS_MARKER; } else if (iscreature(cell->top.id) && creatureid(cell->top.id) == Chip) { chip->pos = pos; chip->dir = creaturedirid(cell->bot.id); } } dummycrlist.id = 0; state->creatures = &dummycrlist; state->initrndslidedir = NORTH; possession(Key_Red) = possession(Key_Blue) = possession(Key_Yellow) = possession(Key_Green) = 0; possession(Boots_Ice) = possession(Boots_Slide) = possession(Boots_Fire) = possession(Boots_Water) = 0; xy = traplist(); for (n = traplistsize(), xy = traplist() ; n ; --n, ++xy) if (istrapbuttondown(xy->from) || xy->to == chippos()) springtrap(xy->from); chipwait() = 0; completed() = FALSE; chipstatus() = CHIP_OKAY; controllerdir() = NIL; lastslipdir() = NIL; stepping() = laststepping; cancelgoal(); xviewoffset() = 0; yviewoffset() = 0; preparedisplay(); return TRUE; } /* Advance the game state by one tick. */ static int advancegame(gamelogic *logic) { creature *cr; int r = 0; int n; setstate(logic); timeoffset() = -1; initialhousekeeping(); if (currenttime() && !(currenttime() & 1)) { controllerdir() = NIL; for (n = 0 ; n < creaturecount ; ++n) { cr = creatures[n]; if (cr->hidden || (cr->state & CS_CLONING) || cr->id == Chip) continue; choosemove(cr); if (cr->tdir != NIL) advancecreature(cr, cr->tdir); } if ((r = checkforending())) goto done; } if (currenttime() && !(currenttime() & 1)) { floormovements(); if ((r = checkforending())) goto done; } updatesliplist(); timeoffset() = 0; if (timelimit()) { if (currenttime() >= timelimit()) { chipstatus() = CHIP_OUTOFTIME; addsoundeffect(SND_TIME_OUT); return -1; } else if (timelimit() - currenttime() <= 15 * TICKS_PER_SECOND && currenttime() % TICKS_PER_SECOND == 0) addsoundeffect(SND_TIME_LOW); } cr = getchip(); choosemove(cr); if (cr->tdir != NIL) { if (advancecreature(cr, cr->tdir)) if ((r = checkforending())) goto done; cr->state |= CS_HASMOVED; } updatesliplist(); createclones(); done: finalhousekeeping(); preparedisplay(); return r; } /* Free resources associated with the current game state. */ static int endgame(gamelogic *logic) { (void)logic; resetcreaturepool(); resetcreaturelist(); resetblocklist(); resetsliplist(); return TRUE; } /* Free all allocated resources for this module. */ static void shutdown(gamelogic *logic) { (void)logic; free(creatures); creatures = NULL; creaturecount = 0; creaturesallocated = 0; free(blocks); blocks = NULL; blockcount = 0; blocksallocated = 0; free(slips); slips = NULL; slipcount = 0; slipsallocated = 0; resetcreaturepool(); freecreaturepool(); creaturepool = NULL; creaturepoolend = NULL; } /* The exported function: Initialize and return the module's gamelogic * structure. */ gamelogic *mslogicstartup(void) { static gamelogic logic; logic.ruleset = Ruleset_MS; logic.initgame = initgame; logic.advancegame = advancegame; logic.endgame = endgame; logic.shutdown = shutdown; return &logic; } tworld-1.3.0/oshw.h0000644000175000017500000002776210416667207014344 0ustar breadboxbreadbox/* oshw.h: Platform-specific functions that talk with the OS/hardware. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _oshw_h_ #define _oshw_h_ #include #include "gen.h" /* This is the declaration of the top layer's main function. It is * called directly from the real main() inside the OS/hardware layer. */ extern int tworld(int argc, char *argv[]); /* Initialize the OS/hardware interface. This function must be called * before any others in the oshw library. If silence is TRUE, the * sound system will be disabled, as if no soundcard was present. If * showhistogram is TRUE, then during shutdown the timer module will * send a histogram to stdout describing the amount of time the * program explicitly yielded to other processes. (This feature is for * debugging purposes.) soundbufsize is a number between 0 and 3 which * is used to scale the size of the sound buffer. A larger number is * more efficient, but pushes the sound effects farther out of * synchronization with the video. */ extern int oshwinitialize(int silence, int soundbufsize, int showhistogram, int fullscreen); /* * Timer functions. */ /* Control the timer depending on the value of action. A negative * value turns off the timer if it is running and resets the counter * to zero. A zero value turns off the timer but does not reset the * counter. A positive value starts (or resumes) the timer. */ extern void settimer(int action); /* Set the length (in real time) of a second of game time. A value of * zero selects the default of 1000 milliseconds. */ extern void settimersecond(int ms); /* Return the number of ticks since the timer was last reset. */ extern int gettickcount(void); /* Put the program to sleep until the next timer tick. */ extern int waitfortick(void); /* Force the timer to advance to the next tick. */ extern int advancetick(void); /* * Keyboard input functions. */ /* Turn keyboard repeat on or off. If enable is TRUE, the keys other * than the direction keys will repeat at the standard rate. */ extern int setkeyboardrepeat(int enable); /* Alter the behavior of the keys used to indicate movement in the * game. If enable is TRUE, the direction keys repeat whenever the * program polls the keyboard. Otherwise, the direction keys do not * repeat until the program polls the keyboard three times. */ extern int setkeyboardarrowsrepeat(int enable); /* Turn input mode on or off. In input mode, only the arrow and letter * keys are recognized. */ extern int setkeyboardinputmode(int enable); /* Return the latest/current keystroke. If wait is TRUE and no * keystrokes are pending, the function blocks until a keystroke * arrives. */ extern int input(int wait); /* Wait for a key to be pressed (any key, not just one recognized by * the program). The return value is FALSE if the key pressed is a * "quit" key. */ extern int anykey(void); /* Return a table suitable for displaying a help screen on the * available keyboard commands for the given context. */ extern tablespec const *keyboardhelp(int context); /* Symbolic values for requesting a specific help table. */ enum { KEYHELP_INGAME, KEYHELP_TWIXTGAMES, KEYHELP_FILELIST, KEYHELP_SCORELIST }; /* * Resource-loading functions. */ /* Extract the font stored in the given file and make it the current * font. FALSE is returned if the attempt was unsuccessful. If * complain is FALSE, no error messages will be displayed. */ extern int loadfontfromfile(char const *filename, int complain); /* Free all memory associated with the current font. */ extern void freefont(void); /* Extract the tile images stored in the given file and use them as * the current tile set. FALSE is returned if the attempt was * unsuccessful. If complain is FALSE, no error messages will be * displayed. */ extern int loadtileset(char const *filename, int complain); /* Free all memory associated with the current tile images. */ extern void freetileset(void); /* The font provides special monospaced digit characters at 144-153. */ enum { CHAR_MZERO = 144 }; /* * Video output functions. */ /* Create a display surface appropriate to the requirements of the * game (e.g., sized according to the tiles and the font). FALSE is * returned on error. */ extern int creategamedisplay(void); /* Select the colors used for drawing the display background, normal * text, bold (highlighted) text, and dim (grayed) text. The color * values are of the form 0x00RRGGBB. */ extern void setcolors(long bkgnd, long text, long bold, long dim); /* Fill the display with the background color. */ extern void cleardisplay(void); /* Display the current game state. timeleft and besttime provide the * current time on the clock and the best time recorded for the level, * measured in seconds. All other data comes from the gamestate * structure (referred to here as an opaque pointer). */ extern int displaygame(void const *state, int timeleft, int besttime); /* Display a short message appropriate to the end of a level's game * play. If the level was completed successfully, completed is TRUE, * and the other three arguments define the base score and time bonus * for the level, and the user's total score for the series; these * scores will be displayed to the user. */ extern int displayendmessage(int basescore, int timescore, long totalscore, int completed); /* Display a (very short) message for the given number of * milliseconds. bold indicates the number of milliseconds the * message is with highlighting. After that (if the message is * still visible) it is rendered as normal text. */ extern int setdisplaymsg(char const *msg, int msecs, int bold); /* Display a scrollable table. title provides a title to display. The * table's first row provides a set of column headers which will not * scroll. index points to the index of the item to be initially * selected; upon return, the value will hold the current selection. * inputcallback points to a function that is called to retrieve * input. The function is passed a pointer to an integer. If the * callback returns TRUE, this integer should be set to either a new * index value or one of the following enum values. This value will * then cause the selection to be changed, whereupon the display will * be updated before the callback is called again. If the callback * returns FALSE, the table is removed from the display, and the value * stored in the integer will become displaylist()'s return value. */ extern int displaylist(char const *title, void const *table, int *index, int (*inputcallback)(int*)); /* Symbolic values for requesting relative movement of the selection. */ enum { SCROLL_NOP = -1, SCROLL_UP = -2, SCROLL_DN = -3, SCROLL_PAGE_UP = -4, SCROLL_PAGE_DN = -5, SCROLL_HALFPAGE_UP = -6, SCROLL_HALFPAGE_DN = -7, SCROLL_ALLTHEWAY_UP = -8, SCROLL_ALLTHEWAY_DN = -9 }; /* Display an input prompt to the user. prompt supplies the prompt to * display, and input points to a buffer to hold the user's input. * maxlen sets a maximum length to the input that will be accepted. * The supplied callback function is called repeatedly to obtain * input. If the callback function returns a printable ASCII * character, the function will automatically append it to the string * stored in input. If '\b' is returned, the function will erase the * last character in input, if any. If '\f' is returned the function * will set input to "". If '\n' is returned, the input prompt is * erased and displayinputprompt() returns TRUE. If a negative value * is returned, the input prompt is erased and displayinputprompt() * returns FALSE. All other return values from the callback are * ignored. */ extern int displayinputprompt(char const *prompt, char *input, int maxlen, int (*inputcallback)(void)); /* * Sound functions. */ /* Activate or deactivate the sound system. The return value is TRUE * if the sound system is (or already was) active. */ extern int setaudiosystem(int active); /* Load a wave file into memory. index indicates which sound effect to * associate the sound with. FALSE is returned if an error occurs. */ extern int loadsfxfromfile(int index, char const *filename); /* Specify the sounds effects to be played at this time. sfx is the * bitwise-or of any number of sound effects. If a non-continuous * sound effect in sfx is already playing, it will be restarted. Any * continuous sound effects that are currently playing that are not * set in sfx will stop playing. */ extern void playsoundeffects(unsigned long sfx); /* Control sound-effect production depending on the value of action. * A negative value turns off all sound effects that are playing. A * zero value temporarily suspends the playing of sound effects. A * positive value continues the sound effects at the point at which * they were suspended. */ extern void setsoundeffects(int action); /* Set the current volume level. Volume ranges from 0 (silence) to 10 * (the default). Setting the sound to zero causes sound effects to be * displayed as textual onomatopoeia. If display is TRUE, the new * volume level will be displayed to the user. FALSE is returned if * the sound system is not currently active. */ extern int setvolume(int volume, int display); /* Alters the current volume level by delta. */ extern int changevolume(int delta, int display); /* Release all memory used for the given sound effect's wave data. */ extern void freesfx(int index); /* * Miscellaneous functions. */ /* Ring the bell. */ extern void ding(void); /* Set the program's subtitle. A NULL subtitle is equivalent to the * empty string. The subtitle is displayed in the window dressing (if * any). */ extern void setsubtitle(char const *subtitle); /* Display a message to the user. cfile and lineno can be NULL and 0 * respectively; otherwise, they identify the source code location * where this function was called from. prefix is an optional string * that is displayed before and/or apart from the body of the message. * fmt and args define the formatted text of the message body. action * indicates how the message should be presented. NOTIFY_LOG causes * the message to be displayed in a way that does not interfere with * the program's other activities. NOTIFY_ERR presents the message as * an error condition. NOTIFY_DIE should indicate to the user that the * program is about to shut down. */ extern void usermessage(int action, char const *prefix, char const *cfile, unsigned long lineno, char const *fmt, va_list args); /* Values used for the first argument of usermessage(). */ enum { NOTIFY_DIE, NOTIFY_ERR, NOTIFY_LOG }; /* Structure used to define text with illustrations. */ typedef struct tiletablerow { int isfloor; /* TRUE if the images are floor tiles */ int item1; /* first illustration */ int item2; /* second illustration */ char const *desc; /* text */ } tiletablerow; /* Displays a screenful of (hopefully) helpful information which * includes tile images. title provides the title of the display. rows * points to an array of tiletablerow structures. count specifies the * size of this array. The text of each row is displayed alongside one * or two tile images. completed controls the prompt that the user * sees at the bottom of the display. A positive value will indicate * that more text follows. A negative value will indicate that leaving * this screen will return to the prior display. A value of zero will * indicate that the current display is the end of a sequence. */ extern int displaytiletable(char const *title, tiletablerow const *rows, int count, int completed); /* Displays a screenful of (hopefully) helpful information. title * provides the title of the display. table points to a table that * contains the body of the text. completed controls the prompt that * the user sees at the bottom of the display; see the description of * displaytiletable() for details. */ extern int displaytable(char const *title, tablespec const *table, int completed); #endif tworld-1.3.0/play.c0000644000175000017500000002515710420557321014306 0ustar breadboxbreadbox/* play.c: Top-level game-playing functions. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include "defs.h" #include "err.h" #include "state.h" #include "encoding.h" #include "oshw.h" #include "res.h" #include "logic.h" #include "random.h" #include "solution.h" #include "unslist.h" #include "play.h" /* The current state of the current game. */ static gamestate state; /* The current logic module. */ static gamelogic *logic = NULL; /* TRUE if the program is running without a user interface. */ int batchmode = FALSE; /* How much mud to make the timer suck (i.e., the slowdown factor). */ static int mudsucking = 1; /* Turn on the pedantry. */ void setpedanticmode(void) { pedanticmode = TRUE; } /* Set the slowdown factor. */ int setmudsuckingfactor(int mud) { if (mud < 1) return FALSE; mudsucking = mud; return TRUE; } /* Configure the game logic, and some of the OS/hardware layer, as * required for the given ruleset. Do nothing if the requested ruleset * is already the current ruleset. */ static int setrulesetbehavior(int ruleset) { if (logic) { if (ruleset == logic->ruleset) return TRUE; (*logic->shutdown)(logic); logic = NULL; } if (ruleset == Ruleset_None) return TRUE; switch (ruleset) { case Ruleset_Lynx: logic = lynxlogicstartup(); if (!logic) return FALSE; setkeyboardarrowsrepeat(TRUE); settimersecond(1000 * mudsucking); break; case Ruleset_MS: logic = mslogicstartup(); if (!logic) return FALSE; setkeyboardarrowsrepeat(FALSE); settimersecond(1100 * mudsucking); break; default: errmsg(NULL, "unknown ruleset requested (ruleset=%d)", ruleset); return FALSE; } if (!batchmode) { if (!loadgameresources(ruleset) || !creategamedisplay()) { die("unable to proceed due to previous errors."); return FALSE; } } logic->state = &state; return TRUE; } /* Initialize the current state to the starting position of the * given level. */ int initgamestate(gamesetup *game, int ruleset) { if (!setrulesetbehavior(ruleset)) die("unable to initialize the system for the requested ruleset"); memset(state.map, 0, sizeof state.map); state.game = game; state.ruleset = ruleset; state.replay = -1; state.currenttime = -1; state.timeoffset = 0; state.currentinput = NIL; state.lastmove = NIL; state.initrndslidedir = NIL; state.stepping = -1; state.statusflags = 0; state.soundeffects = 0; state.timelimit = game->time * TICKS_PER_SECOND; initmovelist(&state.moves); resetprng(&state.mainprng); if (!expandleveldata(&state)) return FALSE; return (*logic->initgame)(logic); } /* Change the current state to run from the recorded solution. */ int prepareplayback(void) { solutioninfo solution; if (!state.game->solutionsize) return FALSE; solution.moves.list = NULL; solution.moves.allocated = 0; if (!expandsolution(&solution, state.game) || !solution.moves.count) return FALSE; destroymovelist(&state.moves); state.moves = solution.moves; restartprng(&state.mainprng, solution.rndseed); state.initrndslidedir = solution.rndslidedir; state.stepping = solution.stepping; state.replay = 0; return TRUE; } /* Return the amount of time passed in the current game, in seconds. */ int secondsplayed(void) { return (state.currenttime + state.timeoffset) / TICKS_PER_SECOND; } /* Change the system behavior according to the given gameplay mode. */ void setgameplaymode(int mode) { switch (mode) { case BeginInput: setkeyboardinputmode(TRUE); break; case EndInput: setkeyboardinputmode(FALSE); break; case BeginPlay: setkeyboardrepeat(FALSE); settimer(+1); break; case EndPlay: setkeyboardrepeat(TRUE); settimer(-1); break; case BeginVerify: settimer(+1); break; case EndVerify: settimer(-1); break; case SuspendPlayShuttered: if (state.ruleset == Ruleset_MS) state.statusflags |= SF_SHUTTERED; case SuspendPlay: setkeyboardrepeat(TRUE); settimer(0); setsoundeffects(0); break; case ResumePlay: setkeyboardrepeat(FALSE); settimer(+1); setsoundeffects(+1); state.statusflags &= ~SF_SHUTTERED; break; } } /* Alter the stepping. If display is true, update the screen to * reflect the change. */ int setstepping(int stepping, int display) { char msg[32], *p; state.stepping = stepping; if (display) { p = msg; p += sprintf(p, "%s-step", state.stepping & 4 ? "odd" : "even"); if (state.stepping & 3) p += sprintf(p, " +%d", state.stepping & 3); setdisplaymsg(msg, 500, 500); } return TRUE; } /* Alter the stepping by a delta. Force the stepping to be appropriate * to the current ruleset. */ int changestepping(int delta, int display) { int n; if (state.stepping < 0) state.stepping = 0; n = (state.stepping + delta) % 8; if (state.ruleset == Ruleset_MS) n &= ~3; if (state.stepping != n) return setstepping(n, display); return TRUE; } /* Advance the game one tick and update the game state. cmd is the * current keyboard command supplied by the user. The return value is * positive if the game was completed successfully, negative if the * game ended unsuccessfully, and zero otherwise. */ int doturn(int cmd) { action act; int n; state.soundeffects &= ~((1 << SND_ONESHOT_COUNT) - 1); state.currenttime = gettickcount(); if (state.currenttime >= MAXIMUM_TICK_COUNT) { errmsg(NULL, "timer reached its maximum of %d.%d hours; quitting now", MAXIMUM_TICK_COUNT / (TICKS_PER_SECOND * 3600), (MAXIMUM_TICK_COUNT / (TICKS_PER_SECOND * 360)) % 10); return -1; } if (state.replay < 0) { if (cmd != CmdPreserve) state.currentinput = cmd; } else { if (state.replay < state.moves.count) { if (state.currenttime > state.moves.list[state.replay].when) warn("Replay: Got ahead of saved solution: %d > %d!", state.currenttime, state.moves.list[state.replay].when); if (state.currenttime == state.moves.list[state.replay].when) { state.currentinput = state.moves.list[state.replay].dir; ++state.replay; } } else { n = state.currenttime + state.timeoffset - 1; if (n > state.game->besttime) return -1; } } n = (*logic->advancegame)(logic); if (state.replay < 0 && state.lastmove) { act.when = state.currenttime; act.dir = state.lastmove; addtomovelist(&state.moves, act); state.lastmove = NIL; } if (n) return n; return 0; } /* Update the display to show the current game state (including sound * effects, if any). If showframe is FALSE, then nothing is actually * displayed. */ int drawscreen(int showframe) { int currenttime; int timeleft, besttime; playsoundeffects(state.soundeffects); if (!showframe) return TRUE; currenttime = state.currenttime + state.timeoffset; if (hassolution(state.game)) besttime = (state.game->time ? state.game->time : 999) - state.game->besttime / TICKS_PER_SECOND; else besttime = TIME_NIL; timeleft = TIME_NIL; if (state.game->time) { timeleft = state.game->time - currenttime / TICKS_PER_SECOND; if (timeleft <= 0) { timeleft = 0; setdisplaymsg("Out of time", 2, 2); } } return displaygame(&state, timeleft, besttime); } /* Stop game play and clean up. */ int quitgamestate(void) { state.soundeffects = 0; setsoundeffects(-1); return TRUE; } /* Clean up after game play is over. */ int endgamestate(void) { setsoundeffects(-1); return (*logic->endgame)(logic); } /* Close up shop. */ void shutdowngamestate(void) { setrulesetbehavior(Ruleset_None); destroymovelist(&state.moves); } /* Initialize the current game state to a small level used for display * at the completion of a series. */ void setenddisplay(void) { state.replay = -1; state.timelimit = 0; state.currenttime = -1; state.timeoffset = 0; state.chipsneeded = 0; state.currentinput = NIL; state.statusflags = 0; state.soundeffects = 0; getenddisplaysetup(&state); (*logic->initgame)(logic); } /* * Solution handling functions. */ /* Return TRUE if a solution exists for the given level. */ int hassolution(gamesetup const *game) { return game->besttime != TIME_NIL; } /* Compare the most recent solution for the current game with the * user's best solution (if any). If this solution beats what's there, * or if the current solution has been marked as replaceable, then * replace it. TRUE is returned if the solution was replaced. */ int replacesolution(void) { solutioninfo solution; int currenttime; if (state.statusflags & SF_NOSAVING) return FALSE; currenttime = state.currenttime + state.timeoffset; if (hassolution(state.game) && !(state.game->sgflags & SGF_REPLACEABLE) && currenttime >= state.game->besttime) return FALSE; state.game->besttime = currenttime; state.game->sgflags &= ~SGF_REPLACEABLE; solution.moves = state.moves; solution.rndseed = getinitialseed(&state.mainprng); solution.flags = 0; solution.rndslidedir = state.initrndslidedir; solution.stepping = state.stepping; if (!contractsolution(&solution, state.game)) return FALSE; return TRUE; } /* Delete the user's best solution for the current game. FALSE is * returned if no solution was present. */ int deletesolution(void) { if (!hassolution(state.game)) return FALSE; state.game->besttime = TIME_NIL; state.game->sgflags &= ~SGF_REPLACEABLE; free(state.game->solutiondata); state.game->solutionsize = 0; state.game->solutiondata = NULL; return TRUE; } /* Double-checks the timing for a solution that has just been played * back. If the timing is off, and the cause of the discrepancy can be * reasonably ascertained to be benign, the timing will be corrected * and TRUE is returned. */ int checksolution(void) { int currenttime; if (!hassolution(state.game)) return FALSE; currenttime = state.currenttime + state.timeoffset; if (currenttime == state.game->besttime) return FALSE; warn("saved game has solution time of %d ticks, but replay took %d ticks", state.game->besttime, currenttime); if (state.game->besttime == state.currenttime) { warn("difference matches clock offset; fixing."); state.game->besttime = currenttime; return TRUE; } else if (currenttime - state.game->besttime == 1) { warn("difference matches pre-0.10.1 error; fixing."); state.game->besttime = currenttime; return TRUE; } warn("reason for difference unknown."); state.game->besttime = currenttime; return FALSE; } tworld-1.3.0/play.h0000644000175000017500000000612310420557342014306 0ustar breadboxbreadbox/* play.h: Functions to drive game-play and manage the game state. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _play_h_ #define _play_h_ #include "defs.h" /* The different modes of the program with respect to gameplay. */ enum { BeginPlay, EndPlay, SuspendPlay, SuspendPlayShuttered, ResumePlay, BeginInput, EndInput, BeginVerify, EndVerify }; /* TRUE if the program is running without a user interface. */ extern int batchmode; /* Change the current gameplay mode. This affects the running of the * timer and the handling of the keyboard. */ extern void setgameplaymode(int mode); /* Initialize the current state to the starting position of the * given level. */ extern int initgamestate(gamesetup *game, int ruleset); /* Set up the current state to play from its prerecorded solution. * FALSE is returned if no solution is available for playback. */ extern int prepareplayback(void); extern int setstepping(int stepping, int display); extern int changestepping(int delta, int display); /* Return the amount of time passed in the current game, in seconds. */ extern int secondsplayed(void); /* Handle one tick of the game. cmd is the current keyboard command * supplied by the user, or CmdPreserve if any pending command is to * be retained. The return value is positive if the game was completed * successfully, negative if the game ended unsuccessfully, and zero * if the game remains in progress. */ extern int doturn(int cmd); /* Update the display during game play. If showframe is FALSE, then * nothing is actually displayed. */ extern int drawscreen(int showframe); /* Quit game play early. */ extern int quitgamestate(void); /* Free any resources associates with the current game state. */ extern int endgamestate(void); /* Free all persistent resources in the module. */ extern void shutdowngamestate(void); /* Initialize the current state to a small level used for display at * the completion of a series. */ extern void setenddisplay(void); /* Return TRUE if a solution exists for the given level. */ extern int hassolution(gamesetup const *game); /* Replace the user's solution with the just-executed solution if it * beats the existing solution for shortest time. FALSE is returned if * nothing was changed. */ extern int replacesolution(void); /* Delete the user's best solution for the current game. FALSE is * returned if no solution was present to delete. */ extern int deletesolution(void); /* Double-check the timing for a solution that has just been played * back. If the timing is incorrect, but the cause of the discrepancy * can be reasonably ascertained to be benign, the timings will be * corrected and the return value will be TRUE. */ extern int checksolution(void); /* Turn pedantic mode on. The ruleset will be slightly changed to be * as faithful as possible to the original source material. */ extern void setpedanticmode(void); /* Slow down the game clock by the given factor. Used for debugging * purposes. */ extern int setmudsuckingfactor(int mud); #endif tworld-1.3.0/random.c0000644000175000017500000000657510416371342014626 0ustar breadboxbreadbox/* random.c: The game's random-number generator. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ /* * This module is not here because I don't trust the C library's * random-number generator. (In fact, this module uses the linear * congruential generator, which is hardly impressive. But this isn't * strong cryptography; it's a game.) It is here simply because it is * necessary for the game to use the same generator FOREVER. In order * for playback of solutions to work correctly, the game must use the * same sequence of random numbers as when it was recorded. This would * fail if the playback occurred on a version compiled with a * different C library's generator. Thus, this module. */ #include #include #include "gen.h" #include "random.h" /* The most recently generated random number is stashed here, so that * it can provide the initial seed of the next PRNG. */ static unsigned long lastvalue = 0x80000000UL; /* The standard linear congruential random-number generator needs no * introduction. */ static unsigned long nextvalue(unsigned long value) { return ((value * 1103515245UL) + 12345UL) & 0x7FFFFFFFUL; } /* Move to the next pseudorandom number in the generator's series. */ static void nextrandom(prng *gen) { if (gen->shared) gen->value = lastvalue = nextvalue(lastvalue); else gen->value = nextvalue(gen->value); } /* Create a new PRNG, reset to the shared sequence. */ prng createprng(void) { prng gen; resetprng(&gen); return gen; } /* We start off a fresh series by taking the current time. A few * numbers are generated and discarded to work out any biases in the * seed value. */ void resetprng(prng *gen) { if (lastvalue > 0x7FFFFFFFUL) lastvalue = nextvalue(nextvalue(nextvalue(nextvalue(time(NULL))))); gen->value = gen->initial = lastvalue; gen->shared = TRUE; } /* Reset a PRNG to an independent sequence. */ void restartprng(prng *gen, unsigned long seed) { gen->value = gen->initial = seed & 0x7FFFFFFFUL; gen->shared = FALSE; } /* Use the top two bits to get a random number between 0 and 3. */ int random4(prng *gen) { nextrandom(gen); return gen->value >> 29; } /* Randomly select an element from a list of three values. */ int randomof3(prng *gen, int a, int b, int c) { int n; nextrandom(gen); n = (int)((3.0 * (gen->value & 0x3FFFFFFFUL)) / (double)0x40000000UL); return n < 2 ? n < 1 ? a : b : c; } /* Randomly permute a list of three values. Two random numbers are * used, with the ranges [0,1] and [0,1,2]. */ void randomp3(prng *gen, int *array) { int n, t; nextrandom(gen); n = gen->value >> 30; t = array[n]; array[n] = array[1]; array[1] = t; n = (int)((3.0 * (gen->value & 0x3FFFFFFFUL)) / (double)0x40000000UL); t = array[n]; array[n] = array[2]; array[2] = t; } /* Randomly permute a list of four values. Three random numbers are * used, with the ranges [0,1], [0,1,2], and [0,1,2,3]. */ void randomp4(prng *gen, int *array) { int n, t; nextrandom(gen); n = gen->value >> 30; t = array[n]; array[n] = array[1]; array[1] = t; n = (int)((3.0 * (gen->value & 0x0FFFFFFFUL)) / (double)0x10000000UL); t = array[n]; array[n] = array[2]; array[2] = t; n = (gen->value >> 28) & 3; t = array[n]; array[n] = array[3]; array[3] = t; } tworld-1.3.0/random.h0000644000175000017500000000204510362156267014626 0ustar breadboxbreadbox/* random.h: The game's random-number generator. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _random_h_ #define _random_h_ #include "defs.h" /* Create a fresh PRNG. */ extern prng createprng(void); /* Mark an existing PRNG as beginning a new sequence. */ extern void resetprng(prng *gen); /* Restart an existing PRNG upon a predetermined sequence. */ extern void restartprng(prng *gen, unsigned long initial); /* Retrieve the original seed value of the current sequence. */ #define getinitialseed(gen) ((gen)->initial) /* Return a random integer between zero and three, inclusive. */ extern int random4(prng *gen); /* Randomly select one of the three integer arguments as the return * value. */ extern int randomof3(prng *gen, int a, int b, int c); /* Randomly permute an array of three integers. */ extern void randomp3(prng *gen, int *array); /* Randomly permute an array of four integers. */ extern void randomp4(prng *gen, int *array); #endif tworld-1.3.0/res.c0000644000175000017500000002565410416717341014141 0ustar breadboxbreadbox/* res.c: Functions for loading resources from external files. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include "defs.h" #include "fileio.h" #include "err.h" #include "oshw.h" #include "unslist.h" #include "res.h" /* * The resource ID numbers */ #define RES_IMG_BASE 0 #define RES_IMG_TILES (RES_IMG_BASE + 0) #define RES_IMG_FONT (RES_IMG_BASE + 1) #define RES_IMG_LAST RES_IMG_FONT #define RES_CLR_BASE (RES_IMG_LAST + 1) #define RES_CLR_BKGND (RES_CLR_BASE + 0) #define RES_CLR_TEXT (RES_CLR_BASE + 1) #define RES_CLR_BOLD (RES_CLR_BASE + 2) #define RES_CLR_DIM (RES_CLR_BASE + 3) #define RES_CLR_LAST RES_CLR_DIM #define RES_TXT_BASE (RES_CLR_LAST + 1) #define RES_TXT_UNSLIST (RES_TXT_BASE + 0) #define RES_TXT_LAST RES_TXT_UNSLIST #define RES_SND_BASE (RES_TXT_LAST + 1) #define RES_SND_CHIP_LOSES (RES_SND_BASE + SND_CHIP_LOSES) #define RES_SND_CHIP_WINS (RES_SND_BASE + SND_CHIP_WINS) #define RES_SND_TIME_OUT (RES_SND_BASE + SND_TIME_OUT) #define RES_SND_TIME_LOW (RES_SND_BASE + SND_TIME_LOW) #define RES_SND_DEREZZ (RES_SND_BASE + SND_DEREZZ) #define RES_SND_CANT_MOVE (RES_SND_BASE + SND_CANT_MOVE) #define RES_SND_IC_COLLECTED (RES_SND_BASE + SND_IC_COLLECTED) #define RES_SND_ITEM_COLLECTED (RES_SND_BASE + SND_ITEM_COLLECTED) #define RES_SND_BOOTS_STOLEN (RES_SND_BASE + SND_BOOTS_STOLEN) #define RES_SND_TELEPORTING (RES_SND_BASE + SND_TELEPORTING) #define RES_SND_DOOR_OPENED (RES_SND_BASE + SND_DOOR_OPENED) #define RES_SND_SOCKET_OPENED (RES_SND_BASE + SND_SOCKET_OPENED) #define RES_SND_BUTTON_PUSHED (RES_SND_BASE + SND_BUTTON_PUSHED) #define RES_SND_TILE_EMPTIED (RES_SND_BASE + SND_TILE_EMPTIED) #define RES_SND_WALL_CREATED (RES_SND_BASE + SND_WALL_CREATED) #define RES_SND_TRAP_ENTERED (RES_SND_BASE + SND_TRAP_ENTERED) #define RES_SND_BOMB_EXPLODES (RES_SND_BASE + SND_BOMB_EXPLODES) #define RES_SND_WATER_SPLASH (RES_SND_BASE + SND_WATER_SPLASH) #define RES_SND_SKATING_TURN (RES_SND_BASE + SND_SKATING_TURN) #define RES_SND_BLOCK_MOVING (RES_SND_BASE + SND_BLOCK_MOVING) #define RES_SND_SKATING_FORWARD (RES_SND_BASE + SND_SKATING_FORWARD) #define RES_SND_SLIDING (RES_SND_BASE + SND_SLIDING) #define RES_SND_SLIDEWALKING (RES_SND_BASE + SND_SLIDEWALKING) #define RES_SND_ICEWALKING (RES_SND_BASE + SND_ICEWALKING) #define RES_SND_WATERWALKING (RES_SND_BASE + SND_WATERWALKING) #define RES_SND_FIREWALKING (RES_SND_BASE + SND_FIREWALKING) #define RES_SND_LAST RES_SND_FIREWALKING #define RES_COUNT (RES_SND_LAST + 1) /* Structure for enumerating the resource names. */ typedef struct rcitem { char const *name; int numeric; } rcitem; /* Union for storing the resource values. */ typedef union resourceitem { int num; char str[256]; } resourceitem; /* The complete list of resource names. */ static rcitem rclist[] = { { "tileimages", FALSE }, { "font", FALSE }, { "backgroundcolor", FALSE }, { "textcolor", FALSE }, { "boldtextcolor", FALSE }, { "dimtextcolor", FALSE }, { "unsolvablelist", FALSE }, { "chipdeathsound", FALSE }, { "levelcompletesound", FALSE }, { "chipdeathbytimesound", FALSE }, { "ticksound", FALSE }, { "derezzsound", FALSE }, { "blockedmovesound", FALSE }, { "pickupchipsound", FALSE }, { "pickuptoolsound", FALSE }, { "thiefsound", FALSE }, { "teleportsound", FALSE }, { "opendoorsound", FALSE }, { "socketsound", FALSE }, { "switchsound", FALSE }, { "tileemptiedsound", FALSE }, { "wallcreatedsound", FALSE }, { "trapenteredsound", FALSE }, { "bombsound", FALSE }, { "splashsound", FALSE }, { "blockmovingsound", FALSE }, { "skatingforwardsound", FALSE }, { "skatingturnsound", FALSE }, { "slidingsound", FALSE }, { "slidewalkingsound", FALSE }, { "icewalkingsound", FALSE }, { "waterwalkingsound", FALSE }, { "firewalkingsound", FALSE } }; /* The complete collection of resource values. */ static resourceitem allresources[Ruleset_Count][RES_COUNT]; /* The resource values for the current ruleset. */ static resourceitem *resources = NULL; /* The ruleset-independent resource values. */ static resourceitem *globalresources = allresources[Ruleset_None]; /* The active ruleset. */ static int currentruleset = Ruleset_None; /* The directory containing all the resource files. */ char *resdir = NULL; /* A few resources have non-empty default values. */ static void initresourcedefaults(void) { strcpy(allresources[Ruleset_None][RES_IMG_TILES].str, "tiles.bmp"); strcpy(allresources[Ruleset_None][RES_IMG_FONT].str, "font.bmp"); strcpy(allresources[Ruleset_None][RES_CLR_BKGND].str, "000000"); strcpy(allresources[Ruleset_None][RES_CLR_TEXT].str, "FFFFFF"); strcpy(allresources[Ruleset_None][RES_CLR_BOLD].str, "FFFF00"); strcpy(allresources[Ruleset_None][RES_CLR_DIM].str, "C0C0C0"); memcpy(&allresources[Ruleset_MS], globalresources, sizeof allresources[Ruleset_MS]); memcpy(&allresources[Ruleset_Lynx], globalresources, sizeof allresources[Ruleset_Lynx]); } /* Iterate through the lines of the rc file, storing the values in the * allresources array. Lines consisting only of whitespace, or with an * octothorpe as the first non-whitespace character, are skipped over. * Lines containing a ruleset in brackets introduce ruleset-specific * resource values. Ruleset-independent values are copied into each of * the ruleset-specific entries. FALSE is returned if the rc file * could not be opened. */ static int readrcfile(void) { resourceitem item; fileinfo file; char buf[256]; char name[256]; char *p; int ruleset; int lineno, i, j; memset(&file, 0, sizeof file); if (!openfileindir(&file, resdir, "rc", "r", "can't open")) return FALSE; ruleset = Ruleset_None; for (lineno = 1 ; ; ++lineno) { i = sizeof buf - 1; if (!filegetline(&file, buf, &i, NULL)) break; for (p = buf ; isspace(*p) ; ++p) ; if (!*p || *p == '#') continue; if (sscanf(buf, "[%[^]]]", name) == 1) { for (p = name ; (*p = tolower(*p)) != '\0' ; ++p) ; if (!strcmp(name, "ms")) ruleset = Ruleset_MS; else if (!strcmp(name, "lynx")) ruleset = Ruleset_Lynx; else if (!strcmp(name, "all")) ruleset = Ruleset_None; else warn("rc:%d: syntax error", lineno); continue; } if (sscanf(buf, "%[^=]=%s", name, item.str) != 2) { warn("rc:%d: syntax error", lineno); continue; } for (p = name ; (*p = tolower(*p)) != '\0' ; ++p) ; for (i = sizeof rclist / sizeof *rclist - 1 ; i >= 0 ; --i) if (!strcmp(name, rclist[i].name)) break; if (i < 0) { warn("rc:%d: illegal resource name \"%s\"", lineno, name); continue; } if (rclist[i].numeric) { i = atoi(item.str); item.num = i; } allresources[ruleset][i] = item; if (ruleset == Ruleset_None) for (j = Ruleset_None ; j < Ruleset_Count ; ++j) allresources[j][i] = item; } fileclose(&file, NULL); return TRUE; } /* * Resource-loading functions */ /* Parse the color-definition resource values. */ static int loadcolors(void) { long bkgnd, text, bold, dim; char *end; bkgnd = strtol(resources[RES_CLR_BKGND].str, &end, 16); if (*end || bkgnd < 0 || bkgnd > 0xFFFFFF) { warn("rc: invalid color ID for background"); bkgnd = -1; } text = strtol(resources[RES_CLR_TEXT].str, &end, 16); if (*end || text < 0 || text > 0xFFFFFF) { warn("rc: invalid color ID for text"); text = -1; } bold = strtol(resources[RES_CLR_BOLD].str, &end, 16); if (*end || bold < 0 || bold > 0xFFFFFF) { warn("rc: invalid color ID for bold text"); bold = -1; } dim = strtol(resources[RES_CLR_DIM].str, &end, 16); if (*end || dim < 0 || dim > 0xFFFFFF) { warn("rc: invalid color ID for dim text"); dim = -1; } setcolors(bkgnd, text, bold, dim); return TRUE; } /* Attempt to load the tile images. */ static int loadimages(void) { char *path; int f; f = FALSE; path = getpathbuffer(); if (*resources[RES_IMG_TILES].str) { combinepath(path, resdir, resources[RES_IMG_TILES].str); f = loadtileset(path, TRUE); } if (!f && resources != globalresources && *globalresources[RES_IMG_TILES].str) { combinepath(path, resdir, globalresources[RES_IMG_TILES].str); f = loadtileset(path, TRUE); } free(path); if (!f) errmsg(resdir, "no valid tilesets found"); return f; } /* Load the font resource. */ static int loadfont(void) { char *path; int f; f = FALSE; path = getpathbuffer(); if (*resources[RES_IMG_FONT].str) { combinepath(path, resdir, resources[RES_IMG_FONT].str); f = loadfontfromfile(path, TRUE); } if (!f && resources != globalresources && *globalresources[RES_IMG_FONT].str) { combinepath(path, resdir, globalresources[RES_IMG_FONT].str); f = loadfontfromfile(path, TRUE); } free(path); if (!f) errmsg(resdir, "no valid font found"); return f; } /* Load the list of unsolvable levels. */ static int loadunslist(void) { char const *filename; if (*resources[RES_TXT_UNSLIST].str) filename = resources[RES_TXT_UNSLIST].str; else if (resources != globalresources && *globalresources[RES_TXT_UNSLIST].str) filename = globalresources[RES_TXT_UNSLIST].str; else return FALSE; return loadunslistfromfile(filename); } /* Load all of the sound resources. */ static int loadsounds(void) { char *path; int count; int n, f; path = getpathbuffer(); count = 0; for (n = 0 ; n < SND_COUNT ; ++n) { f = FALSE; if (*resources[RES_SND_BASE + n].str) { combinepath(path, resdir, resources[RES_SND_BASE + n].str); f = loadsfxfromfile(n, path); } if (!f && resources != globalresources && *globalresources[RES_SND_BASE + n].str) { combinepath(path, resdir, globalresources[RES_SND_BASE + n].str); f = loadsfxfromfile(n, path); } if (f) ++count; } free(path); return count; } /* Load all resources that are available. FALSE is returned if the * tile images could not be loaded. (Sounds are not required in order * to run, and by this point we should already have a valid font and * color scheme set.) */ int loadgameresources(int ruleset) { currentruleset = ruleset; resources = allresources[ruleset]; loadcolors(); loadfont(); if (!loadimages()) return FALSE; if (loadsounds() == 0) setaudiosystem(FALSE); return TRUE; } /* Parse the rc file and load the font and color scheme. FALSE is returned * if an error occurs. */ int initresources(void) { initresourcedefaults(); resources = allresources[Ruleset_None]; if (!readrcfile() || !loadcolors() || !loadfont()) return FALSE; loadunslist(); return TRUE; } /* Free all resources. */ void freeallresources(void) { int n; freefont(); freetileset(); clearunslist(); for (n = 0 ; n < SND_COUNT ; ++n) freesfx(n); } tworld-1.3.0/res.h0000644000175000017500000000153110362156300014122 0ustar breadboxbreadbox/* res.h: Functions for loading resources from external files. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _res_h_ #define _res_h_ /* The directory containing all the resource files. */ extern char *resdir; /* Parse the rc file and initialize the resources that are needed at * the start of the program (i.e., the font and color settings). * FALSE is returned if the rc file contained errors or if a resource * could not be loaded. */ extern int initresources(void); /* Load all resources, using the settings for the given ruleset. FALSE * is returned if any critical resources could not be loaded. */ extern int loadgameresources(int ruleset); /* Release all memory allocated for the resources. */ extern void freeallresources(void); #endif tworld-1.3.0/score.c0000644000175000017500000002137110420642414014444 0ustar breadboxbreadbox/* score.c: Calculating scores and formatting the display of same. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include "defs.h" #include "err.h" #include "play.h" #include "score.h" /* Translate a number into a string. The second argument supplies the * character value to use for the zero digit. */ static char const *decimal(long number, char zero) { static char buf[32]; char *dest = buf + sizeof buf; unsigned long n; n = number >= 0 ? (unsigned long)number : (unsigned long)-(number + 1) + 1; *--dest = '\0'; do { *--dest = zero + n % 10; n /= 10; } while (n); if (number < 0) *--dest = '-'; return dest; } /* Translate a number into a string, complete with commas. The second * argument supplies the character value to use for the zero digit. */ static char const *cdecimal(long number, char zero) { static char buf[32]; char *dest = buf + sizeof buf; unsigned long n; int i = 0; n = number >= 0 ? (unsigned long)number : (unsigned long)-(number + 1) + 1; *--dest = '\0'; do { ++i; if (i % 4 == 0) { *--dest = ','; ++i; } *--dest = zero + n % 10; n /= 10; } while (n); if (number < 0) *--dest = '-'; return dest; } /* Return the user's scores for a given level. */ int getscoresforlevel(gameseries const *series, int level, int *base, int *bonus, long *total) { gamesetup *game; int levelscore, timescore; long totalscore; int n; *base = 0; *bonus = 0; totalscore = 0; for (n = 0, game = series->games ; n < series->count ; ++n, ++game) { if (n >= series->allocated) break; levelscore = 0; timescore = 0; if (hassolution(game)) { levelscore = game->number * 500; if (game->time) timescore = 10 * (game->time - game->besttime / TICKS_PER_SECOND); } if (n == level) { *base = levelscore; *bonus = timescore; } totalscore += levelscore + timescore; } *total = totalscore; return TRUE; } /* Produce a table that displays the user's score, broken down by * levels with a grand total at the end. If usepasswds is FALSE, all * levels are displayed. Otherwise, levels after the last level for * which the user knows the password are left out. Other levels for * which the user doesn't know the password are in the table, but * without any information besides the level's number. */ int createscorelist(gameseries const *series, int usepasswds, char zchar, int **plevellist, int *pcount, tablespec *table) { gamesetup *game; char **ptrs; char *textheap; char *blank; int *levellist = NULL; int levelscore, timescore; long totalscore; int count; int used, j, n; if (plevellist) { levellist = malloc((series->count + 2) * sizeof *levellist); if (!levellist) memerrexit(); } ptrs = malloc((series->count + 2) * 5 * sizeof *ptrs); textheap = malloc((series->count + 2) * 128); if (!ptrs || !textheap) memerrexit(); totalscore = 0; n = 0; used = 0; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Level"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-Name"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Base"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Bonus"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Score"); blank = textheap + used; used += 1 + sprintf(textheap + used, "4- "); count = 0; for (j = 0, game = series->games ; j < series->count ; ++j, ++game) { if (j >= series->allocated) break; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", decimal(game->number, zchar)); if (hassolution(game)) { ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-%.64s", game->name); if (game->sgflags & SGF_REPLACEABLE) { ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "3.*BAD*"); } else { levelscore = 500 * game->number; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", cdecimal(levelscore, zchar)); ptrs[n++] = textheap + used; if (game->time) { timescore = 10 * (game->time - game->besttime / TICKS_PER_SECOND); used += 1 + sprintf(textheap + used, "1+%s", cdecimal(timescore, zchar)); } else { timescore = 0; strcpy(textheap + used, "1+---"); used += 6; } ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", cdecimal(levelscore + timescore, zchar)); totalscore += levelscore + timescore; } if (plevellist) levellist[count] = j; ++count; } else { if (!usepasswds || (game->sgflags & SGF_HASPASSWD)) { ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "4-%s", game->name); if (plevellist) levellist[count] = j; } else { ptrs[n++] = blank; if (plevellist) levellist[count] = -1; } ++count; } } while (ptrs[n - 1] == blank) { n -= 2; --count; } ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "2-Total Score"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "3+%s", cdecimal(totalscore, zchar)); if (plevellist) levellist[count] = -1; ++count; if (plevellist) *plevellist = levellist; if (pcount) *pcount = count; table->rows = count + 1; table->cols = 5; table->sep = 2; table->collapse = 1; table->items = ptrs; return TRUE; } /* Produce a table that displays the user's best times for each level * that has a solution. If showpartial is zero, times are rounded down * to second precision, otherwise fractional values will be * calculated. */ int createtimelist(gameseries const *series, int showpartial, char zchar, int **plevellist, int *pcount, tablespec *table) { gamesetup *game; char **ptrs; char *textheap; char *untimed; int *levellist = NULL; long leveltime; int count; int used, secs, j, n; if (plevellist) { levellist = malloc((series->count + 1) * sizeof *levellist); if (!levellist) memerrexit(); } ptrs = malloc((series->count + 1) * 4 * sizeof *ptrs); textheap = malloc((series->count + 1) * 128); if (!ptrs || !textheap) memerrexit(); n = 0; used = 0; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Level"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-Name"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Time"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Solution"); untimed = textheap + used; used += 1 + sprintf(textheap + used, "1+---"); count = 0; for (j = 0, game = series->games ; j < series->count ; ++j, ++game) { if (j >= series->allocated) break; if (!hassolution(game)) continue; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", decimal(game->number, zchar)); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-%.64s", game->name); if (game->time) { leveltime = game->time * TICKS_PER_SECOND - game->besttime; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", decimal(game->time, zchar)); } else { leveltime = 999 * TICKS_PER_SECOND - game->besttime; ptrs[n++] = untimed; } if (game->sgflags & SGF_REPLACEABLE) { ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1.*BAD*"); } else { if (leveltime < 0) secs = -(-leveltime / TICKS_PER_SECOND); else secs = (leveltime + TICKS_PER_SECOND - 1) / TICKS_PER_SECOND; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", decimal(secs, zchar)); if (showpartial) { double f, i; f = modf((double)leveltime / TICKS_PER_SECOND, &i); f = f <= 0 ? -f : 1.0 - f; secs = (int)(f * showpartial + 0.49); --used; used += 1 + sprintf(textheap + used, " - .%s", decimal(showpartial + secs, zchar) + 1); } } if (plevellist) levellist[count] = j; ++count; } if (plevellist) *plevellist = levellist; if (pcount) *pcount = count; table->rows = count + 1; table->cols = 4; table->sep = 2; table->collapse = 1; table->items = ptrs; return TRUE; } /* Free the memory allocated by createscorelist() or createtimelist(). */ void freescorelist(int *levellist, tablespec *table) { free(levellist); if (table) { free(table->items[0]); free(table->items); } } tworld-1.3.0/score.h0000644000175000017500000000351410405525105014450 0ustar breadboxbreadbox/* score.h: Calculating and formatting the scores. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _score_h_ #define _score_h_ #include "defs.h" /* Return the user's scores for a given level. The last three arguments * receive the base score for the level, the time bonus for the level, * and the total score for the series. */ extern int getscoresforlevel(gameseries const *series, int level, int *base, int *bonus, long *total); /* Produce a table showing the player's scores for the given series, * formatted in columns. Each level in the series is listed in a * separate row, with a header row and an extra row at the end giving * a grand total. The pointer pointed to by plevellist receives an * array of level indexes to match the rows of the table (less one for * the header row), or -1 if no level is displayed in that row. If * usepasswds is TRUE, levels for which the user has not learned the * password will either not be included or will show no title. FALSE * is returned if an error occurs. */ extern int createscorelist(gameseries const *series, int usepasswds, char zchar, int **plevellist, int *pcount, tablespec *table); /* Produce a table showing the player's times for the given series. If * showpartial is zero, the times will be rounded to second values. * Otherwise, showpartial should be a power of ten, and the function * will attempt to provide fractional amounts to the appropriate * number of digits. */ extern int createtimelist(gameseries const *series, int showpartial, char zchar, int **plevellist, int *pcount, tablespec *table); /* Free all memory allocated by the above functions. */ extern void freescorelist(int *plevellist, tablespec *table); #define freetimelist freescorelist #endif tworld-1.3.0/series.c0000644000175000017500000005313710420550251014625 0ustar breadboxbreadbox/* series.c: Functions for finding and reading the data files. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include "defs.h" #include "err.h" #include "fileio.h" #include "solution.h" #include "unslist.h" #include "series.h" /* The signature bytes of the data files. */ #define SIG_DATFILE 0xAAAC #define SIG_DATFILE_MS 0x0002 #define SIG_DATFILE_LYNX 0x0102 /* The "signature bytes" of the configuration files. */ #define SIG_DACFILE 0x656C6966 /* Mini-structure for passing data in and out of findfiles(). */ typedef struct seriesdata { gameseries *list; /* the gameseries list */ int allocated; /* number of gameseries currently allocated */ int count; /* number of gameseries filled in */ int usedatdir; /* TRUE if the file is in seriesdatdir. */ } seriesdata; /* The directory containing the series files (data files and * configuration files). */ char *seriesdir = NULL; /* The directory containing the configured data files. */ char *seriesdatdir = NULL; /* Calculate a hash value for the given block of data. */ static unsigned long hashvalue(unsigned char const *data, unsigned int size) { static unsigned long remainders[256] = { 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD, 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9, 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75, 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011, 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD, 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039, 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5, 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81, 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D, 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49, 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95, 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1, 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D, 0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE, 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072, 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16, 0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA, 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE, 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02, 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066, 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA, 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692, 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6, 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A, 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E, 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2, 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A, 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637, 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB, 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F, 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53, 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47, 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B, 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF, 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623, 0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7, 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B, 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F, 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3, 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7, 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B, 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F, 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3, 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640, 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C, 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8, 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24, 0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30, 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC, 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654, 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0, 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C, 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18, 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4, 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0, 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C, 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4 }; unsigned long accum; unsigned int i, j; for (j = 0, accum = 0xFFFFFFFFUL ; j < size ; ++j) { i = ((accum >> 24) ^ data[j]) & 0x000000FF; accum = (accum << 8) ^ remainders[i]; } return accum ^ 0xFFFFFFFFUL; } /* * Reading the data file. */ /* Examine the top of a data file and identify its type. FALSE is * returned if any header bytes appear to be invalid. */ static int readseriesheader(gameseries *series) { unsigned short val16; int ruleset; if (!filereadint16(&series->mapfile, &val16, "not a valid data file")) return FALSE; if (val16 != SIG_DATFILE) return fileerr(&series->mapfile, "not a valid data file"); if (!filereadint16(&series->mapfile, &val16, "not a valid data file")) return FALSE; switch (val16) { case SIG_DATFILE_MS: ruleset = Ruleset_MS; break; case SIG_DATFILE_LYNX: ruleset = Ruleset_Lynx; break; default: fileerr(&series->mapfile, "data file uses an unrecognized ruleset"); return FALSE; } if (series->ruleset == Ruleset_None) series->ruleset = ruleset; if (!filereadint16(&series->mapfile, &val16, "not a valid data file")) return FALSE; series->count = val16; if (!series->count) { fileerr(&series->mapfile, "file contains no maps"); return FALSE; } return TRUE; } /* Read a single level out of the given data file. The level's name, * password, and time limit are extracted from the data. */ static int readleveldata(fileinfo *file, gamesetup *game) { unsigned char *data; unsigned char const *dataend; unsigned short size; int n; if (!filereadint16(file, &size, NULL)) return FALSE; data = filereadbuf(file, size, "missing or invalid level data"); if (!data) return FALSE; if (size < 2) { fileerr(file, "invalid level data"); free(data); return FALSE; } game->levelsize = size; game->leveldata = data; dataend = game->leveldata + game->levelsize; game->number = data[0] | (data[1] << 8); if (size < 10) goto badlevel; game->time = data[2] | (data[3] << 8); game->besttime = TIME_NIL; game->passwd[0] = '\0'; data += data[8] | (data[9] << 8); data += 10; if (data + 2 >= dataend) goto badlevel; data += data[0] | (data[1] << 8); data += 2; size = data[0] | (data[1] << 8); data += 2; if (data + size != dataend) warn("level %d: inconsistent size data (%d vs %d)", game->number, dataend - data, size); while (data + 2 < dataend) { size = data[1]; data += 2; if (size > dataend - data) size = dataend - data; switch (data[-2]) { case 1: if (size > 1) game->time = data[0] | (data[1] << 8); break; case 3: memcpy(game->name, data, size); game->name[size] = '\0'; break; case 6: for (n = 0 ; n < size && n < 15 && data[n] ; ++n) game->passwd[n] = data[n] ^ 0x99; game->passwd[n] = '\0'; break; case 8: warn("level %d: ignoring field 8 password", game->number); break; } data += size; } if (!game->passwd[0] || strlen(game->passwd) != 4) goto badlevel; game->levelhash = hashvalue(game->leveldata, game->levelsize); return TRUE; badlevel: free(game->leveldata); game->levelsize = 0; game->leveldata = NULL; errmsg(file->name, "level %d: invalid level data", game->number); return FALSE; } /* Assuming that the series passed in is in fact the original * chips.dat file, this function undoes the changes that MS introduced * to the original Lynx levels. A rather "ad hack" way to accomplish * this, but it permits this fixup to occur without requiring the user * to perform a special one-time task. Four passwords are repaired, a * possibly missing wall in level 88 is restored, the beartrap wirings * of levels 99 and 111 are fixed, the layout changes to 121 and 127 * are undone, and level 145 is removed. */ static int undomschanges(gameseries *series) { struct { int num, pos, val; } *fixup, fixups[] = { { 5, 0x011D, 'P' ^ 0x99 }, { 95, 0x035F, 'W' ^ 0x99 }, { 9, 0x032D, 'V' ^ 0x99 }, { 95, 0x0360, 'V' ^ 0x99 }, { 9, 0x032E, 'U' ^ 0x99 }, { 95, 0x0361, 'H' ^ 0x99 }, { 27, 0x01E7, 'D' ^ 0x99 }, { 95, 0x0362, 'Y' ^ 0x99 }, { 87, 0x0148, 0x09 }, { 120, 0x0195, 0x00 }, { 98, 0x0340, 8 }, { 98, 0x0342, 14 }, { 98, 0x034A, 23 }, { 98, 0x034C, 14 }, { 98, 0x0354, 8 }, { 98, 0x0356, 16 }, { 98, 0x035E, 23 }, { 98, 0x0360, 16 }, { 98, 0x0368, 16 }, { 98, 0x036A, 18 }, { 98, 0x0372, 6 }, { 98, 0x0374, 20 }, { 98, 0x037C, 16 }, { 98, 0x037E, 20 }, { 98, 0x0386, 23 }, { 98, 0x0388, 23 }, { 98, 0x0390, 23 }, { 98, 0x0392, 25 }, { 110, 0x02B6, 22 }, { 110, 0x02B8, 11 }, { 110, 0x02C0, 15 }, { 110, 0x02C2, 6 }, { 126, 0x00B6, 0x00 }, { 126, 0x00C2, 0x01 }, { 126, 0x01B6, 0x01 }, { 126, 0x01C2, 0x00 }, { -1, -1, -1 } }; if (series->count != 149) return FALSE; for (fixup = fixups ; fixup->num >= 0 ; ++fixup) if (series->games[fixup->num].levelsize <= fixup->pos) return FALSE; free(series->games[144].leveldata); memmove(series->games + 144, series->games + 145, 4 * sizeof *series->games); --series->count; for (fixup = fixups ; fixup->num >= 0 ; ++fixup) series->games[fixup->num].leveldata[fixup->pos] = fixup->val; series->games[5].passwd[3] = 'P'; series->games[9].passwd[0] = 'V'; series->games[9].passwd[1] = 'U'; series->games[27].passwd[3] = 'D'; series->games[95].passwd[0] = 'W'; series->games[95].passwd[1] = 'V'; series->games[95].passwd[2] = 'H'; series->games[95].passwd[3] = 'Y'; return TRUE; } /* * Functions to read the data files. */ /* Load all levels from the given data file, and all of the user's * saved solutions. */ int readseriesfile(gameseries *series) { int n; if (series->gsflags & GSF_ALLMAPSREAD) return TRUE; if (series->count <= 0) { errmsg(series->filebase, "cannot read from empty level set"); return FALSE; } if (!series->mapfile.fp) { if (!openfileindir(&series->mapfile, seriesdir, series->mapfilename, "rb", "unknown error")) return FALSE; if (!readseriesheader(series)) return FALSE; } xalloc(series->games, series->count * sizeof *series->games); memset(series->games + series->allocated, 0, (series->count - series->allocated) * sizeof *series->games); series->allocated = series->count; n = 0; while (n < series->count && !filetestend(&series->mapfile)) { if (readleveldata(&series->mapfile, series->games + n)) ++n; else --series->count; } fileclose(&series->mapfile, NULL); series->gsflags |= GSF_ALLMAPSREAD; if (series->gsflags & GSF_LYNXFIXES) undomschanges(series); markunsolvablelevels(series); readsolutions(series); return TRUE; } /* Free all memory allocated for the given gameseries. */ void freeseriesdata(gameseries *series) { gamesetup *game; int n; clearsolutions(series); fileclose(&series->mapfile, NULL); clearfileinfo(&series->mapfile); free(series->mapfilename); series->mapfilename = NULL; free(series->savefilename); series->savefilename = NULL; series->gsflags = 0; series->solheaderflags = 0; for (n = 0, game = series->games ; n < series->count ; ++n, ++game) { free(game->leveldata); game->leveldata = NULL; game->levelsize = 0; } free(series->games); series->games = NULL; series->allocated = 0; series->count = 0; series->ruleset = Ruleset_None; series->gsflags = 0; *series->filebase = '\0'; *series->name = '\0'; } /* * Reading the configuration file. */ /* Parse the lines of the given configuration file. The return value * is the name of the corresponding data file, or NULL if the * configuration file could not be read or contained a syntax error. */ static char *readconfigfile(fileinfo *file, gameseries *series) { static char datfilename[256]; char buf[256]; char name[256]; char value[256]; char *p; int lineno, n; n = sizeof buf - 1; if (!filegetline(file, buf, &n, "invalid configuration file")) return NULL; if (sscanf(buf, "file = %s", datfilename) != 1) { fileerr(file, "bad filename in configuration file"); return NULL; } for (lineno = 2 ; ; ++lineno) { n = sizeof buf - 1; if (!filegetline(file, buf, &n, NULL)) break; for (p = buf ; isspace(*p) ; ++p) ; if (!*p || *p == '#') continue; if (sscanf(buf, "%[^= \t] = %s", name, value) != 2) { fileerr(file, "invalid configuration file syntax"); return NULL; } for (p = name ; (*p = tolower(*p)) != '\0' ; ++p) ; if (!strcmp(name, "name")) { sprintf(series->name, "%.*s", sizeof series->name - 1, skippathname(value)); } else if (!strcmp(name, "lastlevel")) { n = (int)strtol(value, &p, 10); if (*p || n <= 0) { fileerr(file, "invalid lastlevel in configuration file"); return NULL; } series->final = n; } else if (!strcmp(name, "ruleset")) { for (p = value ; (*p = tolower(*p)) != '\0' ; ++p) ; if (strcmp(value, "ms") && strcmp(value, "lynx")) { fileerr(file, "invalid ruleset in configuration file"); return NULL; } series->ruleset = *value == 'm' ? Ruleset_MS : Ruleset_Lynx; } else if (!strcmp(name, "usepasswords")) { if (tolower(*value) == 'n') series->gsflags |= GSF_IGNOREPASSWDS; else series->gsflags &= ~GSF_IGNOREPASSWDS; } else if (!strcmp(name, "fixlynx")) { if (tolower(*value) == 'n') series->gsflags &= ~GSF_LYNXFIXES; else series->gsflags |= GSF_LYNXFIXES; } else { warn("line %d: directive \"%s\" unknown", lineno, name); fileerr(file, "unrecognized setting in configuration file"); return NULL; } } return datfilename; } /* * Functions to locate the series files. */ /* Open the given file and read the information in the file header (or * the entire file if it is a configuration file), then allocate and * initialize a gameseries structure for the file and add it to the * list stored under the second argument. This function is used as a * findfiles() callback. */ static int getseriesfile(char *filename, void *data) { fileinfo file; seriesdata *sdata = (seriesdata*)data; gameseries *series; unsigned long magic; char *datfilename; int config, f; clearfileinfo(&file); if (!openfileindir(&file, seriesdir, filename, "rb", "unknown error")) return 0; if (!filereadint32(&file, &magic, "unexpected EOF")) { fileclose(&file, NULL); return 0; } filerewind(&file, NULL); if (magic == SIG_DACFILE) { config = TRUE; } else if ((magic & 0xFFFF) == SIG_DATFILE) { config = FALSE; } else { fileerr(&file, "not a valid data file or configuration file"); fileclose(&file, NULL); return 0; } if (sdata->count >= sdata->allocated) { sdata->allocated = sdata->count + 1; xalloc(sdata->list, sdata->allocated * sizeof *sdata->list); } series = sdata->list + sdata->count; series->mapfilename = NULL; clearfileinfo(&series->savefile); series->savefilename = NULL; series->gsflags = 0; series->solheaderflags = 0; series->allocated = 0; series->count = 0; series->final = 0; series->ruleset = Ruleset_None; series->games = NULL; sprintf(series->filebase, "%.*s", sizeof series->filebase - 1, filename); sprintf(series->name, "%.*s", sizeof series->name - 1, skippathname(filename)); f = FALSE; if (config) { fileclose(&file, NULL); if (!openfileindir(&file, seriesdir, filename, "r", "unknown error")) return 0; clearfileinfo(&series->mapfile); free(series->mapfilename); series->mapfilename = NULL; datfilename = readconfigfile(&file, series); fileclose(&file, NULL); if (datfilename) { if (openfileindir(&series->mapfile, seriesdatdir, datfilename, "rb", NULL)) f = readseriesheader(series); else warn("cannot use %s: %s unavailable", filename, datfilename); fileclose(&series->mapfile, NULL); clearfileinfo(&series->mapfile); if (f) series->mapfilename = getpathforfileindir(seriesdatdir, datfilename); } } else { series->mapfile = file; f = readseriesheader(series); fileclose(&series->mapfile, NULL); clearfileinfo(&series->mapfile); if (f) series->mapfilename = getpathforfileindir(seriesdir, filename); } if (f) ++sdata->count; return 0; } /* A callback function to compare two gameseries structures by * comparing their filenames. */ static int gameseriescmp(void const *a, void const *b) { return strcmp(((gameseries*)a)->name, ((gameseries*)b)->name); } /* Search the series directory and generate an array of gameseries * structures corresponding to the data files found there. The array * is returned through list, and the size of the array is returned * through count. If preferred is not NULL, then the array returned * will only contain the series with that string as its filename * (presuming it can be found). The program will be aborted if a * serious error occurs or if no series can be found. */ static int getseriesfiles(char const *preferred, gameseries **list, int *count) { seriesdata s; int n; s.list = NULL; s.allocated = 0; s.count = 0; s.usedatdir = FALSE; if (preferred && *preferred && haspathname(preferred)) { if (getseriesfile((char*)preferred, &s) < 0) return FALSE; if (!s.count) { errmsg(preferred, "couldn't read data file"); return FALSE; } *seriesdir = '\0'; s.list[0].gsflags |= GSF_NODEFAULTSAVE; } else { if (!*seriesdir) return FALSE; if (!findfiles(seriesdir, &s, getseriesfile) || !s.count) { errmsg(seriesdir, "directory contains no data files"); return FALSE; } if (preferred && *preferred) { for (n = 0 ; n < s.count ; ++n) { if (!strcmp(s.list[n].name, preferred)) { s.list[0] = s.list[n]; s.count = 1; n = 0; break; } } if (n == s.count) { errmsg(preferred, "no such data file"); return FALSE; } } if (s.count > 1) qsort(s.list, s.count, sizeof *s.list, gameseriescmp); } *list = s.list; *count = s.count; return TRUE; } /* Produce a list of the series that are available for play. An array * of gameseries structures is returned through pserieslist, the size * of the array is returned through pcount, and a table of the the * filenames is returned through table. preferredfile, if not NULL, * limits the results to just the series with that filename. */ int createserieslist(char const *preferredfile, gameseries **pserieslist, int *pcount, tablespec *table) { static char const *rulesetname[Ruleset_Count]; gameseries *serieslist; char **ptrs; char *textheap; int listsize; int used, col, n, y; if (!getseriesfiles(preferredfile, &serieslist, &listsize)) return FALSE; if (!table) { *pserieslist = serieslist; *pcount = listsize; return TRUE; } col = 8; for (n = 0 ; n < listsize ; ++n) if (col < (int)strlen(serieslist[n].name)) col = strlen(serieslist[n].name); if (col > 48) col = 48; rulesetname[Ruleset_Lynx] = "Lynx"; rulesetname[Ruleset_MS] = "MS"; ptrs = malloc((listsize + 1) * 2 * sizeof *ptrs); textheap = malloc((listsize + 1) * (col + 32)); if (!ptrs || !textheap) memerrexit(); n = 0; used = 0; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-Filename"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1.Ruleset"); for (y = 0 ; y < listsize ; ++y) { ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-%-*s", col, serieslist[y].name); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1.%s", rulesetname[serieslist[y].ruleset]); } *pserieslist = serieslist; *pcount = listsize; table->rows = listsize + 1; table->cols = 2; table->sep = 2; table->collapse = 0; table->items = ptrs; return TRUE; } /* Make an independent copy of a single gameseries structure from list. */ void getseriesfromlist(gameseries *dest, gameseries const *list, int index) { int n; *dest = list[index]; n = strlen(list[index].mapfilename) + 1; if (!(dest->mapfilename = malloc(n))) memerrexit(); memcpy(dest->mapfilename, list[index].mapfilename, n); } /* Free all memory allocated by the createserieslist() table. */ void freeserieslist(gameseries *list, int count, tablespec *table) { int n; if (list) { for (n = 0 ; n < count ; ++n) free(list[n].mapfilename); free(list); } if (table) { free((void*)table->items[0]); free(table->items); } } /* * Miscellaneous functions */ /* A function for looking up a specific level in a series by number * and/or password. */ int findlevelinseries(gameseries const *series, int number, char const *passwd) { int i, n; n = -1; if (number) { for (i = 0 ; i < series->count ; ++i) { if (series->games[i].number == number) { if (!passwd || !strcmp(series->games[i].passwd, passwd)) { if (n >= 0) return -1; n = i; } } } } else if (passwd) { for (i = 0 ; i < series->count ; ++i) { if (!strcmp(series->games[i].passwd, passwd)) { if (n >= 0) return -1; n = i; } } } else { return -1; } return n; } tworld-1.3.0/series.h0000644000175000017500000000451310416445107014634 0ustar breadboxbreadbox/* series.h: Functions for finding and reading the series files. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _series_h_ #define _series_h_ #include "defs.h" /* The directory containing the series files. */ extern char *seriesdir; /* The directory containing the configured data files. */ extern char *seriesdatdir; /* Load all levels of the given series. */ extern int readseriesfile(gameseries *series); /* Release all resources associated with a gameseries structure. */ extern void freeseriesdata(gameseries *series); /* Produce a list all available data files. pserieslist receives the * location of an array of gameseries structures, one per data file * successfully found. pcount points to a value that is filled in with * the number of the data files. table, if it is not NULL, is filled * in with a tabular representation of the list of data files, showing * the names of the files and which ruleset each uses, with the first * row of the table containing column headres. preferredfile * optionally provides the filename or pathname of a single data file. * If the preferred data file is found, it will be the only one * returned. FALSE is returned if no series files are found. An * unrecoverable error will cause the function to abort the program. */ extern int createserieslist(char const *preferredfile, gameseries **pserieslist, int *pcount, tablespec *table); /* Make an independent copy of a single gameseries structure from * a list obtained from createserieslist(). */ extern void getseriesfromlist(gameseries *dest, gameseries const *list, int index); /* Free the memory used by the table created in createserieslist(). * Either serieslist or table can be NULL. */ extern void freeserieslist(gameseries *serieslist, int count, tablespec *table); /* A function for looking up a specific level in a series by number * and/or password. If number is -1, only the password will be * searched for; if passwd is NULL, only the number will be used. The * function returns the index of the game in the series, or -1 if the * data could not be matched, or if it matched more than one level * (ugh). */ extern int findlevelinseries(gameseries const *series, int number, char const *passwd); #endif tworld-1.3.0/solution.c0000644000175000017500000006113210420303207015176 0ustar breadboxbreadbox/* solution.c: Functions for reading and writing the solution files. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include "defs.h" #include "err.h" #include "fileio.h" #include "series.h" #include "solution.h" /* * The following is a description of the solution file format. Note that * numeric values are always stored in little-endian order, consistent * with the data file. * * The header is at least eight bytes long, and contains the following * values: * * HEADER * 0-3 signature bytes (35 33 9B 99) * 4 ruleset (1=Lynx, 2=MS) * 5 other options (currently always zero) * 6 other options (currently always zero) * 7 count of bytes in remainder of header (currently always zero) * * After the header are level solutions, usually but not necessarily * in numerical order. Each solution begins with the following values: * * PER LEVEL * 0-3 offset to next solution (from the end of this field) * 4-5 level number * 6-9 level password (four ASCII characters in "cleartext") * 10 other flags (currently always zero) * 11 initial random slide direction and stepping value * 12-15 initial random number generator value * 16-19 time of solution in ticks * 20-xx solution bytes * * If the offset field is 0, then none of the other fields are * present. (This permits the file to contain padding.) If the offset * field is 6, then the level's number and password are present but * without a saved game. Otherwise, the offset should never be less * than 16. * * Note that byte 11 contains the initial random slide direction in * the bottom three bits, and the initial stepping value in the next * three bits. The top two bits are unused. (The initial random slide * direction is always zero under the MS ruleset.) * * The solution bytes consist of a stream of values indicating the * moves of the solution. The values vary in size from one to five * bytes in length. The size of each value is always specified in the * first byte. There are five different formats for the values. (Note * that in the following byte diagrams, the bits are laid out * little-endian instead of the usual MSB-first.) * * The first format can be either one or two bytes long. The two-byte * form is shown here: * * #1: 01234567 89012345 * NNDDDTTT TTTTTTTT * * The two lowest bits, marked with Ns, contain either one (01) or two * (10), and indicate how many bytes are used. The next three bits, * marked with Ds, contain the direction of the move. The remaining * bits are marked with Ts, and these indicate the amount of time, in * ticks, between this move and the prior move, less one. (Thus, a * value of T=0 indicates a move that occurs on the tick immediately * following the previous move.) The very first move of a solution is * an exception: it is not decremented, as that would sometimes * require a negative value to be stored. If the one-byte version is * used, then T is only three bits in size; otherwise T is 11 bits * long. * * The second format is four bytes in length: * * #2: 01234567 89012345 67890123 45678901 * 11DD0TTT TTTTTTTT TTTTTTTT TTTTTTTT * * This format allocates 27 bits for the time value. (The top four * bits will always be zero, however, as the game's timer is currently * limited to 23 bits.) Since there are only two bits available for * storing the direction, this format can only be used to store * orthogonal moves (i.e. it cannot be used to store a Lynx diagonal * move). * * The third format has the form: * * #3: 01234567 * 00DDEEFF * * This value encodes three separate moves (DD, EE, and FF) packed * into a single byte. Each move has an implicit time value of four * ticks separating it from the prior move (i.e. T=3). Like the second * format, only two bits are used to store each move. * * The fourth and final format, like the first format, can vary in * size. It can be two, three, four, or five bytes long, depending on * how many bits are needed to store the time interval. It is shown * here in its largest form: * * #4: 01234567 89012345 67890123 45678901 23456789 * 11NN1DDD DDDDDDTT TTTTTTTT TTTTTTTT TTTTTTTT * * The two bits marked NN indicate the size of the field in bytes, * less two (i.e., 00 for a two-byte value, 11 for a five-byte value). * Seven bits are used to indicate the move's direction, which allows * this field to store MS mouse moves. The time value is encoded * normally, and can be 2, 10, 18, or 26 bits long. */ /* The signature bytes of the solution files. */ #define CSSIG 0x999B3335UL /* Translate move directions between three-bit and four-bit * representations. * * 0 = NORTH = 0001 = 1 * 1 = WEST = 0010 = 2 * 2 = SOUTH = 0100 = 4 * 3 = EAST = 1000 = 8 * 4 = NORTH | WEST = 0011 = 3 * 5 = SOUTH | WEST = 0110 = 6 * 6 = NORTH | EAST = 1001 = 9 * 7 = SOUTH | EAST = 1100 = 12 */ static int const diridx8[16] = { -1, 0, 1, 4, 2, -1, 5, -1, 3, 6, -1, -1, 7, -1, -1, -1 }; static int const idxdir8[8] = { NORTH, WEST, SOUTH, EAST, NORTH | WEST, SOUTH | WEST, NORTH | EAST, SOUTH | EAST }; #define isdirectmove(dir) (directionalcmd(dir)) #define ismousemove(dir) (!isdirectmove(dir)) #define isdiagonal(dir) (isdirectmove(dir) && diridx8[dir] > 3) #define isorthogonal(dir) (isdirectmove(dir) && diridx8[dir] <= 3) #define dirtoindex(dir) (diridx8[dir]) #define indextodir(dir) (idxdir8[dir]) /* TRUE if file modification is prohibited. */ int readonly = FALSE; /* The path of the directory containing the user's solution files. */ char *savedir = NULL; /* * Functions for manipulating move lists. */ /* Initialize or reinitialize list as empty. */ void initmovelist(actlist *list) { if (!list->allocated || !list->list) { list->allocated = 16; xalloc(list->list, list->allocated * sizeof *list->list); } list->count = 0; } /* Append move to the end of list. */ void addtomovelist(actlist *list, action move) { if (list->count >= list->allocated) { list->allocated *= 2; xalloc(list->list, list->allocated * sizeof *list->list); } list->list[list->count++] = move; } /* Make to an independent copy of from. */ void copymovelist(actlist *to, actlist const *from) { if (!to->allocated || !to->list) to->allocated = 16; while (to->allocated < from->count) to->allocated *= 2; xalloc(to->list, to->allocated * sizeof *to->list); to->count = from->count; if (from->count) memcpy(to->list, from->list, from->count * sizeof *from->list); } /* Deallocate list. */ void destroymovelist(actlist *list) { if (list->list) free(list->list); list->allocated = 0; list->list = NULL; } /* * Functions for handling the solution file header. */ /* Read the header bytes of the given solution file. flags receives * the option bytes (bytes 5-6). extra receives any bytes in the * header that this code doesn't recognize. */ static int readsolutionheader(fileinfo *file, int ruleset, int *flags, int *extrasize, unsigned char *extra) { unsigned long sig; unsigned short f; unsigned char n; if (!filereadint32(file, &sig, "not a valid solution file")) return FALSE; if (sig != CSSIG) return fileerr(file, "not a valid solution file"); if (!filereadint8(file, &n, "not a valid solution file")) return FALSE; if (n != ruleset) return fileerr(file, "solution file is for a different ruleset" " than the level set file"); if (!filereadint16(file, &f, "not a valid solution file")) return FALSE; *flags = (int)f; if (!filereadint8(file, &n, "not a valid solution file")) return FALSE; *extrasize = n; if (n) if (!fileread(file, extra, *extrasize, "not a valid solution file")) return FALSE; return TRUE; } /* Write the header bytes to the given solution file. */ static int writesolutionheader(fileinfo *file, int ruleset, int flags, int extrasize, unsigned char const *extra) { return filewriteint32(file, CSSIG, NULL) && filewriteint8(file, ruleset, NULL) && filewriteint16(file, flags, NULL) && filewriteint8(file, extrasize, NULL) && filewrite(file, extra, extrasize, NULL); } /* Write the name of the level set to the given solution file. */ static int writesolutionsetname(fileinfo *file, char const *setname) { char zeroes[16] = ""; int n; n = strlen(setname) + 1; return filewriteint32(file, n + 16, NULL) && filewrite(file, zeroes, 16, NULL) && filewrite(file, setname, n, NULL); } /* * Solution translation. */ /* Expand a level's solution data into an actual list of moves. */ int expandsolution(solutioninfo *solution, gamesetup const *game) { unsigned char const *dataend; unsigned char const *p; action act; int n; if (game->solutionsize <= 16) return FALSE; solution->flags = game->solutiondata[6]; solution->rndslidedir = indextodir(game->solutiondata[7] & 7); solution->stepping = (game->solutiondata[7] >> 3) & 7; solution->rndseed = game->solutiondata[8] | (game->solutiondata[9] << 8) | (game->solutiondata[10] << 16) | (game->solutiondata[11] << 24); initmovelist(&solution->moves); act.when = -1; p = game->solutiondata + 16; dataend = game->solutiondata + game->solutionsize; while (p < dataend) { switch (*p & 0x03) { case 0: act.dir = indextodir((*p >> 2) & 0x03); act.when += 4; addtomovelist(&solution->moves, act); act.dir = indextodir((*p >> 4) & 0x03); act.when += 4; addtomovelist(&solution->moves, act); act.dir = indextodir((*p >> 6) & 0x03); act.when += 4; addtomovelist(&solution->moves, act); ++p; break; case 1: act.dir = indextodir((*p >> 2) & 0x07); act.when += ((*p >> 5) & 0x07) + 1; addtomovelist(&solution->moves, act); ++p; break; case 2: if (p + 2 > dataend) goto truncated; act.dir = indextodir((*p >> 2) & 0x07); act.when += ((p[0] >> 5) & 0x07) + ((unsigned long)p[1] << 3) + 1; addtomovelist(&solution->moves, act); p += 2; break; case 3: if (*p & 0x10) { n = (*p >> 2) & 0x03; if (p + 2 + n > dataend) goto truncated; act.dir = ((p[0] >> 5) & 0x07) | ((p[1] & 0x3F) << 3); act.when += (p[1] >> 6) & 0x03; while (n--) act.when += (unsigned long)p[2 + n] << (2 + n * 8); ++act.when; p += 2 + ((*p >> 2) & 0x03); } else { if (p + 4 > dataend) goto truncated; act.dir = indextodir((*p >> 2) & 0x03); act.when += ((p[0] >> 5) & 0x07) | ((unsigned long)p[1] << 3) | ((unsigned long)p[2] << 11) | ((unsigned long)p[3] << 19); ++act.when; p += 4; } addtomovelist(&solution->moves, act); break; } } return TRUE; truncated: errmsg(NULL, "level %d: truncated solution data", game->number); initmovelist(&solution->moves); return FALSE; } /* Take the given solution and compress it, storing the compressed * data as part of the level's setup. */ int contractsolution(solutioninfo const *solution, gamesetup *game) { action const *move; unsigned char *data; int size, est, delta, when, i; free(game->solutiondata); game->solutionsize = 0; game->solutiondata = NULL; if (!solution->moves.count) return TRUE; size = 21; move = solution->moves.list + 1; for (i = 1 ; i < solution->moves.count ; ++i, ++move) size += !isorthogonal(move->dir) ? 5 : move[0].when - move[-1].when <= (1 << 3) ? 1 : move[0].when - move[-1].when <= (1 << 11) ? 2 : 4; data = malloc(size); if (!data) { errmsg(NULL, "failed to record level %d solution:" " out of memory", game->number); return FALSE; } est = size; data[0] = game->number & 0xFF; data[1] = (game->number >> 8) & 0xFF; data[2] = game->passwd[0]; data[3] = game->passwd[1]; data[4] = game->passwd[2]; data[5] = game->passwd[3]; data[6] = solution->flags; data[7] = dirtoindex(solution->rndslidedir) | (solution->stepping << 3); data[8] = solution->rndseed & 0xFF; data[9] = (solution->rndseed >> 8) & 0xFF; data[10] = (solution->rndseed >> 16) & 0xFF; data[11] = (solution->rndseed >> 24) & 0xFF; data[12] = game->besttime & 0xFF; data[13] = (game->besttime >> 8) & 0xFF; data[14] = (game->besttime >> 16) & 0xFF; data[15] = (game->besttime >> 24) & 0xFF; when = -1; size = 16; move = solution->moves.list; for (i = 0 ; i < solution->moves.count ; ++i, ++move) { delta = -when - 1; when = move->when; delta += when; if (ismousemove(move->dir) || (isdiagonal(move->dir) && delta >= (1 << 11))) { data[size] = 0x13 | ((move->dir << 5) & 0xE0); data[size + 1] = ((move->dir >> 3) & 0x3F) | ((delta & 0x03) << 6); if (delta < (1 << 2)) { size += 2; } else { data[size + 2] = (delta >> 2) & 0xFF; if (delta < (1 << 10)) { data[size] |= 1 << 2; size += 3; } else { data[size + 3] = (delta >> 10) & 0xFF; if (delta < (1 << 18)) { data[size] |= 2 << 2; size += 4; } else { data[size + 4] = (delta >> 18) & 0xFF; data[size] |= 3 << 2; size += 5; } } } } else if (delta == 3 && i + 2 < solution->moves.count && isorthogonal(move[0].dir) && move[1].when - move[0].when == 4 && isorthogonal(move[1].dir) && move[2].when - move[1].when == 4 && isorthogonal(move[2].dir)) { data[size++] = (dirtoindex(move[0].dir) << 2) | (dirtoindex(move[1].dir) << 4) | (dirtoindex(move[2].dir) << 6); move += 2; i += 2; when = move->when; } else if (delta < (1 << 3)) { data[size++] = 0x01 | (dirtoindex(move->dir) << 2) | ((delta << 5) & 0xE0); } else if (delta < (1 << 11)) { data[size++] = 0x02 | (dirtoindex(move->dir) << 2) | ((delta << 5) & 0xE0); data[size++] = (delta >> 3) & 0xFF; } else { data[size++] = 0x03 | (dirtoindex(move->dir) << 2) | ((delta << 5) & 0xE0); data[size++] = (delta >> 3) & 0xFF; data[size++] = (delta >> 11) & 0xFF; data[size++] = (delta >> 19) & 0xFF; } } game->solutionsize = size; game->solutiondata = realloc(data, size); if (!game->solutiondata) game->solutiondata = data; return TRUE; } /* * File I/O for level solutions. */ /* Read the data of a one complete solution from the given file into * the appropriate fields of game. */ static int readsolution(fileinfo *file, gamesetup *game) { unsigned long size; game->number = 0; game->sgflags = 0; game->besttime = TIME_NIL; game->solutionsize = 0; game->solutiondata = NULL; if (!file->fp) return TRUE; if (!filereadint32(file, &size, NULL) || size == 0xFFFFFFFF) return FALSE; if (!size) return TRUE; game->solutionsize = size; game->solutiondata = filereadbuf(file, size, "unexpected EOF"); if (!game->solutiondata || (size <= 16 && size != 6)) return fileerr(file, "invalid data in solution file"); game->number = (game->solutiondata[1] << 8) | game->solutiondata[0]; memcpy(game->passwd, game->solutiondata + 2, 4); game->passwd[5] = '\0'; game->sgflags |= SGF_HASPASSWD; if (size == 6) return TRUE; game->besttime = game->solutiondata[12] | (game->solutiondata[13] << 8) | (game->solutiondata[14] << 16) | (game->solutiondata[15] << 24); size -= 16; if (!game->number && !*game->passwd) { game->sgflags |= SGF_SETNAME; if (size > 255) size = 255; memcpy(game->name, game->solutiondata + 16, size); game->name[size] = '\0'; free(game->solutiondata); game->solutionsize = 0; game->solutiondata = NULL; } return TRUE; } /* Write the data of one complete solution from the appropriate fields * of game to the given file. */ static int writesolution(fileinfo *file, gamesetup const *game) { if (game->solutionsize) { if (!filewriteint32(file, game->solutionsize, "write error") || !filewrite(file, game->solutiondata, game->solutionsize, "write error")) return FALSE; } else if (game->sgflags & SGF_HASPASSWD) { if (!filewriteint32(file, 6, "write error") || !filewriteint16(file, game->number, "write error") || !filewrite(file, game->passwd, 4, "write error")) return FALSE; } return TRUE; } /* * File I/O for solution files. */ /* Locate the solution file for the given data file and open it. */ static int opensolutionfile(fileinfo *file, char const *datname, int writable) { static int savedirchecked = FALSE; char *buf = NULL; char const *filename; int n; if (writable && readonly) return FALSE; if (file->name) { filename = file->name; } else { n = strlen(datname); if (datname[n - 4] == '.' && tolower(datname[n - 3]) == 'd' && tolower(datname[n - 2]) == 'a' && tolower(datname[n - 1]) == 't') n -= 4; xalloc(buf, n + 5); memcpy(buf, datname, n); memcpy(buf + n, ".tws", 5); filename = buf; } if (writable) { if (!savedirchecked && savedir && *savedir && !haspathname(filename)) { savedirchecked = TRUE; if (!finddir(savedir)) { *savedir = '\0'; fileerr(file, "can't access directory"); } } } n = openfileindir(file, savedir, filename, writable ? "wb" : "rb", writable ? "can't access file" : NULL); if (buf) free(buf); return n; } /* Read the saved solution data for the given series into memory. */ int readsolutions(gameseries *series) { gamesetup gametmp; int n; if (!series->savefile.name) series->savefile.name = series->savefilename; if ((!series->savefile.name && (series->gsflags & GSF_NODEFAULTSAVE)) || !opensolutionfile(&series->savefile, series->filebase, FALSE)) { series->solheaderflags = 0; series->solheadersize = 0; return TRUE; } if (!readsolutionheader(&series->savefile, series->ruleset, &series->solheaderflags, &series->solheadersize, series->solheader)) return FALSE; memset(&gametmp, 0, sizeof gametmp); for (;;) { if (!readsolution(&series->savefile, &gametmp)) break; if (gametmp.sgflags & SGF_SETNAME) { if (strcmp(gametmp.name, series->name)) { errmsg(series->name, "ignoring solution file %s as it was" " recorded for a different level set: %s", series->savefile.name, gametmp.name); series->gsflags |= GSF_NOSAVING; return FALSE; } continue; } n = findlevelinseries(series, gametmp.number, gametmp.passwd); if (n < 0) { n = findlevelinseries(series, 0, gametmp.passwd); if (n < 0) { fileerr(&series->savefile, "unmatched password in solution file"); continue; } warn("level %d has been moved to level %d", gametmp.number, series->games[n].number); } series->games[n].besttime = gametmp.besttime; series->games[n].sgflags = gametmp.sgflags; series->games[n].solutionsize = gametmp.solutionsize; series->games[n].solutiondata = gametmp.solutiondata; } fileclose(&series->savefile, NULL); return TRUE; } /* Write out all the solutions for the given series. */ int savesolutions(gameseries *series) { gamesetup *game; int i; if (readonly || (series->gsflags & GSF_NOSAVING)) return TRUE; if (series->savefile.fp) fileclose(&series->savefile, NULL); if (!series->savefile.name) series->savefile.name = series->savefilename; if (!series->savefile.name && (series->gsflags & GSF_NODEFAULTSAVE)) return TRUE; if (!opensolutionfile(&series->savefile, series->filebase, TRUE)) return FALSE; if (!writesolutionheader(&series->savefile, series->ruleset, series->solheaderflags, series->solheadersize, series->solheader)) return fileerr(&series->savefile, "saved-game file has become corrupted!"); if (!writesolutionsetname(&series->savefile, series->name)) return fileerr(&series->savefile, "saved-game file has become corrupted!"); for (i = 0, game = series->games ; i < series->count ; ++i, ++game) { if (!writesolution(&series->savefile, game)) return fileerr(&series->savefile, "saved-game file has become corrupted!"); } fileclose(&series->savefile, NULL); return TRUE; } /* Free all memory allocated for storing the game's solutions, and mark * the levels as being unsolved. */ void clearsolutions(gameseries *series) { gamesetup *game; int n; for (n = 0, game = series->games ; n < series->count ; ++n, ++game) { free(game->solutiondata); game->besttime = TIME_NIL; game->sgflags = 0; game->solutionsize = 0; game->solutiondata = NULL; } series->solheadersize = 0; series->solheaderflags = 0; fileclose(&series->savefile, NULL); clearfileinfo(&series->savefile); } /* Extract just the set name from the given solution file. */ int loadsolutionsetname(char const *filename, char *buffer) { fileinfo file; unsigned long dwrd; unsigned short word; int size; clearfileinfo(&file); if (!openfileindir(&file, savedir, filename, "rb", NULL)) return -1; if (!filereadint32(&file, &dwrd, NULL) || dwrd != CSSIG) goto badfile; if (!filereadint32(&file, &dwrd, NULL)) goto badfile; dwrd = (dwrd >> 24) & 0xFF; if (!fileskip(&file, dwrd, NULL) || !filereadint32(&file, &dwrd, NULL)) goto badfile; size = dwrd - 16; if (size <= 0) goto nosetname; if (!filereadint16(&file, &word, NULL) || !filereadint32(&file, &dwrd, NULL)) goto badfile; if (word || dwrd) goto nosetname; if (!fileskip(&file, 10, NULL) || !fileread(&file, buffer, size, NULL)) goto badfile; fileclose(&file, NULL); return size; badfile: fileclose(&file, NULL); return -1; nosetname: fileclose(&file, NULL); return 0; } /* * Creating the list of solution files. */ /* Mini-structure for passing data in and out of findfiles(). */ typedef struct solutiondata { char *pool; /* the found filenames, pooled together */ int allocated; /* number of bytes allocated for the pool */ int count; /* number of filenames in the pool */ char const *prefix; /* the filename prefix to seek */ int prefixlen; /* length of the filename prefix */ } solutiondata; /* If the given file starts with the prefix stored in the solutiondata * structure, then add it to the pool of filenames, prefixed with * "1-". This function is a callback for findfiles(). */ static int getsolutionfile(char *filename, void *data) { solutiondata *sdata = data; int n; if (!memcmp(filename, sdata->prefix, sdata->prefixlen)) { n = strlen(filename) + 1; xalloc(sdata->pool, sdata->allocated + n + 2); sdata->pool[sdata->allocated++] = '1'; sdata->pool[sdata->allocated++] = '-'; memcpy(sdata->pool + sdata->allocated, filename, n); sdata->allocated += n; ++sdata->count; } return 0; } /* Produce a list of available solution files associated with the * given series (i.e. that have the name of the series as their * prefix). An array of filenames is returned through pfilelist, the * array's size is returned through pcount, and the table of the * filenames is returned through table. FALSE is returned if no table * was returned. If morethanone is TRUE, and less than two solution * files are found, FALSE is returned and the table is not created. */ int createsolutionfilelist(gameseries const *series, int morethanone, char const ***pfilelist, int *pcount, tablespec *table) { solutiondata s; char const **filelist; int offset, i, n; s.pool = NULL; s.allocated = 0; s.count = 0; s.prefix = series->name; s.prefixlen = n = strlen(series->name); if (n > 4 && s.prefix[n - 4] == '.' && tolower(s.prefix[n - 3]) == 'd' && tolower(s.prefix[n - 2]) == 'a' && tolower(s.prefix[n - 1]) == 't') s.prefixlen -= 4; if (!findfiles(savedir, &s, getsolutionfile) || !s.count) return FALSE; if (s.count == 0 || (s.count == 1 && morethanone)) { free(s.pool); return FALSE; } filelist = malloc(s.count * sizeof *filelist); table->items = malloc((2 * s.count + 1) * sizeof *table->items); if (!filelist || !table->items) memerrexit(); table->rows = s.count + 1; table->cols = 2; table->sep = 4; table->collapse = 1; table->items[0] = "2-Select a solution file"; offset = 0; for (i = 0 ; i < s.count ; ++i) { n = strlen(s.pool + offset) + 1; filelist[i] = s.pool + offset + 2; table->items[2 * i + 1] = "1+\267"; table->items[2 * i + 2] = s.pool + offset; offset += n; } *pfilelist = filelist; if (pcount) *pcount = s.count; return TRUE; } /* Free the memory allocated by createsolutionfilelist(). */ void freesolutionfilelist(char const **filelist, tablespec *table) { free(filelist); if (table) { free(table->items[2]); free(table->items); } } tworld-1.3.0/solution.h0000644000175000017500000000623410417642400015214 0ustar breadboxbreadbox/* solution.c: Functions for reading and writing the solution files. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _solution_h_ #define _solution_h_ #include "defs.h" #include "fileio.h" /* The path of the directory containing the user's solution files. */ extern char *savedir; /* No file modification will be done unless this variable is FALSE. */ extern int readonly; /* Initialize or reinitialize list as empty. */ extern void initmovelist(actlist *list); /* Append move to the end of list. */ extern void addtomovelist(actlist *list, action move); /* Make to an independent copy of from. */ extern void copymovelist(actlist *to, actlist const *from); /* Deallocate list. */ extern void destroymovelist(actlist *list); /* Expand a level's solution data into the actual solution, including * the full list of moves. FALSE is returned if the solution is * invalid or absent. */ extern int expandsolution(solutioninfo *solution, gamesetup const *game); /* Take the given solution and compress it, storing the compressed * data as part of the level's setup. FALSE is returned if an error * occurs. (It is not an error to compress the null solution.) */ extern int contractsolution(solutioninfo const *solution, gamesetup *game); /* Read all the solutions for the given series into memory. FALSE is * returned if an error occurs. Note that it is not an error for the * solution file to not exist. */ extern int readsolutions(gameseries *series); /* Write out all the solutions for the given series. The solution file * is created if it does not currently exist. The solution file's * directory is also created if it does not currently exist. (Nothing * is done if the directory's name has been unset, however.) FALSE is * returned if an error occurs. */ extern int savesolutions(gameseries *series); /* Free all memory allocated for storing the game's solutions, and mark * the levels as being unsolved. */ extern void clearsolutions(gameseries *series); /* Read the solution file at filename to see if it contains a set * name. If so, copy it into buffer and return its length in bytes (up * to 255). Zero is returned if the solution file contains no set * name. A negative value is returned if the file cannot be read or is * not a valid solution file. */ extern int loadsolutionsetname(char const *filename, char *buffer); /* Produce a list of available solution files associated with the * given series (i.e. that have the name of the series as their * prefix). An array of filenames is returned through pfilelist, the * array's size is returned through pcount, and the table of the * filenames is returned through table. FALSE is returned if no table * was returned. If morethanone is TRUE, and less than two solution * files are found, FALSE is returned and the table is not created. */ extern int createsolutionfilelist(gameseries const *series, int morethanone, char const ***pfilelist, int *pcount, tablespec *table); /* Free the memory allocated by createsolutionfilelist(). */ extern void freesolutionfilelist(char const **filelist, tablespec *table); #endif tworld-1.3.0/state.h0000644000175000017500000001613310417716200014457 0ustar breadboxbreadbox/* state.h: Definitions for embodying the state of a game in progress. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _state_h_ #define _state_h_ #include "defs.h" /* The tiles that make up Chip's universe. */ enum { Nothing = 0, Empty = 0x01, Slide_North = 0x02, Slide_West = 0x03, Slide_South = 0x04, Slide_East = 0x05, Slide_Random = 0x06, Ice = 0x07, IceWall_Northwest = 0x08, IceWall_Northeast = 0x09, IceWall_Southwest = 0x0A, IceWall_Southeast = 0x0B, Gravel = 0x0C, Dirt = 0x0D, Water = 0x0E, Fire = 0x0F, Bomb = 0x10, Beartrap = 0x11, Burglar = 0x12, HintButton = 0x13, Button_Blue = 0x14, Button_Green = 0x15, Button_Red = 0x16, Button_Brown = 0x17, Teleport = 0x18, Wall = 0x19, Wall_North = 0x1A, Wall_West = 0x1B, Wall_South = 0x1C, Wall_East = 0x1D, Wall_Southeast = 0x1E, HiddenWall_Perm = 0x1F, HiddenWall_Temp = 0x20, BlueWall_Real = 0x21, BlueWall_Fake = 0x22, SwitchWall_Open = 0x23, SwitchWall_Closed = 0x24, PopupWall = 0x25, CloneMachine = 0x26, Door_Red = 0x27, Door_Blue = 0x28, Door_Yellow = 0x29, Door_Green = 0x2A, Socket = 0x2B, Exit = 0x2C, ICChip = 0x2D, Key_Red = 0x2E, Key_Blue = 0x2F, Key_Yellow = 0x30, Key_Green = 0x31, Boots_Ice = 0x32, Boots_Slide = 0x33, Boots_Fire = 0x34, Boots_Water = 0x35, Block_Static = 0x36, Drowned_Chip = 0x37, Burned_Chip = 0x38, Bombed_Chip = 0x39, Exited_Chip = 0x3A, Exit_Extra_1 = 0x3B, Exit_Extra_2 = 0x3C, Overlay_Buffer = 0x3D, Floor_Reserved2 = 0x3E, Floor_Reserved1 = 0x3F, Chip = 0x40, Block = 0x44, Tank = 0x48, Ball = 0x4C, Glider = 0x50, Fireball = 0x54, Walker = 0x58, Blob = 0x5C, Teeth = 0x60, Bug = 0x64, Paramecium = 0x68, Swimming_Chip = 0x6C, Pushing_Chip = 0x70, Entity_Reserved2 = 0x74, Entity_Reserved1 = 0x78, Water_Splash = 0x7C, Bomb_Explosion = 0x7D, Entity_Explosion = 0x7E, Animation_Reserved1 = 0x7F }; /* Macros to assist in identifying tile taxons. */ #define isslide(f) ((f) >= Slide_North && (f) <= Slide_Random) #define isice(f) ((f) >= Ice && (f) <= IceWall_Southeast) #define isdoor(f) ((f) >= Door_Red && (f) <= Door_Green) #define iskey(f) ((f) >= Key_Red && (f) <= Key_Green) #define isboots(f) ((f) >= Boots_Ice && (f) <= Boots_Water) #define ismsspecial(f) ((f) >= Drowned_Chip && (f) <= Overlay_Buffer) #define isfloor(f) ((f) <= Floor_Reserved1) #define iscreature(f) ((f) >= Chip && (f) < Water_Splash) #define isanimation(f) ((f) >= Water_Splash && (f) <= Animation_Reserved1) /* Macro for getting the tile ID of a creature with a specific direction. */ #define crtile(id, dir) ((id) | diridx(dir)) /* Macros for decomposing a creature tile into ID and direction. */ #define creatureid(id) ((id) & ~3) #define creaturedirid(id) (idxdir((id) & 3)) /* * Substructures of the game state */ /* Two x,y-coordinates give the locations of a button and what it is * connected to. */ typedef struct xyconn { short from; /* location of the button */ short to; /* location of the trap/cloner */ } xyconn; /* A tile on the map. */ typedef struct maptile { unsigned char id; /* identity of the tile */ unsigned char state; /* internal state flags */ } maptile; /* A location on the map. */ typedef struct mapcell { maptile top; /* the upper tile */ maptile bot; /* the lower tile */ } mapcell; /* A creature. */ #if 0 typedef struct creature { signed int pos : 11; /* creature's location */ signed int dir : 5; /* current direction of creature */ signed int id : 8; /* type of creature */ signed int state : 8; /* internal state value */ signed int hidden: 1; /* TRUE if creature is invisible */ signed int moving: 5; /* positional offset of creature */ signed int frame : 5; /* explicit animation index */ signed int tdir : 5; /* internal state value */ } creature; #else typedef struct creature { short pos; /* creature's location */ unsigned char id; /* type of creature */ unsigned char dir; /* current direction of creature */ signed char moving; /* positional offset of creature */ signed char frame; /* explicit animation index */ unsigned char hidden; /* TRUE if creature is invisible */ unsigned char state; /* internal state value */ unsigned char tdir; /* internal state value */ } creature; #endif /* * The game state structure proper. */ /* Ideally, everything that the gameplay module, the display module, * and both logic modules need to know about a game in progress is * in here. */ typedef struct gamestate { gamesetup *game; /* the level specification */ int ruleset; /* the ruleset for the game */ int replay; /* playback move index */ int timelimit; /* maximum time permitted */ int currenttime; /* the current tick count */ int timeoffset; /* offset for displayed time */ short currentinput; /* the current keystroke */ short chipsneeded; /* no. of chips still needed */ short xviewpos; /* the visible part of the */ short yviewpos; /* map (ie, where Chip is) */ short keys[4]; /* keys collected */ short boots[4]; /* boots collected */ short statusflags; /* flags (see below) */ short lastmove; /* most recent move */ unsigned char initrndslidedir; /* initial random-slide dir */ signed char stepping; /* initial timer offset 0-7 */ unsigned long soundeffects; /* the latest sound effects */ actlist moves; /* the list of moves */ prng mainprng; /* the main PRNG */ creature *creatures; /* the creature list */ short trapcount; /* number of trap buttons */ short clonercount; /* number of cloner buttons */ short crlistcount; /* number of creatures */ xyconn traps[256]; /* list of trap wirings */ xyconn cloners[256]; /* list of cloner wirings */ short crlist[256]; /* list of creatures */ char hinttext[256]; /* text of the hint */ mapcell map[CXGRID * CYGRID]; /* the game's map */ unsigned char localstateinfo[256]; /* rule-specific state data */ } gamestate; /* General status flags. */ #define SF_NOSAVING 0x0001 /* solution won't be saved */ #define SF_INVALID 0x0002 /* level is not playable */ #define SF_BADTILES 0x0004 /* map has undefined tiles */ #define SF_SHOWHINT 0x0008 /* display the hint text */ #define SF_NOANIMATION 0x0010 /* suppress tile animation */ #define SF_SHUTTERED 0x0020 /* hide map view */ /* Macros for the keys and boots. */ #define redkeys(st) ((st)->keys[0]) #define bluekeys(st) ((st)->keys[1]) #define yellowkeys(st) ((st)->keys[2]) #define greenkeys(st) ((st)->keys[3]) #define iceboots(st) ((st)->boots[0]) #define slideboots(st) ((st)->boots[1]) #define fireboots(st) ((st)->boots[2]) #define waterboots(st) ((st)->boots[3]) #endif tworld-1.3.0/tworld.c0000644000175000017500000013032010420651031014632 0ustar breadboxbreadbox/* tworld.c: The top-level module. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include "defs.h" #include "err.h" #include "series.h" #include "res.h" #include "play.h" #include "score.h" #include "solution.h" #include "unslist.h" #include "help.h" #include "oshw.h" #include "cmdline.h" #include "ver.h" /* Bell-ringing macro. */ #define bell() (silence ? (void)0 : ding()) enum { Play_None, Play_Normal, Play_Back, Play_Verify }; /* The data needed to identify what level is being played. */ typedef struct gamespec { gameseries series; /* the complete set of levels */ int currentgame; /* which level is currently selected */ int playmode; /* which mode to play */ int usepasswds; /* FALSE if passwords are to be ignored */ int status; /* final status of last game played */ int enddisplay; /* TRUE if the final level was completed */ int melindacount; /* count for Melinda's free pass */ } gamespec; /* Structure used to hold data collected by initoptionswithcmdline(). */ typedef struct startupdata { char *filename; /* which data file to use */ char *savefilename; /* an alternate solution file */ int levelnum; /* a selected initial level */ int listdirs; /* TRUE if directories should be listed */ int listseries; /* TRUE if the files should be listed */ int listscores; /* TRUE if the scores should be listed */ int listtimes; /* TRUE if the times should be listed */ int batchverify; /* TRUE to enter batch verification */ } startupdata; /* Structure used to hold the complete list of available series. */ typedef struct seriesdata { gameseries *list; /* the array of available series */ int count; /* size of arary */ tablespec table; /* table for displaying the array */ } seriesdata; /* TRUE suppresses sound and the console bell. */ static int silence = FALSE; /* TRUE means the program should attempt to run in fullscreen mode. */ static int fullscreen = FALSE; /* FALSE suppresses all password checking. */ static int usepasswds = TRUE; /* TRUE if the user requested an idle-time histogram. */ static int showhistogram = FALSE; /* Slowdown factor, used for debugging. */ static int mudsucking = 1; /* Frame-skipping disable flag. */ static int noframeskip = FALSE; /* The sound buffer scaling factor. */ static int soundbufsize = -1; /* The initial volume level. */ static int volumelevel = -1; /* The top of the stack of subtitles. */ static void **subtitlestack = NULL; /* * Text-mode output functions. */ /* Find a position to break a string inbetween words. The integer at * breakpos receives the length of the string prefix less than or * equal to len. The string pointer *str is advanced to the first * non-whitespace after the break. The original string pointer is * returned. */ static char *findstrbreak(char const **str, int maxlen, int *breakpos) { char const *start; int n; retry: start = *str; n = strlen(start); if (n <= maxlen) { *str += n; *breakpos = n; } else { n = maxlen; if (isspace(start[n])) { *str += n; while (isspace(**str)) ++*str; while (n > 0 && isspace(start[n - 1])) --n; if (n == 0) goto retry; *breakpos = n; } else { while (n > 0 && !isspace(start[n - 1])) --n; if (n == 0) { *str += maxlen; *breakpos = maxlen; } else { *str = start + n; while (n > 0 && isspace(start[n - 1])) --n; if (n == 0) goto retry; *breakpos = n; } } } return (char*)start; } /* Render a table to the given file. This function encapsulates both * the process of determining the necessary widths for each column of * the table, and then sequentially rendering the table's contents to * a stream. On the first pass through the data, single-cell * non-word-wrapped entries are measured and each column sized to fit. * If the resulting table is too large for the given area, then the * collapsible column is reduced as necessary. If there is still * space, however, then the entries that span multiple cells are * measured in a second pass, and columns are grown to fit them as * well where needed. If there is still space after this, the column * containing word-wrapped entries may be expanded as well. */ void printtable(FILE *out, tablespec const *table) { int const maxwidth = 79; char const *mlstr; char const *p; int *colsizes; int mlindex, mlwidth, mlpos; int diff, pos; int i, j, n, i0, c, w, z; if (!(colsizes = malloc(table->cols * sizeof *colsizes))) return; for (i = 0 ; i < table->cols ; ++i) colsizes[i] = 0; mlindex = -1; mlwidth = 0; n = 0; for (j = 0 ; j < table->rows ; ++j) { for (i = 0 ; i < table->cols ; ++n) { c = table->items[n][0] - '0'; if (c == 1) { w = strlen(table->items[n] + 2); if (table->items[n][1] == '!') { if (w > mlwidth || mlindex != i) mlwidth = w; mlindex = i; } else { if (w > colsizes[i]) colsizes[i] = w; } } i += c; } } w = -table->sep; for (i = 0 ; i < table->cols ; ++i) w += colsizes[i] + table->sep; diff = maxwidth - w; if (diff < 0 && table->collapse >= 0) { w = -diff; if (colsizes[table->collapse] < w) w = colsizes[table->collapse] - 1; colsizes[table->collapse] -= w; diff += w; } if (diff > 0) { n = 0; for (j = 0 ; j < table->rows && diff > 0 ; ++j) { for (i = 0 ; i < table->cols ; ++n) { c = table->items[n][0] - '0'; if (c > 1 && table->items[n][1] != '!') { w = table->sep + strlen(table->items[n] + 2); for (i0 = i ; i0 < i + c ; ++i0) w -= colsizes[i0] + table->sep; if (w > 0) { if (table->collapse >= i && table->collapse < i + c) i0 = table->collapse; else if (mlindex >= i && mlindex < i + c) i0 = mlindex; else i0 = i + c - 1; if (w > diff) w = diff; colsizes[i0] += w; diff -= w; if (diff == 0) break; } } i += c; } } } if (diff > 0 && mlindex >= 0 && colsizes[mlindex] < mlwidth) { mlwidth -= colsizes[mlindex]; w = mlwidth < diff ? mlwidth : diff; colsizes[mlindex] += w; diff -= w; } n = 0; for (j = 0 ; j < table->rows ; ++j) { mlstr = NULL; mlwidth = mlpos = 0; pos = 0; for (i = 0 ; i < table->cols ; ++n) { if (i) pos += fprintf(out, "%*s", table->sep, ""); c = table->items[n][0] - '0'; w = -table->sep; while (c--) w += colsizes[i++] + table->sep; if (table->items[n][1] == '-') fprintf(out, "%-*.*s", w, w, table->items[n] + 2); else if (table->items[n][1] == '+') fprintf(out, "%*.*s", w, w, table->items[n] + 2); else if (table->items[n][1] == '.') { z = (w - strlen(table->items[n] + 2)) / 2; if (z < 0) z = w; fprintf(out, "%*.*s%*s", w - z, w - z, table->items[n] + 2, z, ""); } else if (table->items[n][1] == '!') { mlwidth = w; mlpos = pos; mlstr = table->items[n] + 2; p = findstrbreak(&mlstr, w, &z); fprintf(out, "%.*s%*s", z, p, w - z, ""); } pos += w; } fputc('\n', out); while (mlstr && *mlstr) { p = findstrbreak(&mlstr, mlwidth, &w); fprintf(out, "%*s%.*s\n", mlpos, "", w, p); } } free(colsizes); } /* Display directory settings. */ static void printdirectories(void) { printf("Resource files read from: %s\n", resdir); printf("Level sets read from: %s\n", seriesdir); printf("Configured data files read from: %s\n", seriesdatdir); printf("Solution files saved in: %s\n", savedir); } /* * Callback functions for oshw. */ /* An input callback that only accepts the characters Y and N. */ static int yninputcallback(void) { switch (input(TRUE)) { case 'Y': case 'y': return 'Y'; case 'N': case 'n': return 'N'; case CmdWest: return '\b'; case CmdProceed: return '\n'; case CmdQuitLevel: return -1; case CmdQuit: exit(0); } return 0; } /* An input callback that accepts only alphabetic characters. */ static int keyinputcallback(void) { int ch; ch = input(TRUE); switch (ch) { case CmdWest: return '\b'; case CmdProceed: return '\n'; case CmdQuitLevel: return -1; case CmdQuit: exit(0); default: if (isalpha(ch)) return toupper(ch); } return 0; } /* An input callback used while displaying a scrolling list. */ static int scrollinputcallback(int *move) { int cmd; switch ((cmd = input(TRUE))) { case CmdPrev10: *move = SCROLL_HALFPAGE_UP; break; case CmdNorth: *move = SCROLL_UP; break; case CmdPrev: *move = SCROLL_UP; break; case CmdPrevLevel: *move = SCROLL_UP; break; case CmdSouth: *move = SCROLL_DN; break; case CmdNext: *move = SCROLL_DN; break; case CmdNextLevel: *move = SCROLL_DN; break; case CmdNext10: *move = SCROLL_HALFPAGE_DN; break; case CmdProceed: *move = CmdProceed; return FALSE; case CmdQuitLevel: *move = CmdQuitLevel; return FALSE; case CmdHelp: *move = CmdHelp; return FALSE; case CmdQuit: exit(0); } return TRUE; } /* An input callback used while displaying the scrolling list of scores. */ static int scorescrollinputcallback(int *move) { int cmd; switch ((cmd = input(TRUE))) { case CmdPrev10: *move = SCROLL_HALFPAGE_UP; break; case CmdNorth: *move = SCROLL_UP; break; case CmdPrev: *move = SCROLL_UP; break; case CmdPrevLevel: *move = SCROLL_UP; break; case CmdSouth: *move = SCROLL_DN; break; case CmdNext: *move = SCROLL_DN; break; case CmdNextLevel: *move = SCROLL_DN; break; case CmdNext10: *move = SCROLL_HALFPAGE_DN; break; case CmdProceed: *move = CmdProceed; return FALSE; case CmdSeeSolutionFiles: *move = CmdSeeSolutionFiles; return FALSE; case CmdQuitLevel: *move = CmdQuitLevel; return FALSE; case CmdHelp: *move = CmdHelp; return FALSE; case CmdQuit: exit(0); } return TRUE; } /* An input callback used while displaying the scrolling list of solutions. */ static int solutionscrollinputcallback(int *move) { int cmd; switch ((cmd = input(TRUE))) { case CmdPrev10: *move = SCROLL_HALFPAGE_UP; break; case CmdNorth: *move = SCROLL_UP; break; case CmdPrev: *move = SCROLL_UP; break; case CmdPrevLevel: *move = SCROLL_UP; break; case CmdSouth: *move = SCROLL_DN; break; case CmdNext: *move = SCROLL_DN; break; case CmdNextLevel: *move = SCROLL_DN; break; case CmdNext10: *move = SCROLL_HALFPAGE_DN; break; case CmdProceed: *move = CmdProceed; return FALSE; case CmdSeeScores: *move = CmdSeeScores; return FALSE; case CmdQuitLevel: *move = CmdQuitLevel; return FALSE; case CmdHelp: *move = CmdHelp; return FALSE; case CmdQuit: exit(0); } return TRUE; } /* * Basic game activities. */ /* Return TRUE if the given level is a final level. */ static int islastinseries(gamespec const *gs, int index) { return index == gs->series.count - 1 || gs->series.games[index].number == gs->series.final; } /* Return TRUE if the current level has a solution. */ static int issolved(gamespec const *gs, int index) { return hassolution(gs->series.games + index); } /* Mark the current level's solution as replaceable. */ static void replaceablesolution(gamespec *gs, int change) { if (change < 0) gs->series.games[gs->currentgame].sgflags ^= SGF_REPLACEABLE; else if (change > 0) gs->series.games[gs->currentgame].sgflags |= SGF_REPLACEABLE; else gs->series.games[gs->currentgame].sgflags &= ~SGF_REPLACEABLE; } /* Mark the current level's password as known to the user. */ static void passwordseen(gamespec *gs, int number) { if (!(gs->series.games[number].sgflags & SGF_HASPASSWD)) { gs->series.games[number].sgflags |= SGF_HASPASSWD; savesolutions(&gs->series); } } /* Change the current level, ensuring that the user is not granted * access to a forbidden level. FALSE is returned if the specified * level is not available to the user. */ static int setcurrentgame(gamespec *gs, int n) { if (n == gs->currentgame) return TRUE; if (n < 0 || n >= gs->series.count) return FALSE; if (gs->usepasswds) if (n > 0 && !(gs->series.games[n].sgflags & SGF_HASPASSWD) && !issolved(gs, n -1)) return FALSE; gs->currentgame = n; gs->melindacount = 0; return TRUE; } /* Change the current level by a delta value. If the user cannot go to * that level, the "nearest" level in that direction is chosen * instead. FALSE is returned if the current level remained unchanged. */ static int changecurrentgame(gamespec *gs, int offset) { int sign, m, n; if (offset == 0) return FALSE; m = gs->currentgame; n = m + offset; if (n < 0) n = 0; else if (n >= gs->series.count) n = gs->series.count - 1; if (gs->usepasswds && n > 0) { sign = offset < 0 ? -1 : +1; for ( ; n >= 0 && n < gs->series.count ; n += sign) { if (!n || (gs->series.games[n].sgflags & SGF_HASPASSWD) || issolved(gs, n - 1)) { m = n; break; } } n = m; if (n == gs->currentgame && offset != sign) { n = gs->currentgame + offset - sign; for ( ; n != gs->currentgame ; n -= sign) { if (n < 0 || n >= gs->series.count) continue; if (!n || (gs->series.games[n].sgflags & SGF_HASPASSWD) || issolved(gs, n - 1)) break; } } } if (n == gs->currentgame) return FALSE; gs->currentgame = n; gs->melindacount = 0; return TRUE; } /* Return TRUE if Melinda is watching Chip's progress on this level -- * i.e., if it is possible to earn a pass to the next level. */ static int melindawatching(gamespec const *gs) { if (!gs->usepasswds) return FALSE; if (islastinseries(gs, gs->currentgame)) return FALSE; if (gs->series.games[gs->currentgame + 1].sgflags & SGF_HASPASSWD) return FALSE; if (issolved(gs, gs->currentgame)) return FALSE; return TRUE; } /* * The subtitle stack */ static void pushsubtitle(char const *subtitle) { void **stk; int n; if (!subtitle) subtitle = ""; n = strlen(subtitle) + 1; stk = NULL; xalloc(stk, sizeof(void**) + n); *stk = subtitlestack; subtitlestack = stk; memcpy(stk + 1, subtitle, n); setsubtitle(subtitle); } static void popsubtitle(void) { void **stk; if (subtitlestack) { stk = *subtitlestack; free(subtitlestack); subtitlestack = stk; } setsubtitle(subtitlestack ? (char*)(subtitlestack + 1) : NULL); } static void changesubtitle(char const *subtitle) { int n; if (!subtitle) subtitle = ""; n = strlen(subtitle) + 1; xalloc(subtitlestack, sizeof(void**) + n); memcpy(subtitlestack + 1, subtitle, n); setsubtitle(subtitle); } /* * */ static void dohelp(int topic) { pushsubtitle("Help"); switch (topic) { case Help_First: case Help_FileListKeys: case Help_ScoreListKeys: onlinecontexthelp(topic); break; default: onlinemainhelp(topic); break; } popsubtitle(); } /* Display a scrolling list of the available solution files, and allow * the user to select one. Return TRUE if the user selected a solution * file different from the current one. Do nothing if there is only * one solution file available. (If for some reason the new solution * file cannot be read, TRUE will still be returned, as the list of * solved levels will still need to be updated.) */ static int showsolutionfiles(gamespec *gs) { tablespec table; char const **filelist; int readonly = FALSE; int count, current, f, n; if (haspathname(gs->series.name) || (gs->series.savefilename && haspathname(gs->series.savefilename))) { bell(); return FALSE; } else if (!createsolutionfilelist(&gs->series, FALSE, &filelist, &count, &table)) { bell(); return FALSE; } current = -1; n = 0; if (gs->series.savefilename) { for (n = 0 ; n < count ; ++n) if (!strcmp(filelist[n], gs->series.savefilename)) break; if (n == count) n = 0; else current = n; } pushsubtitle(gs->series.name); for (;;) { f = displaylist("SOLUTION FILES", &table, &n, solutionscrollinputcallback); if (f == CmdProceed) { readonly = FALSE; break; } else if (f == CmdSeeScores) { readonly = TRUE; break; } else if (f == CmdQuitLevel) { n = -1; break; } else if (f == CmdHelp) { dohelp(Help_FileListKeys); } } popsubtitle(); f = n >= 0 && n != current; if (f) { clearsolutions(&gs->series); if (!gs->series.savefilename) gs->series.savefilename = getpathbuffer(); sprintf(gs->series.savefilename, "%.*s", getpathbufferlen(), filelist[n]); if (readsolutions(&gs->series)) { if (readonly) gs->series.gsflags |= GSF_NOSAVING; } else { bell(); } n = gs->currentgame; gs->currentgame = 0; passwordseen(gs, 0); changecurrentgame(gs, n); } freesolutionfilelist(filelist, &table); return f; } /* Display the scrolling list of the user's current scores, and allow * the user to select a current level. */ static int showscores(gamespec *gs) { tablespec table; int *levellist; int ret = FALSE; int count, f, n; restart: if (!createscorelist(&gs->series, gs->usepasswds, CHAR_MZERO, &levellist, &count, &table)) { bell(); return ret; } for (n = 0 ; n < count ; ++n) if (levellist[n] == gs->currentgame) break; pushsubtitle(gs->series.name); for (;;) { f = displaylist(gs->series.filebase, &table, &n, scorescrollinputcallback); if (f == CmdProceed) { n = levellist[n]; break; } else if (f == CmdSeeSolutionFiles) { if (!(gs->series.gsflags & GSF_NODEFAULTSAVE)) { n = levellist[n]; break; } } else if (f == CmdQuitLevel) { n = -1; break; } else if (f == CmdHelp) { dohelp(Help_ScoreListKeys); } } popsubtitle(); freescorelist(levellist, &table); if (f == CmdSeeSolutionFiles) { setcurrentgame(gs, n); ret = showsolutionfiles(gs); goto restart; } if (n < 0) return ret; return setcurrentgame(gs, n) || ret; } /* Obtain a password from the user and move to the requested level. */ static int selectlevelbypassword(gamespec *gs) { char passwd[5] = ""; int n; setgameplaymode(BeginInput); n = displayinputprompt("Enter Password", passwd, 4, keyinputcallback); setgameplaymode(EndInput); if (!n) return FALSE; n = findlevelinseries(&gs->series, 0, passwd); if (n < 0) { bell(); return FALSE; } passwordseen(gs, n); return setcurrentgame(gs, n); } /* * The game-playing functions. */ #define leveldelta(n) if (!changecurrentgame(gs, (n))) { bell(); continue; } /* Get a key command from the user at the start of the current level. */ static int startinput(gamespec *gs) { static int lastlevel = -1; char yn[2]; int cmd, n; if (gs->currentgame != lastlevel) { lastlevel = gs->currentgame; setstepping(0, FALSE); } drawscreen(TRUE); gs->playmode = Play_None; for (;;) { cmd = input(TRUE); if (cmd >= CmdMoveFirst && cmd <= CmdMoveLast) { gs->playmode = Play_Normal; return cmd; } switch (cmd) { case CmdProceed: gs->playmode = Play_Normal; return cmd; case CmdQuitLevel: return cmd; case CmdPrev10: leveldelta(-10); return CmdNone; case CmdPrev: leveldelta(-1); return CmdNone; case CmdPrevLevel: leveldelta(-1); return CmdNone; case CmdNextLevel: leveldelta(+1); return CmdNone; case CmdNext: leveldelta(+1); return CmdNone; case CmdNext10: leveldelta(+10); return CmdNone; case CmdStepping: changestepping(4, TRUE); break; case CmdSubStepping: changestepping(1, TRUE); break; case CmdVolumeUp: changevolume(+2, TRUE); break; case CmdVolumeDown: changevolume(-2, TRUE); break; case CmdHelp: dohelp(Help_KeysBetweenGames); break; case CmdQuit: exit(0); case CmdPlayback: if (prepareplayback()) { gs->playmode = Play_Back; return CmdProceed; } bell(); break; case CmdCheckSolution: if (prepareplayback()) { gs->playmode = Play_Verify; return CmdProceed; } bell(); break; case CmdReplSolution: if (issolved(gs, gs->currentgame)) replaceablesolution(gs, -1); else bell(); break; case CmdKillSolution: if (!issolved(gs, gs->currentgame)) { bell(); break; } yn[0] = '\0'; setgameplaymode(BeginInput); n = displayinputprompt("Really delete solution?", yn, 1, yninputcallback); setgameplaymode(EndInput); if (n && *yn == 'Y') if (deletesolution()) savesolutions(&gs->series); break; case CmdSeeScores: if (showscores(gs)) return CmdNone; break; case CmdSeeSolutionFiles: if (showsolutionfiles(gs)) return CmdNone; break; case CmdGotoLevel: if (selectlevelbypassword(gs)) return CmdNone; break; default: continue; } drawscreen(TRUE); } } /* Get a key command from the user at the completion of the current * level. */ static int endinput(gamespec *gs) { char yn[2]; int bscore = 0, tscore = 0; long gscore = 0; int n; if (gs->status < 0) { if (melindawatching(gs) && secondsplayed() >= 10) { ++gs->melindacount; if (gs->melindacount >= 10) { yn[0] = '\0'; setgameplaymode(BeginInput); n = displayinputprompt("Skip level?", yn, 1, yninputcallback); setgameplaymode(EndInput); if (n && *yn == 'Y') { passwordseen(gs, gs->currentgame + 1); changecurrentgame(gs, +1); } gs->melindacount = 0; return TRUE; } } } else { getscoresforlevel(&gs->series, gs->currentgame, &bscore, &tscore, &gscore); } displayendmessage(bscore, tscore, gscore, gs->status); for (;;) { switch (input(TRUE)) { case CmdPrev10: changecurrentgame(gs, -10); return TRUE; case CmdPrevLevel: changecurrentgame(gs, -1); return TRUE; case CmdPrev: changecurrentgame(gs, -1); return TRUE; case CmdSameLevel: return TRUE; case CmdSame: return TRUE; case CmdNextLevel: changecurrentgame(gs, +1); return TRUE; case CmdNext: changecurrentgame(gs, +1); return TRUE; case CmdNext10: changecurrentgame(gs, +10); return TRUE; case CmdGotoLevel: selectlevelbypassword(gs); return TRUE; case CmdPlayback: return TRUE; case CmdSeeScores: showscores(gs); return TRUE; case CmdSeeSolutionFiles: showsolutionfiles(gs); return TRUE; case CmdKillSolution: return TRUE; case CmdHelp: dohelp(Help_KeysBetweenGames); return TRUE; case CmdQuitLevel: return FALSE; case CmdQuit: exit(0); case CmdCheckSolution: case CmdProceed: if (gs->status > 0) { if (islastinseries(gs, gs->currentgame)) gs->enddisplay = TRUE; else changecurrentgame(gs, +1); } return TRUE; case CmdReplSolution: if (issolved(gs, gs->currentgame)) replaceablesolution(gs, -1); else bell(); return TRUE; } } } /* Get a key command from the user at the completion of the current * series. */ static int finalinput(gamespec *gs) { int cmd; for (;;) { cmd = input(TRUE); switch (cmd) { case CmdSameLevel: case CmdSame: return TRUE; case CmdPrevLevel: case CmdPrev: case CmdNextLevel: case CmdNext: setcurrentgame(gs, 0); return TRUE; case CmdQuit: exit(0); default: return FALSE; } } } /* Play the current level, using firstcmd as the initial key command, * and returning when the level's play ends. The return value is FALSE * if play ended because the user restarted or changed the current * level (indicating that the program should not prompt the user * before continuing). If the return value is TRUE, the gamespec * structure's status field will contain the return value of the last * call to doturn() -- i.e., positive if the level was completed * successfully, negative if the level ended unsuccessfully. Likewise, * the gamespec structure will be updated if the user ended play by * changing the current level. */ static int playgame(gamespec *gs, int firstcmd) { int render, lastrendered; int cmd, n; cmd = firstcmd; if (cmd == CmdProceed) cmd = CmdNone; gs->status = 0; setgameplaymode(BeginPlay); render = lastrendered = TRUE; for (;;) { n = doturn(cmd); drawscreen(render); lastrendered = render; if (n) break; render = waitfortick() || noframeskip; cmd = input(FALSE); if (cmd == CmdQuitLevel) { quitgamestate(); n = -1; break; } if (!(cmd >= CmdMoveFirst && cmd <= CmdMoveLast)) { switch (cmd) { case CmdPreserve: break; case CmdPrevLevel: n = -1; goto quitloop; case CmdNextLevel: n = +1; goto quitloop; case CmdSameLevel: n = 0; goto quitloop; case CmdDebugCmd1: break; case CmdDebugCmd2: break; case CmdQuit: exit(0); case CmdVolumeUp: changevolume(+2, TRUE); cmd = CmdNone; break; case CmdVolumeDown: changevolume(-2, TRUE); cmd = CmdNone; break; case CmdPauseGame: setgameplaymode(SuspendPlayShuttered); drawscreen(TRUE); setdisplaymsg("(paused)", 1, 1); for (;;) { switch (input(TRUE)) { case CmdQuit: exit(0); case CmdPauseGame: break; default: continue; } break; } setgameplaymode(ResumePlay); cmd = CmdNone; break; case CmdHelp: setgameplaymode(SuspendPlay); dohelp(Help_KeysDuringGame); setgameplaymode(ResumePlay); cmd = CmdNone; break; case CmdCheatNorth: case CmdCheatWest: break; case CmdCheatSouth: case CmdCheatEast: break; case CmdCheatHome: break; case CmdCheatKeyRed: case CmdCheatKeyBlue: break; case CmdCheatKeyYellow: case CmdCheatKeyGreen: break; case CmdCheatBootsIce: case CmdCheatBootsSlide: break; case CmdCheatBootsFire: case CmdCheatBootsWater: break; case CmdCheatICChip: break; default: cmd = CmdNone; break; } } } if (!lastrendered) drawscreen(TRUE); setgameplaymode(EndPlay); if (n > 0) if (replacesolution()) savesolutions(&gs->series); gs->status = n; return TRUE; quitloop: if (!lastrendered) drawscreen(TRUE); quitgamestate(); setgameplaymode(EndPlay); if (n) changecurrentgame(gs, n); return FALSE; } /* Play back the user's best solution for the current level in real * time. Other than the fact that this function runs from a * prerecorded series of moves, it has the same behavior as * playgame(). */ static int playbackgame(gamespec *gs) { int render, lastrendered, n; drawscreen(TRUE); gs->status = 0; setgameplaymode(BeginPlay); render = lastrendered = TRUE; for (;;) { n = doturn(CmdNone); drawscreen(render); lastrendered = render; if (n) break; render = waitfortick() || noframeskip; switch (input(FALSE)) { case CmdPrevLevel: changecurrentgame(gs, -1); goto quitloop; case CmdNextLevel: changecurrentgame(gs, +1); goto quitloop; case CmdSameLevel: goto quitloop; case CmdPlayback: goto quitloop; case CmdQuitLevel: goto quitloop; case CmdQuit: exit(0); case CmdVolumeUp: changevolume(+2, TRUE); break; case CmdVolumeDown: changevolume(-2, TRUE); break; case CmdPauseGame: setgameplaymode(SuspendPlay); setdisplaymsg("(paused)", 1, 1); for (;;) { switch (input(TRUE)) { case CmdQuit: exit(0); case CmdPauseGame: break; default: continue; } break; } setgameplaymode(ResumePlay); break; case CmdHelp: setgameplaymode(SuspendPlay); dohelp(Help_None); setgameplaymode(ResumePlay); break; } } if (!lastrendered) drawscreen(TRUE); setgameplaymode(EndPlay); gs->playmode = Play_None; if (n < 0) replaceablesolution(gs, +1); if (n > 0) { if (checksolution()) savesolutions(&gs->series); if (islastinseries(gs, gs->currentgame)) n = 0; } gs->status = n; return TRUE; quitloop: if (!lastrendered) drawscreen(TRUE); quitgamestate(); setgameplaymode(EndPlay); gs->playmode = Play_None; return FALSE; } /* Quickly play back the user's best solution for the current level * without rendering and without using the timer the keyboard. The * playback stops when the solution is finished or gameplay has * ended. */ static int verifyplayback(gamespec *gs) { int n; gs->status = 0; setdisplaymsg("Verifying ...", 1, 0); setgameplaymode(BeginVerify); for (;;) { n = doturn(CmdNone); if (n) break; advancetick(); switch (input(FALSE)) { case CmdPrevLevel: changecurrentgame(gs, -1); goto quitloop; case CmdNextLevel: changecurrentgame(gs, +1); goto quitloop; case CmdSameLevel: goto quitloop; case CmdPlayback: goto quitloop; case CmdQuitLevel: goto quitloop; case CmdQuit: exit(0); } } gs->playmode = Play_None; quitgamestate(); drawscreen(TRUE); setgameplaymode(EndVerify); if (n < 0) { setdisplaymsg("Invalid solution!", 1, 1); replaceablesolution(gs, +1); } if (n > 0) { if (checksolution()) savesolutions(&gs->series); setdisplaymsg(NULL, 0, 0); if (islastinseries(gs, gs->currentgame)) n = 0; } gs->status = n; return TRUE; quitloop: setdisplaymsg(NULL, 0, 0); gs->playmode = Play_None; setgameplaymode(EndVerify); return FALSE; } /* Manage a single session of playing the current level, from start to * finish. A return value of FALSE indicates that the user is done * playing levels from the current series; otherwise, the gamespec * structure is updated as necessary upon return. */ static int runcurrentlevel(gamespec *gs) { int ret = TRUE; int cmd; int valid, f; if (gs->enddisplay) { gs->enddisplay = FALSE; changesubtitle(NULL); setenddisplay(); drawscreen(TRUE); displayendmessage(0, 0, 0, 0); endgamestate(); return finalinput(gs); } valid = initgamestate(gs->series.games + gs->currentgame, gs->series.ruleset); changesubtitle(gs->series.games[gs->currentgame].name); passwordseen(gs, gs->currentgame); if (!islastinseries(gs, gs->currentgame)) if (!valid || gs->series.games[gs->currentgame].unsolvable) passwordseen(gs, gs->currentgame + 1); cmd = startinput(gs); if (cmd == CmdQuitLevel) { ret = FALSE; } else { if (cmd != CmdNone) { if (valid) { switch (gs->playmode) { case Play_Normal: f = playgame(gs, cmd); break; case Play_Back: f = playbackgame(gs); break; case Play_Verify: f = verifyplayback(gs); break; default: f = FALSE; break; } if (f) ret = endinput(gs); } else bell(); } } endgamestate(); return ret; } static int batchverify(gameseries *series, int display) { gamesetup *game; int valid = 0, invalid = 0; int i, f; batchmode = TRUE; for (i = 0, game = series->games ; i < series->count ; ++i, ++game) { if (!hassolution(game)) continue; if (initgamestate(game, series->ruleset) && prepareplayback()) { setgameplaymode(BeginVerify); while (!(f = doturn(CmdNone))) advancetick(); setgameplaymode(EndVerify); if (f > 0) { ++valid; checksolution(); } else { ++invalid; game->sgflags |= SGF_REPLACEABLE; if (display) printf("Solution for level %d is invalid\n", game->number); } } endgamestate(); } if (display) { if (valid + invalid == 0) { printf("No solutions were found.\n"); } else { printf(" Valid solutions:%4d\n", valid); printf("Invalid solutions:%4d\n", invalid); } } return invalid; } /* * Game selection functions */ /* Display the full selection of available series to the user as a * scrolling list, and permit one to be selected. When one is chosen, * pick one of levels to be the current level. All fields of the * gamespec structure are initiailzed. If autosel is TRUE, then the * function will skip the display if there is only one series * available. If defaultseries is not NULL, and matches the name of * one of the series in the array, then the scrolling list will be * initialized with that series selected. If defaultlevel is not zero, * and a level in the selected series that the user is permitted to * access matches it, then that level will be thhe initial current * level. The return value is zero if nothing was selected, negative * if an error occurred, or positive otherwise. */ static int selectseriesandlevel(gamespec *gs, seriesdata *series, int autosel, char const *defaultseries, int defaultlevel) { int okay, f, n; if (series->count < 1) { errmsg(NULL, "no level sets found"); return -1; } okay = TRUE; if (series->count == 1 && autosel) { getseriesfromlist(&gs->series, series->list, 0); } else { n = 0; if (defaultseries) { n = series->count; while (n) if (!strcmp(series->list[--n].filebase, defaultseries)) break; } for (;;) { f = displaylist(" Welcome to Tile World. Type ? or F1 for help.", &series->table, &n, scrollinputcallback); if (f == CmdProceed) { getseriesfromlist(&gs->series, series->list, n); okay = TRUE; break; } else if (f == CmdQuitLevel) { okay = FALSE; break; } else if (f == CmdHelp) { pushsubtitle("Help"); dohelp(Help_First); popsubtitle(); } } } freeserieslist(series->list, series->count, &series->table); if (!okay) return 0; if (!readseriesfile(&gs->series)) { errmsg(gs->series.filebase, "cannot read data file"); freeseriesdata(&gs->series); return -1; } if (gs->series.count < 1) { errmsg(gs->series.filebase, "no levels found in data file"); freeseriesdata(&gs->series); return -1; } gs->enddisplay = FALSE; gs->playmode = Play_None; gs->usepasswds = usepasswds && !(gs->series.gsflags & GSF_IGNOREPASSWDS); gs->currentgame = -1; gs->melindacount = 0; if (defaultlevel) { n = findlevelinseries(&gs->series, defaultlevel, NULL); if (n >= 0) { gs->currentgame = n; if (gs->usepasswds && !(gs->series.games[n].sgflags & SGF_HASPASSWD)) changecurrentgame(gs, -1); } } if (gs->currentgame < 0) { gs->currentgame = 0; for (n = 0 ; n < gs->series.count ; ++n) { if (!issolved(gs, n)) { gs->currentgame = n; break; } } } return +1; } /* Get the list of available series and permit the user to select one * to play. If lastseries is not NULL, use that series as the default. * The return value is zero if nothing was selected, negative if an * error occurred, or positive otherwise. */ static int choosegame(gamespec *gs, char const *lastseries) { seriesdata s; if (!createserieslist(NULL, &s.list, &s.count, &s.table)) return -1; return selectseriesandlevel(gs, &s, FALSE, lastseries, 0); } /* * Initialization functions. */ /* Set the four directories that the program uses (the series * directory, the series data directory, the resource directory, and * the save directory). Any or all of the arguments can be NULL, * indicating that the default value should be used. The environment * variables TWORLDDIR, TWORLDSAVEDIR, and HOME can define the default * values. If any or all of these are unset, the program will use the * default values it was compiled with. */ static void initdirs(char const *series, char const *seriesdat, char const *res, char const *save) { unsigned int maxpath; char const *root = NULL; char const *dir; maxpath = getpathbufferlen(); if (series && strlen(series) >= maxpath) { errmsg(NULL, "Data (-D) directory name is too long;" " using default value instead"); series = NULL; } if (seriesdat && strlen(seriesdat) >= maxpath) { errmsg(NULL, "Configured data (-C) directory name is too long;" " using default value instead"); seriesdat = NULL; } if (res && strlen(res) >= maxpath) { errmsg(NULL, "Resource (-R) directory name is too long;" " using default value instead"); res = NULL; } if (save && strlen(save) >= maxpath) { errmsg(NULL, "Save (-S) directory name is too long;" " using default value instead"); save = NULL; } if (!save && (dir = getenv("TWORLDSAVEDIR")) && *dir) { if (strlen(dir) < maxpath) save = dir; else warn("Value of environment variable TWORLDSAVEDIR is too long"); } if (!res || !series || !seriesdat) { if ((dir = getenv("TWORLDDIR")) && *dir) { if (strlen(dir) < maxpath - 8) root = dir; else warn("Value of environment variable TWORLDDIR is too long"); } if (!root) { #ifdef ROOTDIR root = ROOTDIR; #else root = "."; #endif } } resdir = getpathbuffer(); if (res) strcpy(resdir, res); else combinepath(resdir, root, "res"); seriesdir = getpathbuffer(); if (series) strcpy(seriesdir, series); else combinepath(seriesdir, root, "sets"); seriesdatdir = getpathbuffer(); if (seriesdat) strcpy(seriesdatdir, seriesdat); else combinepath(seriesdatdir, root, "data"); savedir = getpathbuffer(); if (!save) { #ifdef SAVEDIR save = SAVEDIR; #else if ((dir = getenv("HOME")) && *dir && strlen(dir) < maxpath - 8) combinepath(savedir, dir, ".tworld"); else combinepath(savedir, root, "save"); #endif } else { strcpy(savedir, save); } } /* Parse the command-line options and arguments, and initialize the * user-controlled options. */ static int initoptionswithcmdline(int argc, char *argv[], startupdata *start) { cmdlineinfo opts; char const *optresdir = NULL; char const *optseriesdir = NULL; char const *optseriesdatdir = NULL; char const *optsavedir = NULL; char buf[256]; int listdirs, pedantic; int ch, n; char *p; start->filename = getpathbuffer(); *start->filename = '\0'; start->savefilename = NULL; start->levelnum = 0; start->listseries = FALSE; start->listscores = FALSE; start->listtimes = FALSE; start->batchverify = FALSE; listdirs = FALSE; pedantic = FALSE; mudsucking = 1; soundbufsize = 0; volumelevel = -1; initoptions(&opts, argc - 1, argv + 1, "abD:dFfHhL:lm:n:PpqR:rS:stVv"); while ((ch = readoption(&opts)) >= 0) { switch (ch) { case 0: if (start->savefilename && start->levelnum) { fprintf(stderr, "too many arguments: %s\n", opts.val); printtable(stderr, yowzitch); return FALSE; } if (!start->levelnum && (n = (int)strtol(opts.val, &p, 10)) > 0 && *p == '\0') { start->levelnum = n; } else if (*start->filename) { start->savefilename = getpathbuffer(); sprintf(start->savefilename, "%.*s", getpathbufferlen(), opts.val); } else { sprintf(start->filename, "%.*s", getpathbufferlen(), opts.val); } break; case 'D': optseriesdatdir = opts.val; break; case 'L': optseriesdir = opts.val; break; case 'R': optresdir = opts.val; break; case 'S': optsavedir = opts.val; break; case 'H': showhistogram = !showhistogram; break; case 'f': noframeskip = !noframeskip; break; case 'F': fullscreen = !fullscreen; break; case 'p': usepasswds = !usepasswds; break; case 'q': silence = !silence; break; case 'r': readonly = !readonly; break; case 'P': pedantic = !pedantic; break; case 'a': ++soundbufsize; break; case 'd': listdirs = TRUE; break; case 'l': start->listseries = TRUE; break; case 's': start->listscores = TRUE; break; case 't': start->listtimes = TRUE; break; case 'b': start->batchverify = TRUE; break; case 'm': mudsucking = atoi(opts.val); break; case 'n': volumelevel = atoi(opts.val); break; case 'h': printtable(stdout, yowzitch); exit(EXIT_SUCCESS); case 'v': puts(VERSION); exit(EXIT_SUCCESS); case 'V': printtable(stdout, vourzhon); exit(EXIT_SUCCESS); case ':': fprintf(stderr, "option requires an argument: -%c\n", opts.opt); printtable(stderr, yowzitch); return FALSE; case '?': fprintf(stderr, "unrecognized option: -%c\n", opts.opt); printtable(stderr, yowzitch); return FALSE; default: printtable(stderr, yowzitch); return FALSE; } } if (pedantic) setpedanticmode(); initdirs(optseriesdir, optseriesdatdir, optresdir, optsavedir); if (listdirs) { printdirectories(); exit(EXIT_SUCCESS); } if (*start->filename && !start->savefilename) { if (loadsolutionsetname(start->filename, buf) > 0) { start->savefilename = getpathbuffer(); strcpy(start->savefilename, start->filename); strcpy(start->filename, buf); } } if (start->listscores || start->listtimes || start->batchverify || start->levelnum) if (!*start->filename) strcpy(start->filename, "chips.dat"); return TRUE; } /* Run the initialization routines of oshw and the resource module. */ static int initializesystem(void) { #ifdef NDEBUG mudsucking = 1; #endif setmudsuckingfactor(mudsucking); if (!oshwinitialize(silence, soundbufsize, showhistogram, fullscreen)) return FALSE; if (!initresources()) return FALSE; setkeyboardrepeat(TRUE); if (volumelevel >= 0) setvolume(volumelevel, FALSE); return TRUE; } /* Time for everyone to clean up and go home. */ static void shutdownsystem(void) { shutdowngamestate(); freeallresources(); free(resdir); free(seriesdir); free(seriesdatdir); free(savedir); } /* Determine what to play. A list of available series is drawn up; if * only one is found, it is selected automatically. Otherwise, if the * listseries option is TRUE, the available series are displayed on * stdout and the program exits. Otherwise, if listscores or listtimes * is TRUE, the scores or times for a single series is display on * stdout and the program exits. (These options need to be checked for * before initializing the graphics subsystem.) Otherwise, the * selectseriesandlevel() function handles the rest of the work. Note * that this function is only called during the initial startup; if * the user returns to the series list later on, the choosegame() * function is called instead. */ static int choosegameatstartup(gamespec *gs, startupdata const *start) { seriesdata series; tablespec table; int n; if (!createserieslist(start->filename, &series.list, &series.count, &series.table)) return -1; free(start->filename); if (series.count <= 0) { errmsg(NULL, "no level sets found"); return -1; } if (start->listseries) { printtable(stdout, &series.table); if (!series.count) puts("(no files)"); return 0; } if (series.count == 1) { if (start->savefilename) series.list[0].savefilename = start->savefilename; if (!readseriesfile(series.list)) { errmsg(series.list[0].filebase, "cannot read level set"); return -1; } if (start->batchverify) { n = batchverify(series.list, !silence && !start->listtimes && !start->listscores); if (silence) exit(n > 100 ? 100 : n); else if (!start->listtimes && !start->listscores) return 0; } if (start->listscores) { if (!createscorelist(series.list, usepasswds, '0', NULL, NULL, &table)) return -1; freeserieslist(series.list, series.count, &series.table); printtable(stdout, &table); freescorelist(NULL, &table); return 0; } if (start->listtimes) { if (!createtimelist(series.list, series.list->ruleset == Ruleset_MS ? 10 : 100, '0', NULL, NULL, &table)) return -1; freeserieslist(series.list, series.count, &series.table); printtable(stdout, &table); freetimelist(NULL, &table); return 0; } } if (!initializesystem()) { errmsg(NULL, "cannot initialize program due to previous errors"); return -1; } return selectseriesandlevel(gs, &series, TRUE, NULL, start->levelnum); } /* * The main function. */ int tworld(int argc, char *argv[]) { startupdata start; gamespec spec; char lastseries[sizeof spec.series.filebase]; int f; if (!initoptionswithcmdline(argc, argv, &start)) return EXIT_FAILURE; f = choosegameatstartup(&spec, &start); if (f < 0) return EXIT_FAILURE; else if (f == 0) return EXIT_SUCCESS; do { pushsubtitle(NULL); while (runcurrentlevel(&spec)) ; popsubtitle(); cleardisplay(); strcpy(lastseries, spec.series.filebase); freeseriesdata(&spec.series); f = choosegame(&spec, lastseries); } while (f > 0); shutdownsystem(); return f == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } tworld-1.3.0/unslist.c0000644000175000017500000001647410417353766015061 0ustar breadboxbreadbox/* unslist.c: Functions to manage the list of unsolvable levels. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include "defs.h" #include "err.h" #include "fileio.h" #include "res.h" #include "solution.h" #include "unslist.h" /* The information comprising one entry in the list of unsolvable * levels. */ typedef struct unslistentry { int setid; /* the ID of the level set's name */ int levelnum; /* the level's number */ int size; /* the levels data's compressed size */ unsigned long hashval; /* the levels data's hash value */ int note; /* the entry's annotation ID, if any */ } unslistentry; /* The pool of strings. In here are stored the level set names and the * annotations. The string IDs are simple offsets from the strings * pointer. */ static int stringsused = 0; static int stringsallocated = 0; static char *strings = NULL; /* The list of level set names for which unsolvable levels appear on * the list. This list allows the program to quickly find the level * set name's string ID. */ static int namescount = 0; static int namesallocated = 0; static int *names = NULL; /* The list of unsolvable levels proper. */ static int listcount = 0; static int listallocated = 0; static unslistentry *unslist = NULL; /* * Managing the pool of strings. */ /* Turn a string ID back into a string pointer. (Note that a string ID * of zero will always return a null string, assuming that * storestring() has been called at least once.) */ #define getstring(id) (strings + (id)) /* Make a copy of a string and add it to the string pool. The new * string's ID is returned. */ static int storestring(char const *str) { int len; len = strlen(str) + 1; if (stringsused + len > stringsallocated) { stringsallocated = stringsallocated ? 2 * stringsallocated : 256; xalloc(strings, stringsallocated); if (!stringsused) { *strings = '\0'; ++stringsused; } } memcpy(strings + stringsused, str, len); stringsused += len; return stringsused - len; } /* * Managing the list of set names. */ /* Return the string ID of the given set name. If the set name is not * already in the list, then if add is TRUE the set name is added to * the list; otherwise zero is returned. */ static int lookupsetname(char const *name, int add) { int i; for (i = 0 ; i < namescount ; ++i) if (!strcmp(getstring(names[i]), name)) return names[i]; if (!add) return 0; if (namescount >= namesallocated) { namesallocated = namesallocated ? 2 * namesallocated : 8; xalloc(names, namesallocated * sizeof *names); } names[namescount] = storestring(name); return names[namescount++]; } /* * Managing the list of unsolvable levels. */ /* Add a new entry with the given data to the list. */ static int addtounslist(int setid, int levelnum, int size, unsigned long hashval, int note) { if (listcount == listallocated) { listallocated = listallocated ? listallocated * 2 : 16; xalloc(unslist, listallocated * sizeof *unslist); } unslist[listcount].setid = setid; unslist[listcount].levelnum = levelnum; unslist[listcount].size = size; unslist[listcount].hashval = hashval; unslist[listcount].note = note; ++listcount; return TRUE; } /* Remove all entries for the given level from the list. FALSE is * returned if the level was not on the list to begin with. */ static int removefromunslist(int setid, int levelnum) { int i, f = FALSE; for (i = 0 ; i < listcount ; ++i) { if (unslist[i].setid == setid && unslist[i].levelnum == levelnum) { --listcount; unslist[i] = unslist[listcount]; f = TRUE; } } return f; } /* Add the information in the given file to the list of unsolvable * levels. Errors in the file are flagged but do not prevent the * function from reading the rest of the file. */ static int readunslist(fileinfo *file) { char buf[256], token[256]; char const *p; unsigned long hashval; int setid, size; int lineno, levelnum, n; setid = 0; for (lineno = 1 ; ; ++lineno) { n = sizeof buf - 1; if (!filegetline(file, buf, &n, NULL)) break; for (p = buf ; isspace(*p) ; ++p) ; if (!*p || *p == '#') continue; if (sscanf(p, "[%[^]]]", token) == 1) { setid = lookupsetname(token, TRUE); continue; } n = sscanf(p, "%d: %04X%08lX: %[^\n\r]", &levelnum, &size, &hashval, token); if (n > 0 && levelnum > 0 && levelnum < 65536 && setid) { if (n == 1) { n = sscanf(p, "%*d: %s", token); if (n > 0 && !strcmp(token, "ok")) { removefromunslist(setid, levelnum); continue; } } else if (n >= 3) { addtounslist(setid, levelnum, size, hashval, n == 4 ? storestring(token) : 0); continue; } } warn("%s:%d: syntax error", file->name, lineno); } return TRUE; } /* * Exported functions. */ /* Return TRUE if the given level in the list of unsolvable levels. No * set name is supplied, so this function relies on the other three * data. A copy of the level's annotation is made if note is not NULL. */ int islevelunsolvable(gamesetup const *game, char *note) { int i; for (i = 0 ; i < listcount ; ++i) { if (unslist[i].levelnum == game->number && unslist[i].size == game->levelsize && unslist[i].hashval == game->levelhash) { if (note) strcpy(note, getstring(unslist[i].note)); return TRUE; } } return FALSE; } /* Look up the levels that constitute the given series and find which * levels appear in the list. Those that do will have the unsolvable * field in the gamesetup structure initialized. */ int markunsolvablelevels(gameseries *series) { int count = 0; int setid, i, j; for (j = 0 ; j < series->count ; ++j) series->games[j].unsolvable = NULL; setid = lookupsetname(series->name, FALSE); if (!setid) return 0; for (i = 0 ; i < listcount ; ++i) { if (unslist[i].setid != setid) continue; for (j = 0 ; j < series->count ; ++j) { if (series->games[j].number == unslist[i].levelnum && series->games[j].levelsize == unslist[i].size && series->games[j].levelhash == unslist[i].hashval) { series->games[j].unsolvable = getstring(unslist[i].note); ++count; break; } } } return count; } /* Read the list of unsolvable levels from the given filename. If the * filename does not contain a path, then the function looks for the * file in the resource directory and the user's save directory. */ int loadunslistfromfile(char const *filename) { fileinfo file; memset(&file, 0, sizeof file); if (openfileindir(&file, resdir, filename, "r", NULL)) { readunslist(&file); fileclose(&file, NULL); } if (!haspathname(filename)) { memset(&file, 0, sizeof file); if (openfileindir(&file, savedir, filename, "r", NULL)) { readunslist(&file); fileclose(&file, NULL); } } return TRUE; } /* Free all memory associated with the list of unsolvable levels. */ void clearunslist(void) { free(unslist); listcount = 0; listallocated = 0; unslist = NULL; free(names); namescount = 0; namesallocated = 0; names = NULL; free(strings); stringsused = 0; stringsallocated = 0; strings = NULL; } tworld-1.3.0/unslist.h0000644000175000017500000000260210417060753015041 0ustar breadboxbreadbox/* unslist.h: Functions to manage the list of unsolvable levels. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _unslist_h_ #define _unslist_h_ #include "defs.h" /* Read the list of unsolvable levels from the given filename. If the * filename does not contain a path, then the function looks for the * file in the resource directory and the user's save directory. */ extern int loadunslistfromfile(char const *filename); /* Look up the given level in the list of unsolvable levels. TRUE is * returned if the level is found in the list, FALSE otherwise. (Since * the setname is not supplied, this function is potentially less * reliable.) If the level is in the list and note is not NULL, then * the buffer it points to will receive a copy of the level's * annotation. */ extern int islevelunsolvable(gamesetup const *game, char *note); /* Look up all the levels in the given series, and mark the ones that * appear in the list of unsolvable levels by initializing the * unsolvable field. Levels that do not appear in the list will have * their unsolvable fields explicitly set to NULL. The number of * unsolvable levels is returned. */ extern int markunsolvablelevels(gameseries *series); /* Free all memory associated with the list of unsolvable levels. */ extern void clearunslist(void); #endif tworld-1.3.0/ver.h0000644000175000017500000000003110417672135014131 0ustar breadboxbreadbox#define VERSION "1.3.0" tworld-1.3.0/data/0000755000175000017500000000000010420664541014077 5ustar breadboxbreadboxtworld-1.3.0/data/intro.dat0000644000175000017500000000652707465634607015755 0ustar breadboxbreadbox Uh  /       gden   f           "     djKEYS AND CHIPSPCollect keys in order to open doors. Collect chips in order to open the socket.h   /  n     " *WATCH YOUR STEPzIce makes Chip slide. Force floors push Chip around. Water and fire are fatal to Chip. Bombs destroy anything they touch. df H  @n "/ P^FRIENDS AND ENEMIES7Avoid creatures. Blocks pushed into water create dirt. hj   /  n   i  hk  FOOTGEARxUse fire boots to cross fire, water boots to cross water, skates to cross ice, and suction boots to cross force floors.:dg"  "/n,,"  "6q ALL WALLS\Walls can be invisible. Blue walls are not always real. Objects can be hidden under blocks.cc "!"n/)) i))h! TELEPORTS AND THIEVESgTeleports can work differently, depending on direction. The thief tile steals Chip's special footgear.jfn ---g--/-P-- -.."**..- --D------XDIRT AND GRAVELjCreatures are forbidden from entering dirt and gravel. Look out for new walls popping up from underneath.  cn/ #&#%#&#%  $&$%$&$%K  E    ((N((N   NN '+  '+ I1jBUTTON, BUTTONzBlue buttons turn tanks. Green buttons toggle walls. A red button activates a clone machine. A brown button opens a trap.            0c/nTHE END}Congratulations! You have reached the end of the introductory course. You are now ready to go out and find some real levels!tworld-1.3.0/docs/0000755000175000017500000000000010420664541014116 5ustar breadboxbreadboxtworld-1.3.0/docs/tworld.60000644000175000017500000007047610420664541015536 0ustar breadboxbreadbox.TH tworld 6 "Mar 2006" "Tile World" .LO 1 .SH NAME tworld \- Tile World .P .br .SH SYNOPSIS Tile World is a reimplementation of the game "Chip's Challenge". The player controls Chip, navigating him through his challenges. The object of each level of the game is to find and reach the exit tile, which takes you to the next level. The levels contain many different kinds of obstacles, creatures both hostile and indifferent, tools, protective gear -- and, of course, chips. .br .SH OVERVIEW OF THE GAME The main display shows Chip in the current level and his immediate surroundings. To the right of this display is shown the basic information about the current level. The most important data shown here are how many seconds are left on the clock, and how many chips still need to be collected. (On some level the clock does not show a time. These levels have no time limit.) .P The object of every level is to find and reach the exit before the time runs out. The exit is frequently (but not always) guarded by a chip socket. To move past the chip socket, Chip must collect a certain number of computer chips; the amount needed is different in each level. As you play a level, the information display on the right shows the number of chips that still need to be collected in order to open the socket. (Remember that getting enough chips to open the chip socket is only a subgoal, not the main goal. Some levels do not require any chips to be collected; some levels have no chip socket at all.) .P Also occupying many of the levels are other creatures. Most (but not all) of them move about in simple, predictable patterns, and without regard for Chip's presence. The creatures know enough to avoid running into each other, but a collision with Chip is fatal. The complete taxonomy of creatures is: tanks, balls, gliders, fireballs, walkers, blobs, teeth, bugs, and paramecia. .P In addition to the socket and the main exit, there are also four different kinds of doors. These doors can be opened with the right kind of key. The doors and the keys are color-coded -- red, green, blue, and yellow -- so you can tell them apart. Like the chip socket, a door that has been opened stays open. Keys are picked up simply by stepping upon them. The key disappears from the map and appears in your possession. Keys in your possession are displayed on the right-hand side of the window. .P Besides keys and chip, there are also four kinds of special footgear that Chip can collect. Like keys, boots can be picked up simply by walking over them. (There is no limit to the number of boots you can have.) These boots permit Chip to walk across four different kinds of surfaces, just as if they were normal flooring. Fire and water are two kind of tiles that are normally fatal to Chip, but fire boots and water boots will permit safe passage across these. Stepping onto ice sends Chip sliding at high speed unless he has a pair of ice boots. Finally, there are force floors that push Chip along in a specific direction; these can be counteracted with force boots. .P Two other types of surfaces are more useful to Chip, in that they keep other creatures out. These are dirt and gravel, and they are special in that Chip is the only one who can walk on them. However, when Chip steps onto a dirt tile, it is cleared away and becomes normal flooring. Gravel, on the other hand, is permanent. .P There are numerous other objects scattered around the various levels, which Chip can interact with, although he cannot pick them up. Bombs are one kind of object which should always be avoided, as they explode when stepped on. The thief tile should also generally be avoided; entering this tile will cause Chip to lose any footgear he has collected. .P Dirt blocks are large, movable squares of dirt. Chip can push them about, and use them to wall off areas or to safely detontate bombs. Furthermore, if a block is pushed into water, the tile will turn into dirt (which will become normal flooring when Chip steps on it). Finally, note that blocks can sometimes be resting on top of other objects, both helpful (such as a key) and harmful (such as a bomb). .P Some levels have teleports. Entering a teleport causes Chip to vanish and instantaneously reappear at another teleport. .P Even some of the walls can demonstrate surprising behavior. The so-called blue walls can either be actual walls, or empty mirages. The only way for Chip to tell which is which is to attempt to walk through one. There are also popup walls -- Chip can walk across these only once, for they turn into walls as he walks over them. .P There are four different types of pushbuttons. Like keys and boots, they are color-coded. Stepping on a pushbutton activates it. .P The green buttons control the toggle walls. Toggle walls have dotted green outlines, and they change between being open (passable, like any other floor) and open (unpassable, a wall). When a green button is pressed, the closed toggle walls are opened and the open toggle walls are closed. .P Brown buttons control bear traps. Anything that wanders into a bear trap will be stuck there until the brown button connected to it is pushed. .P Blue buttons exercise some control over the tanks. Normally, a tank moves directly forward until it hits an obstacle, whereupon it stops. But when a blue button is pressed, all tanks turn around 180 degrees and begin moving again. .P The objects with the most potential for help and hindrance are the clone machines, which are controlled by red buttons. Every clone machine contains a dirt block, a tank, or some other creature. When the clone machine's red button is pressed, a duplicate of whatever the clone machine contains is created and set loose. .P Once in a while there will also be hint buttons. These have a question mark displayed on them. When Chip steps onto a hint button, a short bit of information will be displayed in the lower right-hand area of the window. .P Here are some general hints for successful play: .P .TP 2 .PD 0 * When moving dirt blocks around, take care not to shove them into corners where you can't get them out again. .TP * On some of the more mazelike levels, you may need to sketch out a map in order to solve it. .TP * Many of the creatures move in specific patterns (for example, as with the tanks mentioned above). .TP * A number of the objects in the game will affect other creatures in the same way they affect Chip. .TP * Remember that if you get trapped somewhere, you can always use Ctrl-R to restart a level. .TP * When you find a level to be unusually difficult, take some time to examine it carefully. Make sure you truly know what options are available to you. In any case, keep trying. Occasionally the game will give you the opportunity to skip a level that seems too hard. .PD 1 .br .SH PASSWORDS Every level has a four-letter password. The password for a level is shown in the information display at the upper-right of the window. The obstensible purpose of passwords is to allow you to come back to a level. Howver, normally you will never need to remember passwords, as Tile World will automatically store the passwords for you. However, if you somehow manage to learn the password of a level that you have yet to achieve, you can use the password to gain early access to that level. .br .SH SCORING For each level in a set that you complete, the game awards 500 points times the level's number. Furthermore, if the level is timed, an extra 10 points is added for every second left on the clock when you finish the level. You can thus sometimes improve your score by returning to already-completed levels and playing them again. .br .SH KEY COMMANDS During game play, the arrows are the most important keys; they move Chip through the level. The keys 2 4 6 8 on the numeric keypad can also be used for the same purpose. Other keys have the following functions: .P .TP .B Bkspc pauses the game; press any key to resume play. .TP .B Ctrl-H same as Bkspc. .TP .B Ctrl-N stops the current game and moves forward to the next level. .TP .B Ctrl-P stops the current game and moves back to the previous level. .TP .B Q quits the current level. .TP .B Ctrl-R starts over at the beginning of the current level. .TP .B ? pauses the game and displays a list of topics for which help is available within the program. .TP .B V decreases the volume level. (If the volume level is reduced to zero, then the program will display sound effects textually, as onomatopoeia.) .TP .B Shift-V increases the volume level. .P At the start of a level, before game play begins, the following key commands are available: .P .TP .B Q returns to the list of available level sets. .TP .B Spc starts the current level without moving (i.e., standing still). .TP .B N moves to the next level. .TP .B P moves to the previous level. .TP .B PgUp moves ahead ten levels. .TP .B PgDn moves back ten levels. .TP .B G displays a prompt and accepts a password, then jumps to the level with that password. .TP .B Tab plays back the best solution for that level. .TP .B Shift-Tab verifies the best solution for that level. If the solution is no longer valid (e.g. because the level has been altered), the solution will automatically be deprecated. .TP .B Ctrl-I same as Tab. .TP .B Shift-Ctrl-I same as Shift-Tab. .TP .B O toggles between even-step and odd-step offset. .TP .B Shift-O (Lynx-mode only) increments the stepping offset by one. .TP .B Ctrl-X deprecates the best solution for that level. If the level is then succesfully completed again, the saved solution will be replaced with the new one, whether or not it had a better time. .TP .B Shift-Ctrl-X deletes the saved solution for that level. If confirmed, the solution will be immediately removed from the solution file. .TP .B S displays the list of known levels and the score for each, as well as the overall score for the level set. The score list display also permits changing the current level by moving the selection and pressing Enter. .TP .B Ctrl-S displays the list of solution files in the save directory whose names start with the name of the current level set. From here a different solution file can be selected. .TP .B ? displays a list of topics for which help is available within the program. .P At every point in the program, the Q key will abort the current activity and return to the previous display. .P Finally, the program can be exited at any time by pressing Shift-Q. (Ctrl-C or Alt-F4 will also force an immediate exit.) .br .SH RULESETS Tile World contains emulators for two different versions of "Chip's Challenge". They are referred to as the Lynx ruleset and the MS ruleset. The Lynx ruleset recreates the original implementation of the game, and the MS ruleset recreates the version that was implemented for Microsoft Windows (cf .BR "HISTORY" ). .P The most notable difference between the two rulesets is that in the MS ruleset, movement between tiles is instantaneous, whereas under the Lynx ruleset motion occurs across several "ticks". (This probably reflects the fact that the latter ran on dedicated hardware, while the former ran on 33 MHz PCs under a non-preemptive multitasking OS.) Although the basic mechanics of the game are the same under both rulesets, there are also a host of subtle differences between the two. .P Each level set file includes a flag that indicates which ruleset it is to be played under. Some level sets can be played under both rulesets (most notably, the original set of levels), but this is the exception. .br .SH ADDING NEW LEVEL SETS Level sets are defined by data files. By convention these file are named with a .dat extension. Typically the name proper contains the author's first name, last initial, and a single digit -- for example, EricS1.dat. (The digit is used to give the sequence in case the author, for whatever reason, stores their creations in more than one file.) .P When a new data file is obtained, it may simply be copied into the level set directory (cf .BR "DIRECTORIES" ), and Tile World will then make it available for playing. .P An alternate method is to use a configuration file (see .B CONFIGURATION FILES below). .br .SH COMMAND-LINE OPTIONS tworld is normally invoked without arguments. The program begins by displaying a list of the available level sets. After a level set is chosen, the program jumps to the first unsolved level to begin play. .P The available command-line options are enumerated in the following table. (Windows users: The options that cause the program to display information on standard output actually go to a file named stdout.txt instead.) .P .TP .B -a Double the size of the audio buffer. This option can be repeated, so for example -aaa would increase the audio buffer size eightfold. .TP .B -b Do a batch-mode verification of the existing solutions and exit. Levels with invalid solutions are displayed on standard output. If used with -q, then nothing is displayed, and the program's exit code is the number of invalid solutions. Can also be used with -s or -t to have solutions verified before the other option is applied. Note that this options requires a level set file and/or a solution file be named on the command line. .TP .BI "-D\ " DIR Read level data files from .I DIR instead of the default directory. .TP .B -d Display the default directories used by the program on standard output, and exit. .TP .B -F Run in full-screen mode. .TP .B -H Upon exit, display a histogram of idle time on standard output. (This option is used for evaluating optimization efforts.) .TP .B -h Display a summary of the command-line syntax on standard output and exit. .TP .BI "-L\ " DIR Look for level sets in .I DIR instead of the default directory. .TP .B -l Write a list of available level sets to standard output and exit. .TP .BI "-n\ " N Set the initial volume level to .IR "N" , 0 being silence and 10 being full volume. The default level is 10. .TP .B -P Turn on pedantic mode, forcing the Lynx ruleset to emulate the original game as closely as possible. (See the Tile World website for more information on emulation of the Lynx ruleset.) .TP .B -p Turn off all password-checking. This option allows the normal sequence of levels to be bypassed. .TP .B -q Run quietly. All sounds, including the ringing of the terminal bell, are suppressed. .TP .B -r Run in read-only mode. This guarantees that no changes will be made to the solution files. .TP .BI "-R\ " DIR Read resource data from .I DIR instead of the default directory. .TP .BI "-S\ " DIR Read and write solution files under .I DIR instead of the default directory. .TP .B -s Display the current scores for the selected level set on standard output and exit. A level set must be named on the command line. If used with -b, the solutions are verified beforehand, and invalid solutions are indicated. .TP .B -t Display the best times for the selected level set on standard output and exit. A level set must be named on the command line. If used with -b, the solutions are verified beforehand, and invalid solutions are indicated. .TP .B -V Display the program's version and license information on standard output and exit. .TP .B -v Display the program's version number on standard output and exit. .P Besides the above options, tworld can accept up to three command-line arguments: the name of a level set, the number of a level to start on, and the name of an alternate solution file. If the name of an installed level set is specified, then Tile World will start up in that set, skipping the initial level set selection. .P If the specified level set is not a simple name but is a pathname (relative or absolute), then Tile World will use that level set only, without requiring that it first be installed. No solutions will be saved unless an explicit solution file is also supplied on the command-line. (If the command-line only specifies a solution file, then Tile World will look up the name of the level set in the solution file.) .br .SH CONFIGURATION FILES Configuration files are used to override some of the settings in a data file, or to set values not provided for by the data file format. Configuration files are by convention named with a .dac extension. A configuration file is stored in the level set directory in the place of the data file, which then goes into the data directory (cf .BR "DIRECTORIES" ). .P The configuration file is a simple text file. The first line of a configuration file .I must have the following form: .P file = .I DATAFILE .P where .I DATAFILE is the filename of the data file. (Arbitrary whitespace is permitted around the equal sign, but there cannot be any whitespace embedded at the beginning of the line.) After this initial line, the configuration file can contain any of the following lines: .P usepasswords = .I y|n .P This line permits password-checking to be enabled/disabled when playing the levels in the set. The default is y. .P ruleset = .I ms|lynx .P This line allows the configuration file to override the ruleset setting in the data file. This is mainly useful in the case where one level set is playable under either ruleset (as is the case with the original level set). The author can then provide one data file and two configuration files to make both versions available. .P lastlevel = .I levelnum .P This line marks an arbitrary level as being the last level in the set. The game will stop when this level is completed, instead of proceeding to the next level. (Note that if the data file contains any levels beyond this one, they will only be reachable via a password.) .P fixlynx = .I y|n .P This line is specifically for use with the original level set. It is not generally useful, and is described here only for completeness. The chips.dat file that MS distributed with their version of "Chip's Challenge" contained a few minor differences from the original level set as appeared on the Lynx. A positive value for this entry instructs the program to undo those changes, so that the original Lynx level set is obtained. (The changes made in the MS version were: an extra level was added; four passwords were garbled; and four or five levels' maps had minor alterations.) .br .SH RESOURCES Tile World loads various resources at runtime from its resource directory (cf .BR "DIRECTORIES" ). These resources include the program's font, graphic images, and sound effects. The actual file names are determined by the contents of a file named rc (short for "resource configuration", not "runtime commands") in the same directory. .P The rc file is a plain text file, and contains lines of the form .P .I resource = .I filename .P where .I resource is a symbolic resource name, and .I filename is the name of a file in the resource directory. .P The resources can be set differently depending on the ruleset that the program is using. A line in the rc file of the form .P [ .IR "ruleset" ] .P indicates that the lines that follow only apply when that ruleset is in effect (where .I ruleset is either MS or Lynx). Resources that are defined before any such line apply to both rulesets, and are also used as fallbacks if a ruleset-specific resource could not be loaded. (The font and the text-color resources also need to have ruleset-independent values, as these are needed when displaying the initial file list, before a ruleset has been chosen.) .P A line of the form .P TileImages = .I FILENAME .P identifies the file that provides the images used to draw the game. These images are stored in a Windows bitmap. (See the Tile World website for more information about this resource.) .P A line of the form .P Font = .I FILENAME .P identifies the file that provides the program's font. The font is stored as a Windows bitmap. (See the Tile World website for more information about this resource.) .P A line of the form .P UnsolvableList = .I FILENAME .P identifies the filename for the database of unsolvable levels. See .B DATABASE OF UNSOLVABLE LEVELS below for more information about this file. Note that this resource must be defined independent of the ruleset, or else it will be ignored. .P Four resources define the colors used in rendering text: .P BackgroundColor = .I RRGGBB .br TextColor = .I RRGGBB .br BoldTextColor = .I RRGGBB .br DimTextColor = .I RRGGBB .P The value of .I RRGGBB is a string of six hexadecimal digits defining the red, green, and blue values of the color (as with the color specification used in HTML or X Windows, but without the preceding octothorpe). .P The remaining resources all define the game's sound effects. The sounds are stored as Microsoft RIFF files (so-called wave files). Unlike the tile images, each sound effect is defined as a separate file. The complete list of symbolic resource names is as follows: .P Sounds used in both rulesets .TP 2 .PD 0 * LevelCompleteSound .TP * ChipDeathSound .TP * BlockedMoveSound .TP * PickupToolSound .TP * ThiefSound .TP * TeleportSound .TP * OpenDoorSound .TP * SocketSound .TP * SwitchSound .TP * BombSound .TP * SplashSound .PD 1 .P Sounds used only under the MS ruleset .TP 2 .PD 0 * TickSound .TP * ChipDeathByTimeSound .TP * PickupChipSound .PD 1 .P Sounds used only under the Lynx ruleset .TP 2 .PD 0 * TileEmptiedSound .TP * WallCreatedSound .TP * TrapEnteredSound .TP * BlockMovingSound .TP * SkatingForwardSound .TP * SkatingTurnSound .TP * SlidingSound .TP * SlideWalkingSound .TP * IceWalkingSound .TP * WaterWalkingSound .TP * FireWalkingSound .PD 1 .P (Note that the symbolic names for the shared and MS-only sounds match the names in the entpack.ini file used by the Microsoft program. This makes it easy for someone with a copy of Microsoft's "Chip's Challenge" to use the sound effects that were provided with that version of the game.) .br .SH DATABASE OF UNSOLVABLE LEVELS Of the many thousands of user-created levels that are publicly available, there are some that are not possible to complete. Some of these are intentionally so (e.g. requiring the player to deduce the password to the next level). The remainder, however, are simply due to poor design, and there is typically no indication that attempting to solve these levels is fruitless. .P To help alleviate this, Tile World comes with a database of levels that have been identified by the community to be definitely unsolvable. When the player visits a level that appears in this database, a warning is displayed, and the password to the next level is automatically supplied. .P The main database of unsolvable levels is stored in the resource directory. In addition, a player can keep a separate database in a file of the same name in the directory for solution files. If present, Tile World will use the information from both of these files. .P The offending levels are identified by content as well as by name and number, so that updated versions will no longer be identified as unsolvable. See the Tile World website for more information about the format of this file, and to check for updates to the database. .br .SH DIRECTORIES Tile World uses four different directories for storing external files. The following list enumerates the directories and describes their purpose. The default directories that the program uses can be configured at compile time. The directories can also be changed at runtime via command-line options and/or environment variables (see below). .P .TP .B Sets This directory is used to hold the available level sets. The files in this directory are either data files or configuration files. (default for Linux: /usr/local/share/tworld/sets) .TP .B Data This directory is used to hold the data files that are referenced by configuration files. (default for Linux: /usr/local/share/tworld/data) .TP .B Res This directory stores the graphics and sound files used by the program. (default for Linux: /usr/local/share/tworld/res) .TP .B Save This directory is used for saving solution files. (default for Linux: ~/.tworld) .br .SH ENVIRONMENT VARIABLES Two environment variables can be used to override the program's built-in defaults for which directories to use. They are as follows: .P .TP .B TWORLDDIR Specifies a top-level directory, in which the program will look for the resource, level set, and data file directories. .TP .B TWORLDSAVEDIR Specifies a directory for saving solution files. .br .SH LICENSE Tile World is copyright (C) 2001-2006 by Brian Raiter. .P 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 2 of the License, or (at your option) any later version. .P This program is distributed in the hope that it will be useful, but .BR "without any warranty" ; without even the implied warranty of .B merchantability or .BR "fitness for a particular purpose" . See the GNU General Public License for more details. .P Please send bug reports to breadbox@muppetlabs.com. .br .SH HISTORY "Chip's Challenge" was created by Chuck Sommerville, and was originally written for the Atari Lynx handheld game console. ("Tile World" was his working title for the game.) "Chip's Challenge" was published by Epyx (the company who designed the Lynx before selling the rights to Atari) in 1989, and was among the first set of games made available for the Lynx. .P "Chip's Challenge" was subsequently ported to several other platforms: MS-DOS, Microsoft Windows (16-bit), Amiga, ZX Spectrum, Atari ST, and the Commodore 64. (A NES port was also planned, but never completed.) .P The Windows port was different from most (perhaps all?) of the others in that it was not done by the original team at Epyx. Instead it was done by Microsoft and sold as part of Windows Entertainment Pack 4 (and later as part of Best of Windows Entertainment Pack). In the process of recreating the game for the 16-bit Windows platform, Microsoft introduced a surprising number of changes to the mechanics of the game. Some were clearly intentional, some were done through ignorance or indifference, and others were simply bugs in the program. The programs in WEP4 came pre-installed on many PC computers sold during the 1990s, which is part of the reason why this particular version became the most popular. A small but fanatically loyal community of adherents to the game connected via a MSN chatroom (and later through the internet). A few members of this community managed to decipher the format of the MS game's data file, and John K. Elion subsequently created a freeware level editor, called ChipEdit. As a result there are now dozens of new level sets, created by fans of the game and all freely available. .P Atari discontinued support for the Lynx in 1994. When Epyx went under, the rights to their games were purchased by Bridgestone Multimedia. Responding to the success of "Chip's Challenge", Chuck Sommerville created a sequel ("Chip's Challenge 2"). The sequel included the original game as a proper subset, and the company held the rights to both games. Bridgestone Multimedia, who has now become Alpha Omega Publications, unfortunately did not see fit to actually release "Chip's Challenge 2", and by now it is highly unlikely that it ever will be released. Since Chuck Sommerville no longer has rights to either game, and Microsoft no longer sells either of the Entertainment Packs, the original "Chip's Challenge" is no longer available except by purchasing a used copy of one of the aforementioned Entertainment Packs (or by downloading an illegal copy). .P In 2001, the author began writing "Tile World" with the intention of recreating a version of the MS game for the Linux platform. At the encouragement of Chuck Sommerville, this project was expanded to include the goals of recreating the original Lynx game as well, and also making the program work under MS Windows in addition to Linux. .br .SH APPENDIX: NOTES ON NOMENCLATURE "Chip's Challenge" has seen several incarnations. Each had its own graphical rendering, and thus many of the objects in the game are known by more than one name. For example, the four types of boots in the MS version of the game were known as fire boots, flippers (for water), skates (for ice), and suction boots (for force floors). In the original Lynx version, however, they were not even boots -- the four tools were fire shields, water shields, cleats, and magnets, respectively. .P Several of the creatures have seen a variety of names. The list of creatures given in .B OVERVIEW OF THE GAME corresponds to the MS version of the game. In the original Lynx version, the paramecia were centipedes instead. In still other versions of the game, gliders were referred to as ghosts or sharks, fireballs were flames, and teeth were called frogs. (You will also occasionally see bugs referred to as bees, and walkers referred to as dumbbells.) .P Finally, the thief tile was called a spy in the MS version. .P None of this information is needed in order to play the game, but it helps to explain the titles of some of the user-created levels. tworld-1.3.0/docs/tworld.html0000644000175000017500000010104610420664541016321 0ustar breadboxbreadbox Tile World

Tile World

Contents

Synopsis

Tile World is a reimplementation of the game "Chip's Challenge". The player controls Chip, navigating him through his challenges. The object of each level of the game is to find and reach the exit tile, which takes you to the next level. The levels contain many different kinds of obstacles, creatures both hostile and indifferent, tools, protective gear -- and, of course, chips.


Overview of the Game

The main display shows Chip in the current level and his immediate surroundings. To the right of this display is shown the basic information about the current level. The most important data shown here are how many seconds are left on the clock, and how many chips still need to be collected. (On some level the clock does not show a time. These levels have no time limit.)

The object of every level is to find and reach the exit before the time runs out. The exit is frequently (but not always) guarded by a chip socket. To move past the chip socket, Chip must collect a certain number of computer chips; the amount needed is different in each level. As you play a level, the information display on the right shows the number of chips that still need to be collected in order to open the socket. (Remember that getting enough chips to open the chip socket is only a subgoal, not the main goal. Some levels do not require any chips to be collected; some levels have no chip socket at all.)

Also occupying many of the levels are other creatures. Most (but not all) of them move about in simple, predictable patterns, and without regard for Chip's presence. The creatures know enough to avoid running into each other, but a collision with Chip is fatal. The complete taxonomy of creatures is: tanks, balls, gliders, fireballs, walkers, blobs, teeth, bugs, and paramecia.

In addition to the socket and the main exit, there are also four different kinds of doors. These doors can be opened with the right kind of key. The doors and the keys are color-coded -- red, green, blue, and yellow -- so you can tell them apart. Like the chip socket, a door that has been opened stays open. Keys are picked up simply by stepping upon them. The key disappears from the map and appears in your possession. Keys in your possession are displayed on the right-hand side of the window.

Besides keys and chip, there are also four kinds of special footgear that Chip can collect. Like keys, boots can be picked up simply by walking over them. (There is no limit to the number of boots you can have.) These boots permit Chip to walk across four different kinds of surfaces, just as if they were normal flooring. Fire and water are two kind of tiles that are normally fatal to Chip, but fire boots and water boots will permit safe passage across these. Stepping onto ice sends Chip sliding at high speed unless he has a pair of ice boots. Finally, there are force floors that push Chip along in a specific direction; these can be counteracted with force boots.

Two other types of surfaces are more useful to Chip, in that they keep other creatures out. These are dirt and gravel, and they are special in that Chip is the only one who can walk on them. However, when Chip steps onto a dirt tile, it is cleared away and becomes normal flooring. Gravel, on the other hand, is permanent.

There are numerous other objects scattered around the various levels, which Chip can interact with, although he cannot pick them up. Bombs are one kind of object which should always be avoided, as they explode when stepped on. The thief tile should also generally be avoided; entering this tile will cause Chip to lose any footgear he has collected.

Dirt blocks are large, movable squares of dirt. Chip can push them about, and use them to wall off areas or to safely detontate bombs. Furthermore, if a block is pushed into water, the tile will turn into dirt (which will become normal flooring when Chip steps on it). Finally, note that blocks can sometimes be resting on top of other objects, both helpful (such as a key) and harmful (such as a bomb).

Some levels have teleports. Entering a teleport causes Chip to vanish and instantaneously reappear at another teleport.

Even some of the walls can demonstrate surprising behavior. The so-called blue walls can either be actual walls, or empty mirages. The only way for Chip to tell which is which is to attempt to walk through one. There are also popup walls -- Chip can walk across these only once, for they turn into walls as he walks over them.

There are four different types of pushbuttons. Like keys and boots, they are color-coded. Stepping on a pushbutton activates it.

The green buttons control the toggle walls. Toggle walls have dotted green outlines, and they change between being open (passable, like any other floor) and open (unpassable, a wall). When a green button is pressed, the closed toggle walls are opened and the open toggle walls are closed.

Brown buttons control bear traps. Anything that wanders into a bear trap will be stuck there until the brown button connected to it is pushed.

Blue buttons exercise some control over the tanks. Normally, a tank moves directly forward until it hits an obstacle, whereupon it stops. But when a blue button is pressed, all tanks turn around 180 degrees and begin moving again.

The objects with the most potential for help and hindrance are the clone machines, which are controlled by red buttons. Every clone machine contains a dirt block, a tank, or some other creature. When the clone machine's red button is pressed, a duplicate of whatever the clone machine contains is created and set loose.

Once in a while there will also be hint buttons. These have a question mark displayed on them. When Chip steps onto a hint button, a short bit of information will be displayed in the lower right-hand area of the window.

Here are some general hints for successful play:

  • When moving dirt blocks around, take care not to shove them into corners where you can't get them out again.
  • On some of the more mazelike levels, you may need to sketch out a map in order to solve it.
  • Many of the creatures move in specific patterns (for example, as with the tanks mentioned above).
  • A number of the objects in the game will affect other creatures in the same way they affect Chip.
  • Remember that if you get trapped somewhere, you can always use Ctrl-R to restart a level.
  • When you find a level to be unusually difficult, take some time to examine it carefully. Make sure you truly know what options are available to you. In any case, keep trying. Occasionally the game will give you the opportunity to skip a level that seems too hard.

Passwords

Every level has a four-letter password. The password for a level is shown in the information display at the upper-right of the window. The obstensible purpose of passwords is to allow you to come back to a level. Howver, normally you will never need to remember passwords, as Tile World will automatically store the passwords for you. However, if you somehow manage to learn the password of a level that you have yet to achieve, you can use the password to gain early access to that level.

Scoring

For each level in a set that you complete, the game awards 500 points times the level's number. Furthermore, if the level is timed, an extra 10 points is added for every second left on the clock when you finish the level. You can thus sometimes improve your score by returning to already-completed levels and playing them again.


Key Commands

During game play, the arrows are the most important keys; they move Chip through the level. The keys 2 4 6 8 on the numeric keypad can also be used for the same purpose. Other keys have the following functions:

Bkspc  pauses the game; press any key to resume play.
Ctrl-H  same as Bkspc.
Ctrl-N  stops the current game and moves forward to the next level.
Ctrl-P  stops the current game and moves back to the previous level.
Q  quits the current level.
Ctrl-R  starts over at the beginning of the current level.
?  pauses the game and displays a list of topics for which help is available within the program.
V  decreases the volume level. (If the volume level is reduced to zero, then the program will display sound effects textually, as onomatopoeia.)
Shift-V  increases the volume level.

At the start of a level, before game play begins, the following key commands are available:

Q  returns to the list of available level sets.
Spc  starts the current level without moving (i.e., standing still).
N  moves to the next level.
P  moves to the previous level.
PgUp  moves ahead ten levels.
PgDn  moves back ten levels.
G  displays a prompt and accepts a password, then jumps to the level with that password.
Tab  plays back the best solution for that level.
Shift-Tab  verifies the best solution for that level. If the solution is no longer valid (e.g. because the level has been altered), the solution will automatically be deprecated.
Ctrl-I  same as Tab.
Shift-Ctrl-I  same as Shift-Tab.
O  toggles between even-step and odd-step offset.
Shift-O  (Lynx-mode only) increments the stepping offset by one.
Ctrl-X  deprecates the best solution for that level. If the level is then succesfully completed again, the saved solution will be replaced with the new one, whether or not it had a better time.
Shift-Ctrl-X  deletes the saved solution for that level. If confirmed, the solution will be immediately removed from the solution file.
S  displays the list of known levels and the score for each, as well as the overall score for the level set. The score list display also permits changing the current level by moving the selection and pressing Enter.
Ctrl-S  displays the list of solution files in the save directory whose names start with the name of the current level set. From here a different solution file can be selected.
?  displays a list of topics for which help is available within the program.

At every point in the program, the Q key will abort the current activity and return to the previous display.

Finally, the program can be exited at any time by pressing Shift-Q. (Ctrl-C or Alt-F4 will also force an immediate exit.)


Rulesets

Tile World contains emulators for two different versions of "Chip's Challenge". They are referred to as the Lynx ruleset and the MS ruleset. The Lynx ruleset recreates the original implementation of the game, and the MS ruleset recreates the version that was implemented for Microsoft Windows (cf History).

The most notable difference between the two rulesets is that in the MS ruleset, movement between tiles is instantaneous, whereas under the Lynx ruleset motion occurs across several "ticks". (This probably reflects the fact that the latter ran on dedicated hardware, while the former ran on 33 MHz PCs under a non-preemptive multitasking OS.) Although the basic mechanics of the game are the same under both rulesets, there are also a host of subtle differences between the two.

Each level set file includes a flag that indicates which ruleset it is to be played under. Some level sets can be played under both rulesets (most notably, the original set of levels), but this is the exception.

Adding New Level Sets

Level sets are defined by data files. By convention these file are named with a .dat extension. Typically the name proper contains the author's first name, last initial, and a single digit -- for example, EricS1.dat. (The digit is used to give the sequence in case the author, for whatever reason, stores their creations in more than one file.)

When a new data file is obtained, it may simply be copied into the level set directory (cf Directories), and Tile World will then make it available for playing.

An alternate method is to use a configuration file (see Configuration Files below).


Command-Line Options

tworld is normally invoked without arguments. The program begins by displaying a list of the available level sets. After a level set is chosen, the program jumps to the first unsolved level to begin play.

The available command-line options are enumerated in the following table. (Windows users: The options that cause the program to display information on standard output actually go to a file named stdout.txt instead.)

-a  Double the size of the audio buffer. This option can be repeated, so for example -aaa would increase the audio buffer size eightfold.
-b  Do a batch-mode verification of the existing solutions and exit. Levels with invalid solutions are displayed on standard output. If used with -q, then nothing is displayed, and the program's exit code is the number of invalid solutions. Can also be used with -s or -t to have solutions verified before the other option is applied. Note that this options requires a level set file and/or a solution file be named on the command line.
-D DIR  Read level data files from DIR instead of the default directory.
-d  Display the default directories used by the program on standard output, and exit.
-F  Run in full-screen mode.
-H  Upon exit, display a histogram of idle time on standard output. (This option is used for evaluating optimization efforts.)
-h  Display a summary of the command-line syntax on standard output and exit.
-L DIR  Look for level sets in DIR instead of the default directory.
-l  Write a list of available level sets to standard output and exit.
-n N  Set the initial volume level to N, 0 being silence and 10 being full volume. The default level is 10.
-P  Turn on pedantic mode, forcing the Lynx ruleset to emulate the original game as closely as possible. (See the Tile World website for more information on emulation of the Lynx ruleset.)
-p  Turn off all password-checking. This option allows the normal sequence of levels to be bypassed.
-q  Run quietly. All sounds, including the ringing of the terminal bell, are suppressed.
-r  Run in read-only mode. This guarantees that no changes will be made to the solution files.
-R DIR  Read resource data from DIR instead of the default directory.
-S DIR  Read and write solution files under DIR instead of the default directory.
-s  Display the current scores for the selected level set on standard output and exit. A level set must be named on the command line. If used with -b, the solutions are verified beforehand, and invalid solutions are indicated.
-t  Display the best times for the selected level set on standard output and exit. A level set must be named on the command line. If used with -b, the solutions are verified beforehand, and invalid solutions are indicated.
-V  Display the program's version and license information on standard output and exit.
-v  Display the program's version number on standard output and exit.

Besides the above options, tworld can accept up to three command-line arguments: the name of a level set, the number of a level to start on, and the name of an alternate solution file. If the name of an installed level set is specified, then Tile World will start up in that set, skipping the initial level set selection.

If the specified level set is not a simple name but is a pathname (relative or absolute), then Tile World will use that level set only, without requiring that it first be installed. No solutions will be saved unless an explicit solution file is also supplied on the command-line. (If the command-line only specifies a solution file, then Tile World will look up the name of the level set in the solution file.)


Configuration Files

Configuration files are used to override some of the settings in a data file, or to set values not provided for by the data file format. Configuration files are by convention named with a .dac extension. A configuration file is stored in the level set directory in the place of the data file, which then goes into the data directory (cf Directories).

The configuration file is a simple text file. The first line of a configuration file must have the following form:

file = DATAFILE

where DATAFILE is the filename of the data file. (Arbitrary whitespace is permitted around the equal sign, but there cannot be any whitespace embedded at the beginning of the line.) After this initial line, the configuration file can contain any of the following lines:

usepasswords = y|n

This line permits password-checking to be enabled/disabled when playing the levels in the set. The default is y.

ruleset = ms|lynx

This line allows the configuration file to override the ruleset setting in the data file. This is mainly useful in the case where one level set is playable under either ruleset (as is the case with the original level set). The author can then provide one data file and two configuration files to make both versions available.

lastlevel = levelnum

This line marks an arbitrary level as being the last level in the set. The game will stop when this level is completed, instead of proceeding to the next level. (Note that if the data file contains any levels beyond this one, they will only be reachable via a password.)

fixlynx = y|n

This line is specifically for use with the original level set. It is not generally useful, and is described here only for completeness. The chips.dat file that MS distributed with their version of "Chip's Challenge" contained a few minor differences from the original level set as appeared on the Lynx. A positive value for this entry instructs the program to undo those changes, so that the original Lynx level set is obtained. (The changes made in the MS version were: an extra level was added; four passwords were garbled; and four or five levels' maps had minor alterations.)

Resources

Tile World loads various resources at runtime from its resource directory (cf Directories). These resources include the program's font, graphic images, and sound effects. The actual file names are determined by the contents of a file named rc (short for "resource configuration", not "runtime commands") in the same directory.

The rc file is a plain text file, and contains lines of the form

resource = filename

where resource is a symbolic resource name, and filename is the name of a file in the resource directory.

The resources can be set differently depending on the ruleset that the program is using. A line in the rc file of the form

[ruleset]

indicates that the lines that follow only apply when that ruleset is in effect (where ruleset is either MS or Lynx). Resources that are defined before any such line apply to both rulesets, and are also used as fallbacks if a ruleset-specific resource could not be loaded. (The font and the text-color resources also need to have ruleset-independent values, as these are needed when displaying the initial file list, before a ruleset has been chosen.)

A line of the form

TileImages = FILENAME

identifies the file that provides the images used to draw the game. These images are stored in a Windows bitmap. (See the Tile World website for more information about this resource.)

A line of the form

Font = FILENAME

identifies the file that provides the program's font. The font is stored as a Windows bitmap. (See the Tile World website for more information about this resource.)

A line of the form

UnsolvableList = FILENAME

identifies the filename for the database of unsolvable levels. See Database of Unsolvable Levels below for more information about this file. Note that this resource must be defined independent of the ruleset, or else it will be ignored.

Four resources define the colors used in rendering text:

BackgroundColor = RRGGBB
TextColor = RRGGBB
BoldTextColor = RRGGBB
DimTextColor = RRGGBB

The value of RRGGBB is a string of six hexadecimal digits defining the red, green, and blue values of the color (as with the color specification used in HTML or X Windows, but without the preceding octothorpe).

The remaining resources all define the game's sound effects. The sounds are stored as Microsoft RIFF files (so-called wave files). Unlike the tile images, each sound effect is defined as a separate file. The complete list of symbolic resource names is as follows:

Sounds used in both rulesets

  • LevelCompleteSound
  • ChipDeathSound
  • BlockedMoveSound
  • PickupToolSound
  • ThiefSound
  • TeleportSound
  • OpenDoorSound
  • SocketSound
  • SwitchSound
  • BombSound
  • SplashSound

Sounds used only under the MS ruleset

  • TickSound
  • ChipDeathByTimeSound
  • PickupChipSound

Sounds used only under the Lynx ruleset

  • TileEmptiedSound
  • WallCreatedSound
  • TrapEnteredSound
  • BlockMovingSound
  • SkatingForwardSound
  • SkatingTurnSound
  • SlidingSound
  • SlideWalkingSound
  • IceWalkingSound
  • WaterWalkingSound
  • FireWalkingSound

(Note that the symbolic names for the shared and MS-only sounds match the names in the entpack.ini file used by the Microsoft program. This makes it easy for someone with a copy of Microsoft's "Chip's Challenge" to use the sound effects that were provided with that version of the game.)

Database of Unsolvable Levels

Of the many thousands of user-created levels that are publicly available, there are some that are not possible to complete. Some of these are intentionally so (e.g. requiring the player to deduce the password to the next level). The remainder, however, are simply due to poor design, and there is typically no indication that attempting to solve these levels is fruitless.

To help alleviate this, Tile World comes with a database of levels that have been identified by the community to be definitely unsolvable. When the player visits a level that appears in this database, a warning is displayed, and the password to the next level is automatically supplied.

The main database of unsolvable levels is stored in the resource directory. In addition, a player can keep a separate database in a file of the same name in the directory for solution files. If present, Tile World will use the information from both of these files.

The offending levels are identified by content as well as by name and number, so that updated versions will no longer be identified as unsolvable. See the Tile World website for more information about the format of this file, and to check for updates to the database.

Directories

Tile World uses four different directories for storing external files. The following list enumerates the directories and describes their purpose. The default directories that the program uses can be configured at compile time. The directories can also be changed at runtime via command-line options and/or environment variables (see below).

Sets  This directory is used to hold the available level sets. The files in this directory are either data files or configuration files. (default for Linux: /usr/local/share/tworld/sets)
Data  This directory is used to hold the data files that are referenced by configuration files. (default for Linux: /usr/local/share/tworld/data)
Res  This directory stores the graphics and sound files used by the program. (default for Linux: /usr/local/share/tworld/res)
Save  This directory is used for saving solution files. (default for Linux: ~/.tworld)

Environment Variables

Two environment variables can be used to override the program's built-in defaults for which directories to use. They are as follows:

TWORLDDIR  Specifies a top-level directory, in which the program will look for the resource, level set, and data file directories.
TWORLDSAVEDIR  Specifies a directory for saving solution files.


License

Tile World is copyright (C) 2001-2006 by Brian Raiter.

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 2 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.

Please send bug reports to breadbox@muppetlabs.com.


History

"Chip's Challenge" was created by Chuck Sommerville, and was originally written for the Atari Lynx handheld game console. ("Tile World" was his working title for the game.) "Chip's Challenge" was published by Epyx (the company who designed the Lynx before selling the rights to Atari) in 1989, and was among the first set of games made available for the Lynx.

"Chip's Challenge" was subsequently ported to several other platforms: MS-DOS, Microsoft Windows (16-bit), Amiga, ZX Spectrum, Atari ST, and the Commodore 64. (A NES port was also planned, but never completed.)

The Windows port was different from most (perhaps all?) of the others in that it was not done by the original team at Epyx. Instead it was done by Microsoft and sold as part of Windows Entertainment Pack 4 (and later as part of Best of Windows Entertainment Pack). In the process of recreating the game for the 16-bit Windows platform, Microsoft introduced a surprising number of changes to the mechanics of the game. Some were clearly intentional, some were done through ignorance or indifference, and others were simply bugs in the program. The programs in WEP4 came pre-installed on many PC computers sold during the 1990s, which is part of the reason why this particular version became the most popular. A small but fanatically loyal community of adherents to the game connected via a MSN chatroom (and later through the internet). A few members of this community managed to decipher the format of the MS game's data file, and John K. Elion subsequently created a freeware level editor, called ChipEdit. As a result there are now dozens of new level sets, created by fans of the game and all freely available.

Atari discontinued support for the Lynx in 1994. When Epyx went under, the rights to their games were purchased by Bridgestone Multimedia. Responding to the success of "Chip's Challenge", Chuck Sommerville created a sequel ("Chip's Challenge 2"). The sequel included the original game as a proper subset, and the company held the rights to both games. Bridgestone Multimedia, who has now become Alpha Omega Publications, unfortunately did not see fit to actually release "Chip's Challenge 2", and by now it is highly unlikely that it ever will be released. Since Chuck Sommerville no longer has rights to either game, and Microsoft no longer sells either of the Entertainment Packs, the original "Chip's Challenge" is no longer available except by purchasing a used copy of one of the aforementioned Entertainment Packs (or by downloading an illegal copy).

In 2001, the author began writing "Tile World" with the intention of recreating a version of the MS game for the Linux platform. At the encouragement of Chuck Sommerville, this project was expanded to include the goals of recreating the original Lynx game as well, and also making the program work under MS Windows in addition to Linux.


Appendix: Notes on Nomenclature

"Chip's Challenge" has seen several incarnations. Each had its own graphical rendering, and thus many of the objects in the game are known by more than one name. For example, the four types of boots in the MS version of the game were known as fire boots, flippers (for water), skates (for ice), and suction boots (for force floors). In the original Lynx version, however, they were not even boots -- the four tools were fire shields, water shields, cleats, and magnets, respectively.

Several of the creatures have seen a variety of names. The list of creatures given in Overview of the Game corresponds to the MS version of the game. In the original Lynx version, the paramecia were centipedes instead. In still other versions of the game, gliders were referred to as ghosts or sharks, fireballs were flames, and teeth were called frogs. (You will also occasionally see bugs referred to as bees, and walkers referred to as dumbbells.)

Finally, the thief tile was called a spy in the MS version.

None of this information is needed in order to play the game, but it helps to explain the titles of some of the user-created levels. tworld-1.3.0/oshw-sdl/0000755000175000017500000000000010420664541014726 5ustar breadboxbreadboxtworld-1.3.0/oshw-sdl/Makefile.in0000644000175000017500000000165710402750212016773 0ustar breadboxbreadbox CC = @CC@ CFLAGS :=@OSHWCFLAGS@ # # End of configure section # OBJS = sdloshw.o sdltimer.o sdlerr.o sdlin.o sdlout.o sdltext.o \ sdltile.o sdlsfx.o # # The main target # liboshw.a: $(OBJS) ar crs $@ $^ cp liboshw.a .. # # Object files # sdlerr.o : sdlerr.c sdlgen.h ../gen.h ../oshw.h sdloshw.o : sdloshw.c sdlgen.h ccicon.c ../gen.h ../oshw.h ../err.h sdltimer.o: sdltimer.c sdlgen.h ../gen.h ../oshw.h sdltext.o : sdltext.c sdlgen.h ../gen.h ../oshw.h ../err.h sdltile.o : sdltile.c sdlgen.h ../gen.h ../oshw.h ../err.h \ ../defs.h ../state.h sdlsfx.o : sdlsfx.c sdlgen.h ../gen.h ../oshw.h ../err.h \ ../defs.h ../state.h sdlin.o : sdlin.c sdlgen.h ../gen.h ../oshw.h ../defs.h sdlout.o : sdlout.c sdlgen.h ../gen.h ../oshw.h ../err.h \ ../defs.h ../state.h # # Other # all: liboshw.a clean: rm -f $(OBJS) liboshw.a spotless: rm -f $(OBJS) liboshw.a # ccicon.c rm -f Makefile tworld-1.3.0/oshw-sdl/ccicon.c0000644000175000017500000010632307626673777016366 0ustar breadboxbreadbox/* tworld.ico:#3 */ #define CXCCICON 48 #define CYCCICON 48 static Uint32 cciconimage[] = { 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xA6A6A6, 0x606260, 0x8C918D, 0xA6A6A6, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0x5A5A5A, 0x2E2E2E, 0x2E2E2E, 0x363636, 0x424242, 0x494A4A, 0x525252, 0x5A5A5A, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB6B6B6, 0x7C7E7C, 0x667072, 0x999B9A, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0x525252, 0x323232, 0x323232, 0x2E2E2E, 0x363636, 0x424242, 0x4D4E4E, 0x525252, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0x606260, 0x828582, 0xA1A2A4, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xA6A6A6, 0xA6A6A6, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0x424242, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x363636, 0x424242, 0x4D4E4E, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0x888988, 0x5E5E5E, 0x727672, 0x727672, 0x646665, 0x555A56, 0x424A42, 0x424A42, 0x464A46, 0x777A76, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0x464646, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x3A3A3A, 0x464646, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0x999B9A, 0x929292, 0x828582, 0x747272, 0x646665, 0x555A56, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x727672, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0xAEAEAE, 0x3E3E3E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x323232, 0x3E3E3E, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAAAAAA, 0x7E827E, 0x6B6E6C, 0x606260, 0x555A56, 0x464A46, 0x464E46, 0x424A42, 0x464E46, 0x424A42, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x667072, 0xA1A2A4, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0xB6B6B6, 0xBFBFBF, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0x5E5E5E, 0x3A423A, 0x424A42, 0x464E46, 0x4C524D, 0x464E46, 0x424A42, 0x424642, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x4A4E4A, 0x545A52, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x4A5258, 0xAEAEAE, 0xBABABA, 0xC6C6C6, 0xD6D6D6, 0xE2E2E2, 0xF0F0F0, 0xF0F0F0, 0xEAEAEA, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0x272B25, 0x313632, 0x3E423E, 0x424A42, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x4C524D, 0x6A665A, 0x606260, 0x464E46, 0x424A42, 0x585E58, 0x6B6E6C, 0x6B6E6C, 0x7E827E, 0x5A625A, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x5A636B, 0xCED2D2, 0xE2E2E2, 0xCECECE, 0xBFBFBF, 0xB2B2B2, 0xAEAEAE, 0xA1A2A4, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xA1A2A4, 0x939CA5, 0x313237, 0x222622, 0x363636, 0x3E463E, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x929292, 0x888988, 0x7E827E, 0x666A65, 0x6A665A, 0x464A46, 0x464E46, 0x525652, 0x464A46, 0x464A46, 0x585E58, 0x777A76, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x434D52, 0x999B9A, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0x999B9A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0x939CA5, 0x728290, 0x6A7A89, 0x40586A, 0x222222, 0x272B25, 0x363A36, 0x3E463E, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x424A42, 0x4C524D, 0x606260, 0x606260, 0x6A6A6A, 0x646665, 0x6E726D, 0x464A46, 0x5A625A, 0x999B9A, 0x666A65, 0x585E58, 0x6B6E6C, 0x4C524D, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x555A56, 0x939CA5, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0x999B9A, 0x323232, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0xB2B2B2, 0xAEAEAE, 0xAEAEAE, 0x7A8896, 0x6C7D8E, 0x939CA5, 0x5A636B, 0x394650, 0x222622, 0x2A2E2A, 0x393E39, 0x3E463E, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x4C524D, 0x777A76, 0x727672, 0x727672, 0x5A625A, 0x4C524D, 0x464E46, 0x464E46, 0x7C7E7C, 0x6B6E6C, 0x666A65, 0x5A625A, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x4D4E4E, 0x7C888E, 0xAEAEAE, 0xB2B2B2, 0x8C918D, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0x728290, 0x7A8896, 0x959698, 0x728290, 0x5B778D, 0x394650, 0x222222, 0x2E322E, 0x3A423A, 0x424642, 0x424A42, 0x464A46, 0x464E46, 0x424A42, 0x464A46, 0x464E46, 0x6B6E6C, 0x6E726D, 0xA6A6A6, 0x777A76, 0x727672, 0x464A46, 0x5A625A, 0x585E58, 0x464E46, 0x545A52, 0x666A65, 0x666A65, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x4C524D, 0x7E8E96, 0xAAAAAA, 0x828582, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0xBFBFBF, 0xC6C6C6, 0xCED2D2, 0x7A8E92, 0x7A8896, 0x6A7A89, 0x6C7D8E, 0x929E7E, 0x363A36, 0x2A2A2A, 0x222222, 0x313632, 0x3E423E, 0x424A42, 0x424A42, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x4C524D, 0x777A76, 0x464E46, 0x6E726D, 0x727672, 0x525652, 0x464E46, 0x525652, 0x8C918D, 0x6B6E6C, 0x585E58, 0x666A65, 0x666A65, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x4A4E4A, 0x4C524D, 0x607183, 0x7E827E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xE2E2C2, 0xDCDCA8, 0xD6D696, 0x7C888E, 0x6C7D8E, 0x6A7A89, 0x8E9266, 0xB2AA3E, 0x7A8896, 0x5B778D, 0x2A353B, 0x222222, 0x313632, 0x3E423E, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x585E58, 0x929292, 0x555A56, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x585E58, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x636F77, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0xDECA22, 0xDEBE0E, 0x828676, 0x6F7E89, 0x6B6E6C, 0x6A7A89, 0x6B6E6C, 0x5B6E7E, 0x6C7D8E, 0x4F5E6C, 0x2A353B, 0x1F221E, 0x272B25, 0x363A36, 0x424642, 0x424A42, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x606260, 0x4C524D, 0x464A46, 0x5A625A, 0x727672, 0x666A65, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x4A4E4A, 0x485966, 0x313237, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xD63E02, 0xCA2202, 0x9E2E2E, 0x725660, 0x861E22, 0x6A7A89, 0x6C7D8E, 0x5B6E7E, 0x999B9A, 0xBEBA9E, 0x636F77, 0x465E6E, 0x262626, 0x272B25, 0x363A36, 0x3E463E, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x424A42, 0x424A42, 0x777A76, 0x999B9A, 0x6B6E6C, 0x777A76, 0x666A65, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464646, 0x323232, 0x323232, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0x923632, 0x985650, 0xAE8A7A, 0xBAAA8E, 0x728290, 0x607183, 0x7A867E, 0x6F7E89, 0x9A9E66, 0x6F7E89, 0x728290, 0x586A79, 0x2E3E46, 0x1F221E, 0x2E2E2E, 0x393E39, 0x424A42, 0x424A42, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x424A42, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x51626D, 0x393E42, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xDEDE86, 0xDEDE62, 0xDED646, 0xDECE26, 0x7A8276, 0x777A76, 0xAA8A36, 0x6A7A89, 0x667072, 0x586A79, 0x7C6A76, 0x86262A, 0x2E2E2E, 0x313237, 0x1F221E, 0x2E322E, 0x393E39, 0x424A42, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x525E62, 0x323232, 0x323232, 0x2E2E2E, 0x323232, 0xDEA802, 0xDE8A02, 0xDE6E02, 0xDA4E02, 0xD02E06, 0xBE220E, 0x725660, 0x607183, 0x5A6672, 0x607183, 0x866666, 0x6E5A62, 0x7A8896, 0x567A9A, 0x313237, 0x1F221E, 0x313632, 0x3E423E, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x4A4E4A, 0x4C524D, 0x525652, 0x5A625A, 0x6B6E6C, 0x545A52, 0x4E5E66, 0x3C434A, 0x2E2E2E, 0x2E2E2E, 0xDE8A02, 0xD61202, 0xB60202, 0x8E0E0A, 0x923632, 0x825E5E, 0x637686, 0x6F7E89, 0x8C918D, 0x5B778D, 0x86927E, 0x607183, 0x6F7E89, 0x5A6672, 0x2A353B, 0x222222, 0x222622, 0x313632, 0x3A423A, 0x424A42, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x4A4E4A, 0x464E46, 0x4A4E4A, 0x464E46, 0x4C524D, 0x585E58, 0x6B6E6C, 0x777A76, 0x7C7E7C, 0x7C7E7C, 0x727672, 0x646665, 0x545A52, 0x4A4E4A, 0x5C6A6E, 0x6A7A89, 0x424242, 0x323232, 0xDEA802, 0xDE4202, 0xB60202, 0x720E0A, 0xD6D2BA, 0xDEDE92, 0x9EA25A, 0xC2BC32, 0x7E8652, 0x607183, 0x6E726D, 0x607183, 0x926256, 0xCA6A0A, 0x545A52, 0x40586A, 0x262626, 0x272B25, 0x363A36, 0x3E423E, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x4A4E4A, 0x4C524D, 0x4C524D, 0x545A52, 0x6B6E6C, 0x777A76, 0x828582, 0x828582, 0x7E827E, 0x6E726D, 0x5A625A, 0x4C524D, 0x424A42, 0x424A42, 0x3E463E, 0x3E423E, 0x3E423E, 0x3E423E, 0x454E57, 0x5B6E7E, 0x5B6E7E, 0x2E2E2E, 0xDEBE02, 0xDE7A02, 0xCE0602, 0x8E0202, 0x9E827A, 0xDCDCA8, 0xDAD63E, 0x9A963A, 0x607183, 0x6A7A82, 0x6E4E56, 0x637686, 0x922E36, 0x7C6A76, 0x728290, 0x5B778D, 0x394650, 0x222222, 0x2A2A2A, 0x393E39, 0x424642, 0x464E46, 0x4C524D, 0x525652, 0x646665, 0x727672, 0x828582, 0x888988, 0x828582, 0x7C7E7C, 0x666A65, 0x545A52, 0x464E46, 0x464A46, 0x424642, 0x3E463E, 0x3E463E, 0x3E463E, 0x3E423E, 0x3A423A, 0x3A423A, 0x3A423A, 0x3A423A, 0x3E423E, 0x4A565E, 0x4F5E6C, 0x63727E, 0x323232, 0xDACE0E, 0xDC9602, 0xD02E06, 0xA80202, 0x662A2A, 0x828676, 0x7A7A46, 0x6E722A, 0x637686, 0x6E4E56, 0x7A2E3A, 0x6A767E, 0x664E5A, 0x586A79, 0x6F7E89, 0x827E4E, 0x323232, 0x1F221E, 0x1F221E, 0x2E322E, 0x3E423E, 0x666A65, 0x8C918D, 0x7A867E, 0x727672, 0x5A625A, 0x4C524D, 0x464E46, 0x424642, 0x3E463E, 0x3E463E, 0x3E423E, 0x3E423E, 0x3A423A, 0x3A423A, 0x3E3E3E, 0x393E39, 0x393E39, 0x393E39, 0x3E3E3E, 0x3E3E3E, 0x393E39, 0x393E39, 0x393E39, 0x4F5E6C, 0x4C6275, 0x5C6A6E, 0x2E2E2E, 0xC2BC32, 0xBA9A06, 0x3C2E18, 0x313237, 0x2A2A2A, 0x394650, 0x454E57, 0x1E1E1E, 0x5A4216, 0xBE5A16, 0x5E5666, 0x607183, 0x6A5E62, 0x607183, 0x6E6256, 0x5A4E26, 0x667072, 0x5B778D, 0x343A3F, 0x272B25, 0x393E39, 0x424642, 0x424A42, 0x424A42, 0x3E463E, 0x3E423E, 0x3A423A, 0x393E39, 0x3A423A, 0x3E423E, 0x3E3E3E, 0x3A423A, 0x3A423A, 0x3A423A, 0x3E3E3E, 0x3A423A, 0x393E39, 0x393E39, 0x3A3A3A, 0x3A3A2A, 0x2E322E, 0x2E2E2E, 0x2A2E2A, 0x2E2E2E, 0x343A3F, 0x586A79, 0x586A79, 0x323232, 0x7E8652, 0x272B25, 0x1F221E, 0x313237, 0x5B6E7E, 0x4E677B, 0x5A636B, 0x1E1E1E, 0x1F221E, 0x525652, 0x6A7A89, 0x637686, 0x394650, 0x607183, 0x454E57, 0x63727E, 0x728290, 0x7A8896, 0x586A79, 0x222222, 0x2E322E, 0x393E39, 0x3E423E, 0x3A423A, 0x3A423A, 0x3E423E, 0x3E423E, 0x3A423A, 0x393E39, 0x3A423A, 0x3E3E3E, 0x393E39, 0x3A3A3A, 0x363A36, 0x2E322E, 0x323232, 0x343A3F, 0x3C434A, 0x2E2E2E, 0x2A2A2A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x434D52, 0x637686, 0x4A5258, 0x606260, 0x222222, 0x222622, 0x222222, 0x2E2E2E, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x1E1E1E, 0x262626, 0x5A6672, 0x313237, 0x3C434A, 0x637686, 0x4E5E66, 0x4C6275, 0x6A7A89, 0x625A42, 0x3A3A2A, 0x222222, 0x2E322E, 0x363A36, 0x393E39, 0x3E3E3E, 0x3E3E3E, 0x393E39, 0x393E39, 0x3A3A3A, 0x363A36, 0x2E322E, 0x323226, 0x46381E, 0x2A2E2A, 0x2E322E, 0x363636, 0x3E3E3E, 0x3E3E3E, 0x323232, 0x313237, 0x2E2E2E, 0x2A2A2A, 0x2E2E2E, 0x2E2E2E, 0x2E322E, 0x2E2E2E, 0x2E2E2E, 0x3A3A3A, 0x313237, 0x6A6A6A, 0x3A3A3A, 0x222222, 0x222222, 0x323232, 0x3C434A, 0x3C434A, 0x5B6E7E, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x343A3F, 0x4E677B, 0x637686, 0x545A52, 0x586A79, 0x666A65, 0x5A3A02, 0x5A3A02, 0x1F221E, 0x2A2E2A, 0x363A36, 0x363A36, 0x363A36, 0x2E322E, 0x322E26, 0x3A321A, 0x48340A, 0x5A400C, 0x694602, 0x7C5202, 0x875A02, 0x514126, 0x363636, 0x363A36, 0x363A36, 0x4A5258, 0x394650, 0x465E6E, 0x51626D, 0x2A2A2A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x6B6E6C, 0x5A5A5A, 0x1E1E1E, 0x222222, 0x262626, 0x607183, 0x435E72, 0x5A6672, 0x2A2A2A, 0x222222, 0x1E1E1E, 0x394650, 0x6A7A89, 0x63727E, 0x564A2A, 0x5B6E7E, 0x666A65, 0x5A3A02, 0x5E3E02, 0x48340A, 0x3B2E11, 0x3B2E11, 0x48340A, 0x48340A, 0x5A3A02, 0x5E3E02, 0x5A3A02, 0x694602, 0x694602, 0x6F4A02, 0x754E02, 0x875A02, 0x875A02, 0x313632, 0x363636, 0x363636, 0x363A36, 0x526F86, 0x4E677B, 0x4F5E6C, 0x363636, 0x2A2A2A, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E322E, 0x323232, 0x667072, 0x6B6E6C, 0x2A2A2A, 0x1E1E1E, 0x262626, 0x262626, 0x1E1E1E, 0x1E1E1E, 0x262626, 0x222222, 0x1E1E1E, 0x222222, 0x454E57, 0x322E26, 0x524A36, 0x5B6E7E, 0x6A665A, 0x5A3A02, 0x5E3E02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5E3E02, 0x644202, 0x694602, 0x7C5202, 0x825602, 0x8F5F02, 0x5E461C, 0x363636, 0x2A353B, 0x363636, 0x3A3A3A, 0x363636, 0x323232, 0x363636, 0x2E2E2E, 0x2A2A2A, 0x323232, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x747272, 0x6B6E6C, 0x4D4E4E, 0x222222, 0x1E1E1E, 0x222222, 0x43525E, 0x2A353B, 0x607183, 0x2E2E2E, 0x1E1E1E, 0x1E1E1E, 0x1F221E, 0x2E3E46, 0x6A767E, 0x5B6E7E, 0x625A42, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5E3E02, 0x5E3E02, 0x5E3E02, 0x644202, 0x6F4A02, 0x754E02, 0x7C5202, 0x875A02, 0x8F5F02, 0x323232, 0x313632, 0x363636, 0x363636, 0x454E57, 0x3C434A, 0x40586A, 0x485966, 0x2A2A2A, 0x2A2A2A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x747272, 0x6B6E6C, 0x606260, 0x222222, 0x222222, 0x222222, 0x51626D, 0x4C6275, 0x40586A, 0x363E46, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x2A353B, 0x5B778D, 0x637686, 0x5A400C, 0x5A3A02, 0x5A3A02, 0x5E3E02, 0x5E3E02, 0x5E3E02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5E3E02, 0x5E3E02, 0x6F4A02, 0x7C5202, 0x825602, 0x875A02, 0x926208, 0xAA6E02, 0x514126, 0x363636, 0x363636, 0x363636, 0x343A3F, 0x526F86, 0x4E677B, 0x485966, 0x363636, 0x2A2A2A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x667072, 0x667072, 0x6A6A6A, 0x2E2E2E, 0x1E1E1E, 0x262626, 0x2A2A2A, 0x222222, 0x1E1E1E, 0x222222, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x1F221E, 0x394650, 0x5A4212, 0x5A3A02, 0x5E3E02, 0x5E3E02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x644202, 0x694602, 0x694602, 0x6F4A02, 0x754E02, 0x7C5202, 0x825602, 0x8F5F02, 0x875A02, 0x926208, 0x9A6814, 0xAA6E02, 0x624A1C, 0x313632, 0x3A3A3A, 0x3A3A3A, 0x3A3A3A, 0x393E42, 0x3A3A3A, 0x363636, 0x363636, 0x323232, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0x6B6E6C, 0x6B6E6C, 0x646665, 0x313237, 0x1E1E1E, 0x222222, 0x222222, 0x454E57, 0x313237, 0x40586A, 0x454E57, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x48340A, 0x5A3A02, 0x5A3A02, 0x5E3E02, 0x644202, 0x6F4A02, 0x6F4A02, 0x754E02, 0x7C5202, 0x825602, 0x7C5202, 0x825602, 0x855908, 0x966822, 0xA77F49, 0xBE966A, 0xBE925E, 0xA2701A, 0x9E6702, 0x564629, 0x3A3A3A, 0x3A3A3A, 0x3A3A3A, 0x3A3A3A, 0x3A3A3A, 0x43525E, 0x3C434A, 0x40586A, 0x4C5862, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x6A6A6A, 0x646665, 0x646665, 0x363A36, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x494A4A, 0x586A79, 0x4C6275, 0x4A565E, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x1F221E, 0x5A3A02, 0x644202, 0x6F4A02, 0x754E02, 0x7C5202, 0x825602, 0x825602, 0x8A5E12, 0x926A2A, 0x9E7642, 0xA77F49, 0xA77F49, 0xA67A36, 0xA2701A, 0x926208, 0x9E6702, 0x8F5F02, 0x6E521A, 0x3E3E3E, 0x343A3F, 0x3E3E3E, 0x3E3E3E, 0x3E3E3E, 0x343A3F, 0x464646, 0x5B778D, 0x4E677B, 0x4C6275, 0x3A3A3A, 0x323232, 0x2E2E2E, 0x323232, 0x6A6A6A, 0x606260, 0x6A5E62, 0x3E3E3E, 0x1E1E1E, 0x222222, 0x1E1E1E, 0x2A2A2A, 0x313237, 0x222222, 0x1E1E1E, 0x222222, 0x222222, 0x222622, 0x262626, 0x222622, 0x3B2E11, 0x5E3E02, 0x6F4A02, 0x7C5202, 0x825602, 0x855908, 0x92621A, 0x966822, 0x9A6814, 0x8F5F02, 0x8F5F02, 0x875A02, 0x875A02, 0x8F5F02, 0x825602, 0x6E521A, 0x464236, 0x3E3E3E, 0x3E423E, 0x424242, 0x424242, 0x3E3E3E, 0x3E423E, 0x393E42, 0x393E42, 0x394650, 0x424242, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x323232, 0x2E2E2E, 0x6A5E62, 0x5E5E5E, 0x5E5E5E, 0x424242, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x222222, 0x313237, 0x2A353B, 0x343A3F, 0x465E6E, 0x2A2A2A, 0x2A2A2A, 0x2A2A2A, 0x2A2A2A, 0x2A2A2A, 0x3B2E11, 0x5A3A02, 0x694602, 0x754E02, 0x825602, 0x825602, 0x875A02, 0x825602, 0x825602, 0x725212, 0x624A1C, 0x564629, 0x464236, 0x424242, 0x3E3E3E, 0x424242, 0x424242, 0x424242, 0x464646, 0x464646, 0x464646, 0x464646, 0x464646, 0x464646, 0x3E423E, 0x454E57, 0x3C434A, 0x3E5262, 0x4F5E6C, 0x3A3A3A, 0x363636, 0x5E5E5E, 0x5E5E5E, 0x5E5E5E, 0x494A4A, 0x222222, 0x222222, 0x262626, 0x262626, 0x2A353B, 0x5B778D, 0x435E72, 0x4E677B, 0x2A353B, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E322E, 0x323232, 0x3A362F, 0x46381E, 0x5A4212, 0x5E461C, 0x5E461C, 0x564629, 0x393E39, 0x3A3A3A, 0x3E3E3E, 0x393E42, 0x393E42, 0x3E3E3E, 0x424242, 0x424242, 0x424242, 0x464646, 0x464646, 0x464646, 0x4D4E4E, 0x5A5A5A, 0x727672, 0x959698, 0x7C7E7C, 0x3E3E3E, 0x434D52, 0x567A9A, 0x4C6275, 0x4E677B, 0x494A4A, 0x3E3E3E, 0x5A5A5A, 0x585E58, 0x5E5E5E, 0x4D4E4E, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x2A2A2A, 0x2A2A2A, 0x454E57, 0x363E46, 0x363636, 0x323232, 0x323232, 0x313237, 0x363636, 0x363636, 0x363A36, 0x363A36, 0x393E39, 0x3E3E3E, 0x393E39, 0x3E3E3E, 0x393E42, 0x3E423E, 0x424242, 0x424242, 0x424242, 0x424242, 0x464646, 0x464646, 0x494A4A, 0x525252, 0x646665, 0x828582, 0xAAAAAA, 0xBABABA, 0xBABABA, 0xA1A2A4, 0x7C7E7C, 0x393E42, 0x3A3A3A, 0x424242, 0x4E5E66, 0x46565E, 0x464646, 0x464646, 0x464646, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x4A5258, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x2A2A2A, 0x2A2A2A, 0x363636, 0x343A3F, 0x363636, 0x4A5258, 0x424242, 0x2A353B, 0x3A3A3A, 0x3A3A3A, 0x343A3F, 0x3E3E3E, 0x3E3E3E, 0x424242, 0x3E3E3E, 0x424242, 0x424242, 0x424242, 0x424642, 0x464646, 0x4D4E4E, 0x545656, 0x747272, 0x929292, 0xAEAEAE, 0xB6B6B6, 0xAAAAAA, 0x888988, 0x6A6A6A, 0x4D4E4E, 0x464646, 0x424242, 0x3E3E3E, 0x262626, 0x363636, 0x424242, 0x494A4A, 0x747272, 0x959698, 0xBFBFBF, 0x999B9A, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x545656, 0x222222, 0x222222, 0x1E1E1E, 0x2A2A2A, 0x323232, 0x2A353B, 0x5B778D, 0x40586A, 0x4C6275, 0x485966, 0x3E423E, 0x3E3E3E, 0x424242, 0x3E423E, 0x393E42, 0x424242, 0x424242, 0x464646, 0x464646, 0x4D4E4E, 0x606260, 0x7C7E7C, 0x999B9A, 0xAAAAAA, 0xAAAAAA, 0x929292, 0x747272, 0x5A5A5A, 0x494A4A, 0x464646, 0x424242, 0x424242, 0x424242, 0x3E3E3E, 0x3E3E3E, 0x2E2E2E, 0x222222, 0x2E2E2E, 0x3A3A3A, 0x4D4E4E, 0xAEAEAE, 0x888988, 0x646665, 0x4D4E4E, 0x5A5A5A, 0x5A5A5A, 0x5E5E5E, 0x5A5A5A, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x262626, 0x2E322E, 0x363636, 0x40586A, 0x5B778D, 0x485966, 0x454E57, 0x424242, 0x424242, 0x424242, 0x424642, 0x494A4A, 0x545656, 0x6A6A6A, 0x828582, 0x999B9A, 0xA1A2A4, 0x959698, 0x777A76, 0x606260, 0x4D4E4E, 0x464646, 0x424642, 0x424242, 0x424242, 0x3E3E3E, 0x3E3E3E, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x323232, 0x222222, 0x222222, 0x2A2A2A, 0x3A3A3A, 0x393E42, 0x464646, 0x424242, 0x424242, 0x424242, 0x5A5A5A, 0x5E5E5E, 0x585E58, 0x5E5E5E, 0x222222, 0x222222, 0x1E1E1E, 0x222222, 0x2E2E2E, 0x3A3A3A, 0x3E423E, 0x393E42, 0x424242, 0x424242, 0x4D4E4E, 0x464646, 0x646665, 0x888988, 0x959698, 0x929292, 0x7E827E, 0x6A6A6A, 0x525252, 0x464646, 0x424242, 0x424242, 0x424242, 0x424242, 0x3E3E3E, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x2A2A2A, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x2E2E2E, 0x363A36, 0x3E3E3E, 0x343A3F, 0x3A3A3A, 0x363636, 0x5A5A5A, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x262626, 0x1E1E1E, 0x222222, 0x1E1E1E, 0x2E2E2E, 0x363636, 0x424242, 0x485966, 0x4F5E6C, 0x454E57, 0x607183, 0x494A4A, 0x4D4E4E, 0x5A5A5A, 0x4D4E4E, 0x464646, 0x424242, 0x464646, 0x424242, 0x424242, 0x3E3E3E, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x2E2E2E, 0x262626, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x2E2E2E, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x5A5A5A, 0x5E5E5E, 0x5A5A5A, 0x5A5A5A, 0x2A2A2A, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x262626, 0x363636, 0x3E3E3E, 0x454E57, 0x628EAA, 0x4E677B, 0x5B6E7E, 0x43525E, 0x494A4A, 0x464646, 0x3E3E3E, 0x3E3E3E, 0x3E3E3E, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x323232, 0x2E2E2E, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x262626, 0x323232, 0x363636, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x5E5E5E, 0x323232, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x323232, 0x393E39, 0x424242, 0x4C6275, 0x43525E, 0x494A4A, 0x494A4A, 0x4D4E4E, 0x494A4A, 0x3E3E3E, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x2E322E, 0x2A2A2A, 0x222222, 0x222222, 0x222222, 0x1E1E1E, 0x262626, 0x2E322E, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x5A5A5A, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x363636, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x2A2A2A, 0x3A3A3A, 0x424242, 0x494A4A, 0x585E58, 0x727672, 0x888988, 0xAEAEAE, 0x4D4E4E, 0x464646, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x313237, 0x2E2E2E, 0x262626, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x262626, 0x323232, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x5A5A5A, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x3E3E3E, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x1E1E1E, 0x222222, 0x3A3A3A, 0x424242, 0x5A5A5A, 0x7C7E7C, 0x646665, 0x545656, 0x4D4E4E, 0x464646, 0x424242, 0x363636, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x3A362F, 0x313237, 0x2E2E2E, 0x262626, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x1E1E1E, 0x262626, 0x323232, 0x363636, 0x363636, 0x3A3A3A, 0x3A3A3A, 0x5A5A5A, 0x5E5E5E, 0x5A5A5A, 0x5A5A5A, 0x464646, 0x222222, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x323232, 0x3E3E3E, 0x424242, 0x3C434A, 0x424242, 0x424242, 0x424242, 0x424242, 0x3E3E3E, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x313237, 0x323232, 0x2E2E2E, 0x262626, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x2A2A2A, 0x323232, 0x3A3A3A, 0x363636, 0x363636, 0x3A3A3A }; static Uint8 cciconmask[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; #if 0 /* tworld.ico:#2 */ #define CXCCICON 32 #define CYCCICON 32 static Uint32 cciconimage[] = { 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0x6E6E6E, 0x9E9E9E, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0x9A9A9A, 0x2E2E2E, 0x323232, 0x3A3A3A, 0x4A4A4A, 0x565656, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0x929292, 0x7E7E7E, 0xA9AAAA, 0xAEAEAE, 0xAEAEAE, 0xA9AAAA, 0xA9AAAA, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0x9E9E9E, 0x323232, 0x2E2E2E, 0x323232, 0x3E3E3E, 0x4E4E4E, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xA6A6A6, 0x9A9A9A, 0x8E928E, 0x565A56, 0x626662, 0x5A625A, 0x4E524E, 0x424A42, 0x4E524E, 0x929692, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0x8D8E8D, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x323232, 0x424242, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xA6A6A6, 0x8A8A8A, 0x767A76, 0x666A66, 0x565A56, 0x4A4E4A, 0x424A42, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x4A4E4A, 0x8A8A8A, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0x8D8E8D, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0x424642, 0x424642, 0x4A4E4A, 0x4A4E4A, 0x424642, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x5E625E, 0x5A625A, 0x464E46, 0x4A4E4A, 0x4A4E4A, 0x7A8286, 0xCECED2, 0xDEDEDE, 0xE2E2E2, 0xDEDEDE, 0x9E9E9E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0x9EA2AA, 0x262E30, 0x323632, 0x3E463E, 0x464E46, 0x464E46, 0x464A46, 0x4A524A, 0x7E827E, 0x7E827E, 0x5E625E, 0x464A46, 0x5E625E, 0x4E564E, 0x5A5E5A, 0x5E5E5E, 0x464A46, 0x424A42, 0x464E46, 0x6E7A7E, 0xB2B2B2, 0xAEAEAE, 0xAEAEAE, 0x7A7A7A, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0xB2B2B2, 0xAEAEAE, 0x828E96, 0x72828F, 0x3A4246, 0x222622, 0x363A36, 0x424A42, 0x464E46, 0x464A46, 0x464A46, 0x525652, 0x767A76, 0x6A6E6A, 0x626662, 0x525652, 0x767A76, 0x666A66, 0x6A6E6A, 0x4E524E, 0x464A46, 0x464A46, 0x424A42, 0x66767A, 0xA9AAAA, 0xB2B2B2, 0x727272, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xAEAEAE, 0xB2B2B2, 0x7A8692, 0x8E969E, 0x6E7E8E, 0x3A4E5A, 0x222622, 0x3A3E3A, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x4A524A, 0x6E726E, 0x858685, 0x6A6E6A, 0x4E564E, 0x5E665E, 0x464A46, 0x565E56, 0x525A52, 0x464E46, 0x464E46, 0x4A4E4A, 0x626A6E, 0xAAAAAE, 0x6A6A6A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0xCACACA, 0xD6D6CA, 0x7E8A96, 0x72828F, 0x869276, 0x6A7256, 0x2E363A, 0x262A26, 0x3E3E3E, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x626662, 0x666A66, 0x666A66, 0x4E524E, 0x4A524A, 0x727672, 0x565A56, 0x5A5E5A, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x566264, 0x5E5E5E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xDED24A, 0xB6AE5A, 0x6E7E88, 0x727672, 0x7E7666, 0x72828F, 0x526272, 0x1E221E, 0x2E322E, 0x3E423E, 0x464E46, 0x464A46, 0x464E46, 0x424A42, 0x666A66, 0x464E46, 0x565E56, 0x666A66, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x4A5658, 0x3A3A3A, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0xBE2202, 0x9E261E, 0x865252, 0x6E626E, 0x6E727E, 0x8E928E, 0x8A968E, 0x586A7A, 0x292A2A, 0x2E3232, 0x424642, 0x424A42, 0x464E46, 0x464A46, 0x4A4E4A, 0x767A76, 0x6E726E, 0x626662, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x353A3E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xCAC27E, 0xDEDA72, 0xBEBA5E, 0x6E7A7E, 0x8E865A, 0x6E7E7A, 0x5E7282, 0x764652, 0x303236, 0x222626, 0x323632, 0x424642, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x4A5658, 0x3A3E3E, 0x2E2E2E, 0x323232, 0xDE8A02, 0xD64E02, 0xC62E02, 0xA61A12, 0x666676, 0x627682, 0x6E7E88, 0x7E6E72, 0x6E8696, 0x324652, 0x222622, 0x363A36, 0x424642, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x4A4E4A, 0x525652, 0x626662, 0x6A6E6A, 0x666A66, 0x566264, 0x3A464A, 0x2E2E2E, 0xDE8A02, 0xBE0602, 0x8A423E, 0xCECA9E, 0x86925E, 0x9A9E56, 0x7A8276, 0x5A6A76, 0x966A5A, 0x665A3A, 0x2E3A42, 0x262A26, 0x3A3E3A, 0x424A42, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x4E564E, 0x5E665E, 0x6A6E6A, 0x6E726E, 0x6E726E, 0x6A6E6A, 0x5E625E, 0x4E524E, 0x424A42, 0x3E463E, 0x484E54, 0x637686, 0x3C3E42, 0xDEB602, 0xC62E02, 0x8A0A0A, 0xCECA9E, 0xD6D232, 0x6E727E, 0x7E5A62, 0x5C6E7E, 0x823A42, 0x6E7E8E, 0x546A7E, 0x262A26, 0x2A2E2A, 0x3E463E, 0x565E56, 0x6E726E, 0x767A76, 0x767A76, 0x727672, 0x6A6E6A, 0x565E56, 0x464E46, 0x424A42, 0x3E463E, 0x3E423E, 0x3A423A, 0x3A3E3A, 0x3A3E3A, 0x3A423A, 0x48525A, 0x586A7A, 0x3C3E42, 0xCEC21E, 0x864A0E, 0x4E262A, 0x2E363A, 0x2A3236, 0x4E4A36, 0xAE4622, 0x5C6E7E, 0x625A62, 0x6A7272, 0x766A2E, 0x4A5A66, 0x262E30, 0x363A36, 0x525652, 0x4A524A, 0x424A42, 0x3E463E, 0x3E423E, 0x3A423A, 0x3A423A, 0x3A3E3A, 0x3A3E3A, 0x3A3E3A, 0x3A423A, 0x3A3E3A, 0x363A36, 0x323632, 0x2E322E, 0x3A3A3A, 0x5C6E7E, 0x3A3E3E, 0x625E46, 0x222226, 0x323E46, 0x44525E, 0x353A3E, 0x1E1E1E, 0x565A56, 0x5A6A76, 0x44525E, 0x526272, 0x5E7282, 0x72828F, 0x424E5A, 0x2A2E2A, 0x3A3E3A, 0x3A3E3A, 0x3E3E3E, 0x3E3E3E, 0x423E3A, 0x3A3E3A, 0x3A3E3A, 0x323632, 0x323632, 0x323636, 0x3A4246, 0x323632, 0x292A2A, 0x2E2E2E, 0x2E2E32, 0x2E322E, 0x464A52, 0x4E5A62, 0x5E625E, 0x1E1E1E, 0x222226, 0x303236, 0x324652, 0x262E30, 0x222226, 0x262E30, 0x526272, 0x6A6E6A, 0x5E7282, 0x5E4A22, 0x3E2E0E, 0x262A26, 0x363A36, 0x363A36, 0x323632, 0x363626, 0x42361A, 0x523E0E, 0x6D4602, 0x56421E, 0x363636, 0x363636, 0x3A464A, 0x3D464E, 0x36424A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x6E6E6E, 0x323232, 0x222226, 0x464A52, 0x3E4A56, 0x2E3232, 0x1E1E1E, 0x2E2E32, 0x5C6E7E, 0x525242, 0x5E7282, 0x5D3E02, 0x5A3A02, 0x48320C, 0x4C3606, 0x4C3606, 0x5A3A02, 0x5D3E02, 0x664202, 0x704A02, 0x825602, 0x885A02, 0x423A2E, 0x32363A, 0x414246, 0x525E6A, 0x42464E, 0x2A2E2A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x727272, 0x4E524E, 0x1E221E, 0x222622, 0x2E3A42, 0x44525E, 0x26262A, 0x1E1E1E, 0x1E1E1E, 0x525E66, 0x637686, 0x5A3A02, 0x5A3A02, 0x5D3E02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5D3E02, 0x6D4602, 0x784E02, 0x885A02, 0x6C4E16, 0x323632, 0x3A3A3A, 0x3A4246, 0x323E46, 0x424E5A, 0x292A2A, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x727272, 0x6A6A6A, 0x222222, 0x222222, 0x424E5A, 0x3E4652, 0x262E30, 0x1E1E1E, 0x1E1E1E, 0x526272, 0x625E46, 0x5D3E02, 0x5A3A02, 0x5A3A02, 0x5D3E02, 0x5D3E02, 0x5D3E02, 0x664202, 0x6D4602, 0x7C5202, 0x885A02, 0x966202, 0x9A6606, 0x303236, 0x32363A, 0x3A3A3A, 0x495E6E, 0x44525E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x6E6E6E, 0x666666, 0x2A2A2E, 0x1E221E, 0x262A26, 0x2A3236, 0x44525E, 0x222226, 0x1E221E, 0x1E221E, 0x48320C, 0x5A3A02, 0x5D3E02, 0x664202, 0x6D4602, 0x784E02, 0x7C5202, 0x7C5202, 0x865A0A, 0xA2722A, 0xAE8246, 0xAA762A, 0x9A6606, 0x363A36, 0x3A3A3A, 0x3A3A3A, 0x3A3A3A, 0x36424A, 0x465662, 0x323232, 0x2E2E2E, 0x323232, 0x6A6A6A, 0x626662, 0x303236, 0x1E1E1E, 0x222222, 0x525E6A, 0x484E54, 0x26262A, 0x1E1E1E, 0x1E221E, 0x2E261A, 0x5D3E02, 0x784E02, 0x7C5202, 0x7E560A, 0x8E621E, 0x9A6E32, 0x9E7232, 0xA2722A, 0x9A6A16, 0x966202, 0x865A0A, 0x52462E, 0x423E3A, 0x3E3E3E, 0x3E3E3E, 0x3E3E3E, 0x495E6E, 0x4A5A66, 0x3E464A, 0x2E2E2E, 0x2E2E2E, 0x626262, 0x5E5E5E, 0x323232, 0x1E1E1E, 0x222222, 0x2A2A2E, 0x2A2A2E, 0x3D464E, 0x26262A, 0x292A2A, 0x292A2A, 0x48320C, 0x664202, 0x7C5202, 0x885A02, 0x885A02, 0x885A02, 0x7E560A, 0x6C4E16, 0x5E4A22, 0x4E4636, 0x3E423E, 0x424242, 0x414246, 0x464646, 0x424242, 0x424242, 0x424242, 0x424A52, 0x36424A, 0x4A4A4E, 0x363636, 0x5A5A5A, 0x5E5E5E, 0x3E3E3E, 0x1E1E1E, 0x222622, 0x2E2E32, 0x506A82, 0x4A5A66, 0x2A3236, 0x2E2E2E, 0x2E3232, 0x2E3232, 0x363626, 0x4A3E26, 0x524226, 0x4E422E, 0x423E3A, 0x3A3E3E, 0x3C3E42, 0x3E3E3E, 0x414246, 0x464646, 0x4A4A4A, 0x525252, 0x727272, 0x929692, 0x9A9A9A, 0x3C3E42, 0x4A5A66, 0x506A82, 0x4A5A66, 0x424242, 0x5E5E5E, 0x5E5E5E, 0x3E3E3E, 0x1E221E, 0x262626, 0x292A2A, 0x2E3232, 0x323232, 0x36424A, 0x363A36, 0x3A3A3A, 0x3A3A3A, 0x3A3E3E, 0x3A3E3E, 0x3E423E, 0x3E423E, 0x424242, 0x464646, 0x4A4A4A, 0x5E5E5E, 0x7E7E7E, 0x929292, 0x9A9A9A, 0x929292, 0x727272, 0x525252, 0x353A3E, 0x323632, 0x424242, 0x5A5E5A, 0x828282, 0x858685, 0x5A5A5A, 0x5E5E5E, 0x44464A, 0x1E1E1E, 0x222222, 0x2E322E, 0x414246, 0x52728A, 0x4E667A, 0x414246, 0x424242, 0x424242, 0x424242, 0x414246, 0x4A5252, 0x666A66, 0x828282, 0x8E928E, 0x929292, 0x7A7A7A, 0x5E5E5E, 0x4A4A4A, 0x424242, 0x424242, 0x3E3E3E, 0x3A3A3A, 0x262626, 0x292A2A, 0x3E3E3E, 0x7A7A7A, 0x6E6E6E, 0x4E4E4E, 0x5A5A5A, 0x625A62, 0x4A4A4A, 0x1E1E1E, 0x1E221E, 0x2A2A2E, 0x3A3A3A, 0x484E54, 0x414246, 0x464646, 0x44464A, 0x6E6E6E, 0x7E7E7E, 0x858685, 0x7E7E7E, 0x666666, 0x4E4E4E, 0x414246, 0x3E3E3E, 0x3E423E, 0x3E3E3E, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x32363A, 0x2E322E, 0x1E1E1E, 0x222222, 0x303236, 0x3A3A3A, 0x3E3E3E, 0x3A3A3A, 0x5A5E5A, 0x5A5E5A, 0x525252, 0x1E1E1E, 0x1E221E, 0x262626, 0x3A3A3A, 0x48525A, 0x4E667A, 0x586A7A, 0x4A4A4E, 0x525252, 0x464646, 0x424242, 0x424242, 0x3E3E3E, 0x423E3A, 0x3A3A3A, 0x32363A, 0x363636, 0x363636, 0x363636, 0x32363A, 0x363636, 0x323232, 0x26262A, 0x1E1E1E, 0x1E1E1E, 0x292A2A, 0x303236, 0x3A3A3A, 0x363636, 0x5A5A5A, 0x625A62, 0x525252, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x323632, 0x424242, 0x546A7E, 0x4A5658, 0x484E54, 0x4A4A4E, 0x3E3E3E, 0x32363A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x32363A, 0x363A36, 0x363636, 0x363A36, 0x363636, 0x323232, 0x222222, 0x1E221E, 0x1E1E1E, 0x262626, 0x323632, 0x363636, 0x3A3A3A, 0x5A5A5A, 0x5E5E5E, 0x5A5A5A, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x2E2E2E, 0x424242, 0x5E5E5E, 0x767A76, 0x8A8A8A, 0x5A5E5A, 0x3E423E, 0x32363A, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x363636, 0x363A36, 0x32363A, 0x3A3A3A, 0x363636, 0x363A36, 0x323232, 0x2E2E2E, 0x222222, 0x1E221E, 0x222222, 0x292A2A, 0x363636, 0x363636, 0x3A3A3A, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x222226, 0x1E1E1E, 0x1E1E1E, 0x262626, 0x3A3A3A, 0x4A4A4A, 0x464646, 0x424242, 0x414246, 0x353A3E, 0x363636, 0x363636, 0x32363A, 0x363636, 0x363A36, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x303236, 0x2A2E2A, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x2A2A2E, 0x363636, 0x363636, 0x363636 }; static Uint8 cciconmask[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; #endif tworld-1.3.0/oshw-sdl/sdlerr.c0000644000175000017500000000341510362156174016373 0ustar breadboxbreadbox/* sdlerr.c: Notification functionality, not supplied by the SDL library. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include "sdlgen.h" #ifdef WIN32 /* * Windows version */ #include "windows.h" /* Ring the bell already. */ void ding(void) { MessageBeep(0); } /* Display a message box. If action is NOTIFY_LOG, the text of the * message is written to stderr instead. */ void usermessage(int action, char const *prefix, char const *cfile, unsigned long lineno, char const *fmt, va_list args) { static char errbuf[4096]; char *p; p = errbuf; if (prefix) p += sprintf(p, "%s: ", prefix); if (fmt) p += vsprintf(p, fmt, args); if (cfile) p += sprintf(p, " [%s:%lu]", cfile, lineno); switch (action) { case NOTIFY_DIE: MessageBox(NULL, errbuf, "Tile World", MB_ICONSTOP | MB_OK); break; case NOTIFY_ERR: MessageBox(NULL, errbuf, "Tile World", MB_ICONEXCLAMATION | MB_OK); break; case NOTIFY_LOG: fputs(errbuf, stderr); fputc('\n', stderr); fflush(stderr); break; } } #else /* * Unix version */ /* Ring the bell already. */ void ding(void) { fputc('\a', stderr); fflush(stderr); } /* Display a formatted message on stderr. */ void usermessage(int action, char const *prefix, char const *cfile, unsigned long lineno, char const *fmt, va_list args) { fprintf(stderr, "%s: ", action == NOTIFY_DIE ? "FATAL" : action == NOTIFY_ERR ? "error" : "warning"); if (cfile) fprintf(stderr, "[%s:%lu] ", cfile, lineno); if (prefix) fprintf(stderr, "%s: ", prefix); if (fmt) vfprintf(stderr, fmt, args); fputc('\n', stderr); fflush(stderr); } #endif tworld-1.3.0/oshw-sdl/sdlgen.h0000644000175000017500000001551610402016047016353 0ustar breadboxbreadbox/* sdlgen.h: The internal shared definitions of the SDL OS/hardware layer. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef _sdlgen_h_ #define _sdlgen_h_ #include "SDL.h" #include "../gen.h" #include "../oshw.h" /* Structure to hold the definition of a font. */ typedef struct fontinfo { signed char h; /* height of each character */ signed char w[256]; /* width of each character */ void *memory; /* memory allocated for the font */ unsigned char *bits[256]; /* pointers to each glyph */ } fontinfo; /* Structure to hold a font's colors. */ typedef struct fontcolors { Uint32 c[3]; } fontcolors; #define bkgndcolor(fc) ((fc).c[0]) /* the background color */ #define halfcolor(fc) ((fc).c[1]) /* the antialiasing color */ #define textcolor(fc) ((fc).c[2]) /* the main color of the glyphs */ /* Flags to the puttext function. */ #define PT_CENTER 0x0001 /* center the text horizontally */ #define PT_RIGHT 0x0002 /* right-align the text */ #define PT_MULTILINE 0x0004 /* span lines & break at whitespace */ #define PT_UPDATERECT 0x0008 /* return the unused area in rect */ #define PT_CALCSIZE 0x0010 /* determine area needed for text */ #define PT_DIM 0x0020 /* draw using the dim text color */ #define PT_HILIGHT 0x0040 /* draw using the bold text color */ /* * Values global to this module. All the globals are placed in here, * in order to minimize pollution of the main module's namespace. */ typedef struct oshwglobals { /* * Shared variables. */ short wtile; /* width of one tile in pixels */ short htile; /* height of one tile in pixels */ short cptile; /* size of one tile in pixels */ fontcolors textclr; /* color triplet for normal text */ fontcolors dimtextclr; /* color triplet for dim text */ fontcolors hilightclr; /* color triplet for bold text */ SDL_Surface *screen; /* the display */ fontinfo font; /* the font */ /* * Shared functions. */ /* Process all pending events. If wait is TRUE and no events are * currently pending, the function blocks until an event arrives. */ void (*eventupdatefunc)(int wait); /* A callback function, to be called every time a keyboard key is * pressed or released. scancode is an SDL key symbol. down is * TRUE if the key was pressed or FALSE if it was released. */ void (*keyeventcallbackfunc)(int scancode, int down); /* A callback function, to be called when a mouse button is * pressed or released. xpos and ypos give the mouse's location. * button is the number of the mouse button. down is TRUE if the * button was pressed or FALSE if it was released. */ void (*mouseeventcallbackfunc)(int xpos, int ypos, int button, int down); /* Given a pixel's coordinates, return an integer identifying the * tile on the map view display under that pixel, or -1 if the * pixel is not within the map view. */ int (*windowmapposfunc)(int x, int y); /* Return a pointer to an image of a cell with the two given * tiles. If the top image is transparent, the composite image is * created using the overlay buffer. (Thus the caller should be * done using the image returned before calling this function * again.) timerval should hold the time of the game, for * rendering animated cell tiles, or -1 if the game has not * started. */ SDL_Surface* (*getcellimagefunc)(SDL_Rect *rect, int top, int bot, int timerval); /* Return a pointer to a tile image for the given creature or * animation sequence with the specified direction, sub-position, * and animation frame. */ SDL_Surface* (*getcreatureimagefunc)(SDL_Rect *rect, int id, int dir, int moving, int frame); /* Display a line (or more) of text in the program's font. The * text is clipped to area if necessary. If area is taller than * the font, the topmost line is used. len specifies the number of * characters to render; -1 can be used if text is NUL-terminated. * flags is some combination of PT_* flags defined above. When the * PT_CALCSIZE flag is set, no drawing is done; instead the w and * h fields of area area changed to define the smallest rectangle * that encloses the text that would have been rendered. (If * PT_MULTILINE is also set, only the h field is changed.) If * PT_UPDATERECT is set instead, then the h field is changed, so * as to exclude the rectangle that was drawn in. */ void (*puttextfunc)(SDL_Rect *area, char const *text, int len, int flags); /* Determine the widths necessary to display the columns of the * given table. area specifies an enclosing rectangle for the * complete table. The return value is an array of rectangles, one * for each column of the table. The rectangles y-coordinates and * heights are taken from area, and the x-coordinates and widths * are calculated so as to best render the columns of the table in * the given space. The caller has the responsibility of freeing * the returned array. */ SDL_Rect *(*measuretablefunc)(SDL_Rect const *area, tablespec const *table); /* Draw a single row of the given table. cols is an array of * rectangles, one for each column. Each rectangle is altered by * the function as per puttext's PT_UPDATERECT behavior. row * points to an integer indicating the first table entry of the * row to display; upon return, this value is updated to point to * the first entry following the row. flags can be set to PT_DIM * and/or PT_HIGHLIGHT; the values will be applied to every entry * in the row. */ int (*drawtablerowfunc)(tablespec const *table, SDL_Rect *cols, int *row, int flags); } oshwglobals; /* oshw's structure of globals. */ extern oshwglobals sdlg; /* Some convenience macros for the above functions. */ #define eventupdate (*sdlg.eventupdatefunc) #define keyeventcallback (*sdlg.keyeventcallbackfunc) #define mouseeventcallback (*sdlg.mouseeventcallbackfunc) #define windowmappos (*sdlg.windowmapposfunc) #define puttext (*sdlg.puttextfunc) #define measuretable (*sdlg.measuretablefunc) #define drawtablerow (*sdlg.drawtablerowfunc) #define createscroll (*sdlg.createscrollfunc) #define scrollmove (*sdlg.scrollmovefunc) #define getcreatureimage (*sdlg.getcreatureimagefunc) #define getcellimage (*sdlg.getcellimagefunc) /* The initialization functions for the various modules. */ extern int _sdltimerinitialize(int showhistogram); extern int _sdlresourceinitialize(void); extern int _sdltextinitialize(void); extern int _sdltileinitialize(void); extern int _sdlinputinitialize(void); extern int _sdloutputinitialize(int fullscreen); extern int _sdlsfxinitialize(int silence, int soundbufsize); #endif tworld-1.3.0/oshw-sdl/sdlin.c0000644000175000017500000004607310420630306016205 0ustar breadboxbreadbox/* sdlin.c: Reading the keyboard. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include "SDL.h" #include "sdlgen.h" #include "../defs.h" /* Structure describing a mapping of a key event to a game command. */ typedef struct keycmdmap { int scancode; /* the key's scan code */ int shift; /* the shift key's state */ int ctl; /* the ctrl key's state */ int alt; /* the alt keys' state */ int cmd; /* the command */ int hold; /* TRUE for repeating joystick-mode keys */ } keycmdmap; /* Structure describing mouse activity. */ typedef struct mouseaction { int state; /* state of mouse action (KS_*) */ int x, y; /* position of the mouse */ int button; /* which button generated the event */ } mouseaction; /* The possible states of keys. */ enum { KS_OFF = 0, /* key is not currently pressed */ KS_ON = 1, /* key is down (shift-type keys only) */ KS_DOWN, /* key is being held down */ KS_STRUCK, /* key was pressed and released in one tick */ KS_PRESSED, /* key was pressed in this tick */ KS_DOWNBUTOFF1, /* key has been down since the previous tick */ KS_DOWNBUTOFF2, /* key has been down since two ticks ago */ KS_DOWNBUTOFF3, /* key has been down since three ticks ago */ KS_REPEATING, /* key is down and is now repeating */ KS_count }; /* The complete array of key states. */ static char keystates[SDLK_LAST]; /* The last mouse action. */ static mouseaction mouseinfo; /* TRUE if direction keys are to be treated as always repeating. */ static int joystickstyle = FALSE; /* The complete list of key commands recognized by the game while * playing. hold is TRUE for keys that are to be forced to repeat. * shift, ctl and alt are positive if the key must be down, zero if * the key must be up, or negative if it doesn't matter. */ static keycmdmap const gamekeycmds[] = { { SDLK_UP, 0, 0, 0, CmdNorth, TRUE }, { SDLK_LEFT, 0, 0, 0, CmdWest, TRUE }, { SDLK_DOWN, 0, 0, 0, CmdSouth, TRUE }, { SDLK_RIGHT, 0, 0, 0, CmdEast, TRUE }, { SDLK_KP8, 0, 0, 0, CmdNorth, TRUE }, { SDLK_KP4, 0, 0, 0, CmdWest, TRUE }, { SDLK_KP2, 0, 0, 0, CmdSouth, TRUE }, { SDLK_KP6, 0, 0, 0, CmdEast, TRUE }, { 'q', 0, 0, 0, CmdQuitLevel, FALSE }, { 'p', 0, +1, 0, CmdPrevLevel, FALSE }, { 'r', 0, +1, 0, CmdSameLevel, FALSE }, { 'n', 0, +1, 0, CmdNextLevel, FALSE }, { 'g', 0, -1, 0, CmdGotoLevel, FALSE }, { 'q', +1, 0, 0, CmdQuit, FALSE }, { SDLK_PAGEUP, -1, -1, 0, CmdPrev10, FALSE }, { 'p', 0, 0, 0, CmdPrev, FALSE }, { 'r', 0, 0, 0, CmdSame, FALSE }, { 'n', 0, 0, 0, CmdNext, FALSE }, { SDLK_PAGEDOWN, -1, -1, 0, CmdNext10, FALSE }, { '\b', -1, -1, 0, CmdPauseGame, FALSE }, { '?', -1, -1, 0, CmdHelp, FALSE }, { SDLK_F1, -1, -1, 0, CmdHelp, FALSE }, { 'o', 0, 0, 0, CmdStepping, FALSE }, { 'o', +1, 0, 0, CmdSubStepping, FALSE }, { '\t', 0, -1, 0, CmdPlayback, FALSE }, { '\t', +1, -1, 0, CmdCheckSolution, FALSE }, { 'x', 0, +1, 0, CmdReplSolution, FALSE }, { 'x', +1, +1, 0, CmdKillSolution, FALSE }, { 's', 0, 0, 0, CmdSeeScores, FALSE }, { 's', 0, +1, 0, CmdSeeSolutionFiles, FALSE }, { 'v', +1, 0, 0, CmdVolumeUp, FALSE }, { 'v', 0, 0, 0, CmdVolumeDown, FALSE }, { SDLK_RETURN, -1, -1, 0, CmdProceed, FALSE }, { SDLK_KP_ENTER, -1, -1, 0, CmdProceed, FALSE }, { ' ', -1, -1, 0, CmdProceed, FALSE }, { 'd', 0, 0, 0, CmdDebugCmd1, FALSE }, { 'd', +1, 0, 0, CmdDebugCmd2, FALSE }, { SDLK_UP, +1, 0, 0, CmdCheatNorth, TRUE }, { SDLK_LEFT, +1, 0, 0, CmdCheatWest, TRUE }, { SDLK_DOWN, +1, 0, 0, CmdCheatSouth, TRUE }, { SDLK_RIGHT, +1, 0, 0, CmdCheatEast, TRUE }, { SDLK_HOME, +1, 0, 0, CmdCheatHome, FALSE }, { SDLK_F2, 0, 0, 0, CmdCheatICChip, FALSE }, { SDLK_F3, 0, 0, 0, CmdCheatKeyRed, FALSE }, { SDLK_F4, 0, 0, 0, CmdCheatKeyBlue, FALSE }, { SDLK_F5, 0, 0, 0, CmdCheatKeyYellow, FALSE }, { SDLK_F6, 0, 0, 0, CmdCheatKeyGreen, FALSE }, { SDLK_F7, 0, 0, 0, CmdCheatBootsIce, FALSE }, { SDLK_F8, 0, 0, 0, CmdCheatBootsSlide, FALSE }, { SDLK_F9, 0, 0, 0, CmdCheatBootsFire, FALSE }, { SDLK_F10, 0, 0, 0, CmdCheatBootsWater, FALSE }, { '\003', -1, -1, 0, CmdQuit, FALSE }, { SDLK_F4, 0, 0, +1, CmdQuit, FALSE }, { 0, 0, 0, 0, 0, 0 } }; /* The list of key commands recognized when the program is obtaining * input from the user. */ static keycmdmap const inputkeycmds[] = { { SDLK_UP, -1, -1, 0, CmdNorth, FALSE }, { SDLK_LEFT, -1, -1, 0, CmdWest, FALSE }, { SDLK_DOWN, -1, -1, 0, CmdSouth, FALSE }, { SDLK_RIGHT, -1, -1, 0, CmdEast, FALSE }, { '\b', -1, -1, 0, CmdWest, FALSE }, { ' ', -1, -1, 0, CmdEast, FALSE }, { SDLK_RETURN, -1, -1, 0, CmdProceed, FALSE }, { SDLK_KP_ENTER, -1, -1, 0, CmdProceed, FALSE }, { SDLK_ESCAPE, -1, -1, 0, CmdQuitLevel, FALSE }, { 'a', -1, 0, 0, 'a', FALSE }, { 'b', -1, 0, 0, 'b', FALSE }, { 'c', -1, 0, 0, 'c', FALSE }, { 'd', -1, 0, 0, 'd', FALSE }, { 'e', -1, 0, 0, 'e', FALSE }, { 'f', -1, 0, 0, 'f', FALSE }, { 'g', -1, 0, 0, 'g', FALSE }, { 'h', -1, 0, 0, 'h', FALSE }, { 'i', -1, 0, 0, 'i', FALSE }, { 'j', -1, 0, 0, 'j', FALSE }, { 'k', -1, 0, 0, 'k', FALSE }, { 'l', -1, 0, 0, 'l', FALSE }, { 'm', -1, 0, 0, 'm', FALSE }, { 'n', -1, 0, 0, 'n', FALSE }, { 'o', -1, 0, 0, 'o', FALSE }, { 'p', -1, 0, 0, 'p', FALSE }, { 'q', -1, 0, 0, 'q', FALSE }, { 'r', -1, 0, 0, 'r', FALSE }, { 's', -1, 0, 0, 's', FALSE }, { 't', -1, 0, 0, 't', FALSE }, { 'u', -1, 0, 0, 'u', FALSE }, { 'v', -1, 0, 0, 'v', FALSE }, { 'w', -1, 0, 0, 'w', FALSE }, { 'x', -1, 0, 0, 'x', FALSE }, { 'y', -1, 0, 0, 'y', FALSE }, { 'z', -1, 0, 0, 'z', FALSE }, { '\003', -1, -1, 0, CmdQuit, FALSE }, { SDLK_F4, 0, 0, +1, CmdQuit, FALSE }, { 0, 0, 0, 0, 0, 0 } }; /* The current map of key commands. */ static keycmdmap const *keycmds = gamekeycmds; /* A map of keys that can be held down simultaneously to produce * multiple commands. */ static int mergeable[CmdKeyMoveLast + 1]; /* * Running the keyboard's state machine. */ /* This callback is called whenever the state of any keyboard key * changes. It records this change in the keystates array. The key can * be recorded as being struck, pressed, repeating, held down, or down * but ignored, as appropriate to when they were first pressed and the * current behavior settings. Shift-type keys are always either on or * off. */ static void _keyeventcallback(int scancode, int down) { switch (scancode) { case SDLK_LSHIFT: case SDLK_RSHIFT: case SDLK_LCTRL: case SDLK_RCTRL: case SDLK_LALT: case SDLK_RALT: case SDLK_LMETA: case SDLK_RMETA: case SDLK_NUMLOCK: case SDLK_CAPSLOCK: case SDLK_MODE: keystates[scancode] = down ? KS_ON : KS_OFF; break; default: if (scancode < SDLK_LAST) { if (down) { keystates[scancode] = keystates[scancode] == KS_OFF ? KS_PRESSED : KS_REPEATING; } else { keystates[scancode] = keystates[scancode] == KS_PRESSED ? KS_STRUCK : KS_OFF; } } break; } } /* Initialize (or re-initialize) all key states. */ static void restartkeystates(void) { Uint8 *keyboard; int count, n; memset(keystates, KS_OFF, sizeof keystates); keyboard = SDL_GetKeyState(&count); if (count > SDLK_LAST) count = SDLK_LAST; for (n = 0 ; n < count ; ++n) if (keyboard[n]) _keyeventcallback(n, TRUE); } /* Update the key states. This is done at the start of each polling * cycle. The state changes that occur depend on the current behavior * settings. */ static void resetkeystates(void) { /* The transition table for keys in joystick behavior mode. */ static char const joystick_trans[KS_count] = { /* KS_OFF => */ KS_OFF, /* KS_ON => */ KS_ON, /* KS_DOWN => */ KS_DOWN, /* KS_STRUCK => */ KS_OFF, /* KS_PRESSED => */ KS_DOWN, /* KS_DOWNBUTOFF1 => */ KS_DOWN, /* KS_DOWNBUTOFF2 => */ KS_DOWN, /* KS_DOWNBUTOFF3 => */ KS_DOWN, /* KS_REPEATING => */ KS_DOWN }; /* The transition table for keys in keyboard behavior mode. */ static char const keyboard_trans[KS_count] = { /* KS_OFF => */ KS_OFF, /* KS_ON => */ KS_ON, /* KS_DOWN => */ KS_DOWN, /* KS_STRUCK => */ KS_OFF, /* KS_PRESSED => */ KS_DOWNBUTOFF1, /* KS_DOWNBUTOFF1 => */ KS_DOWNBUTOFF2, /* KS_DOWNBUTOFF2 => */ KS_DOWN, /* KS_DOWNBUTOFF3 => */ KS_DOWN, /* KS_REPEATING => */ KS_DOWN }; char const *newstate; int n; newstate = joystickstyle ? joystick_trans : keyboard_trans; for (n = 0 ; n < SDLK_LAST ; ++n) keystates[n] = newstate[(int)keystates[n]]; } /* * Mouse event functions. */ /* This callback is called whenever there is a state change in the * mouse buttons. Up events are ignored. Down events are stored to * be examined later. */ static void _mouseeventcallback(int xpos, int ypos, int button, int down) { if (down) { mouseinfo.state = KS_PRESSED; mouseinfo.x = xpos; mouseinfo.y = ypos; mouseinfo.button = button; } } /* Return the command appropriate to the most recent mouse activity. */ static int retrievemousecommand(void) { int n; switch (mouseinfo.state) { case KS_PRESSED: mouseinfo.state = KS_OFF; if (mouseinfo.button == SDL_BUTTON_WHEELDOWN) return CmdNext; if (mouseinfo.button == SDL_BUTTON_WHEELUP) return CmdPrev; if (mouseinfo.button == SDL_BUTTON_LEFT) { n = windowmappos(mouseinfo.x, mouseinfo.y); if (n >= 0) { mouseinfo.state = KS_DOWNBUTOFF1; return CmdAbsMouseMoveFirst + n; } } break; case KS_DOWNBUTOFF1: mouseinfo.state = KS_DOWNBUTOFF2; return CmdPreserve; case KS_DOWNBUTOFF2: mouseinfo.state = KS_DOWNBUTOFF3; return CmdPreserve; case KS_DOWNBUTOFF3: mouseinfo.state = KS_OFF; return CmdPreserve; } return 0; } /* * Exported functions. */ /* Wait for any non-shift key to be pressed down, ignoring any keys * that may be down at the time the function is called. Return FALSE * if the key pressed is suggestive of a desire to quit. */ int anykey(void) { int n; resetkeystates(); eventupdate(FALSE); for (;;) { resetkeystates(); eventupdate(TRUE); for (n = 0 ; n < SDLK_LAST ; ++n) if (keystates[n] == KS_STRUCK || keystates[n] == KS_PRESSED || keystates[n] == KS_REPEATING) return n != 'q' && n != SDLK_ESCAPE; } } /* Poll the keyboard and return the command associated with the * selected key, if any. If no key is selected and wait is TRUE, block * until a key with an associated command is selected. In keyboard behavior * mode, the function can return CmdPreserve, indicating that if the key * command from the previous poll has not been processed, it should still * be considered active. If two mergeable keys are selected, the return * value will be the bitwise-or of their command values. */ int input(int wait) { keycmdmap const *kc; int lingerflag = FALSE; int cmd1, cmd, n; for (;;) { resetkeystates(); eventupdate(wait); cmd1 = cmd = 0; for (kc = keycmds ; kc->scancode ; ++kc) { n = keystates[kc->scancode]; if (!n) continue; if (kc->shift != -1) if (kc->shift != (keystates[SDLK_LSHIFT] || keystates[SDLK_RSHIFT])) continue; if (kc->ctl != -1) if (kc->ctl != (keystates[SDLK_LCTRL] || keystates[SDLK_RCTRL])) continue; if (kc->alt != -1) if (kc->alt != (keystates[SDLK_LALT] || keystates[SDLK_RALT])) continue; if (n == KS_PRESSED || (kc->hold && n == KS_DOWN)) { if (!cmd1) { cmd1 = kc->cmd; if (!joystickstyle || cmd1 > CmdKeyMoveLast || !mergeable[cmd1]) return cmd1; } else { if (cmd1 <= CmdKeyMoveLast && (mergeable[cmd1] & kc->cmd) == kc->cmd) return cmd1 | kc->cmd; } } else if (n == KS_STRUCK || n == KS_REPEATING) { cmd = kc->cmd; } else if (n == KS_DOWNBUTOFF1 || n == KS_DOWNBUTOFF2) { lingerflag = TRUE; } } if (cmd1) return cmd1; if (cmd) return cmd; cmd = retrievemousecommand(); if (cmd) return cmd; if (!wait) break; } if (!cmd && lingerflag) cmd = CmdPreserve; return cmd; } /* Turn key-repeating on and off. */ int setkeyboardrepeat(int enable) { if (enable) return SDL_EnableKeyRepeat(500, 75) == 0; else return SDL_EnableKeyRepeat(0, 0) == 0; } /* Turn joystick behavior mode on or off. In joystick-behavior mode, * the arrow keys are always returned from input() if they are down at * the time of the polling cycle. Other keys are only returned if they * are pressed during a polling cycle (or if they repeat, if keyboard * repeating is on). In keyboard-behavior mode, the arrow keys have a * special repeating behavior that is kept synchronized with the * polling cycle. */ int setkeyboardarrowsrepeat(int enable) { joystickstyle = enable; restartkeystates(); return TRUE; } /* Turn input mode on or off. When input mode is on, the input key * command map is used instead of the game key command map. */ int setkeyboardinputmode(int enable) { keycmds = enable ? inputkeycmds : gamekeycmds; return TRUE; } /* Initialization. */ int _sdlinputinitialize(void) { sdlg.keyeventcallbackfunc = _keyeventcallback; sdlg.mouseeventcallbackfunc = _mouseeventcallback; mergeable[CmdNorth] = mergeable[CmdSouth] = CmdWest | CmdEast; mergeable[CmdWest] = mergeable[CmdEast] = CmdNorth | CmdSouth; setkeyboardrepeat(TRUE); SDL_EnableUNICODE(TRUE); return TRUE; } /* Online help texts for the keyboard commands. */ tablespec const *keyboardhelp(int which) { static char *ingame_items[] = { "1-arrows", "1-move Chip", "1-2 4 6 8 (keypad)", "1-also move Chip", "1-Q", "1-quit the current game", "1-Bkspc", "1-pause the game", "1-Ctrl-R", "1-restart the current level", "1-Ctrl-P", "1-jump to the previous level", "1-Ctrl-N", "1-jump to the next level", "1-V", "1-decrease volume", "1-Shift-V", "1-increase volume", "1-Ctrl-C", "1-exit the program", "1-Alt-F4", "1-exit the program" }; static tablespec const keyhelp_ingame = { 11, 2, 4, 1, ingame_items }; static char *twixtgame_items[] = { "1-P", "1-jump to the previous level", "1-N", "1-jump to the next level", "1-PgUp", "1-skip back ten levels", "1-PgDn", "1-skip ahead ten levels", "1-G", "1-go to a level using a password", "1-S", "1-see the scores for each level", "1-Tab", "1-playback saved solution", "1-Shift-Tab", "1-verify saved solution", "1-Ctrl-X", "1-replace existing solution", "1-Shift-Ctrl-X", "1-delete existing solution", "1-Ctrl-S", "1-see the available solution files", "1-O", "1-toggle between even-step and odd-step offset", "1-Shift-O", "1-increment stepping offset (Lynx only)", "1-V", "1-decrease volume", "1-Shift-V", "1-increase volume", "1-Q", "1-return to the file list", "1-Ctrl-C", "1-exit the program", "1-Alt-F4", "1-exit the program" }; static tablespec const keyhelp_twixtgame = { 18, 2, 4, 1, twixtgame_items }; static char *scorelist_items[] = { "1-up down", "1-move selection", "1-PgUp PgDn", "1-scroll selection", "1-Enter Space", "1-select level", "1-Ctrl-S", "1-change solution file", "1-Q", "1-return to the last level", "1-Ctrl-C", "1-exit the program", "1-Alt-F4", "1-exit the program" }; static tablespec const keyhelp_scorelist = { 7, 2, 4, 1, scorelist_items }; static char *scroll_items[] = { "1-up down", "1-move selection", "1-PgUp PgDn", "1-scroll selection", "1-Enter Space", "1-select", "1-Q", "1-cancel", "1-Ctrl-C", "1-exit the program", "1-Alt-F4", "1-exit the program" }; static tablespec const keyhelp_scroll = { 6, 2, 4, 1, scroll_items }; switch (which) { case KEYHELP_INGAME: return &keyhelp_ingame; case KEYHELP_TWIXTGAMES: return &keyhelp_twixtgame; case KEYHELP_SCORELIST: return &keyhelp_scorelist; case KEYHELP_FILELIST: return &keyhelp_scroll; } return NULL; } tworld-1.3.0/oshw-sdl/sdloshw.c0000644000175000017500000000622310407163756016567 0ustar breadboxbreadbox/* sdloshw.c: Top-level SDL management functions. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include "SDL.h" #include "sdlgen.h" #include "../err.h" /* Values global to this library. */ oshwglobals sdlg; /* This is an automatically-generated file, which contains a * representation of the program's icon. */ #include "ccicon.c" /* Dispatch all events sitting in the SDL event queue. */ static void _eventupdate(int wait) { static int mouselastx = -1, mouselasty = -1; SDL_Event event; if (wait) SDL_WaitEvent(NULL); SDL_PumpEvents(); while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) { switch (event.type) { case SDL_KEYDOWN: if (windowmappos(mouselastx, mouselasty) < 0) SDL_ShowCursor(SDL_DISABLE); keyeventcallback(event.key.keysym.sym, TRUE); if (event.key.keysym.unicode && event.key.keysym.unicode != event.key.keysym.sym) { keyeventcallback(event.key.keysym.unicode, TRUE); keyeventcallback(event.key.keysym.unicode, FALSE); } break; case SDL_KEYUP: if (windowmappos(mouselastx, mouselasty) < 0) SDL_ShowCursor(SDL_DISABLE); keyeventcallback(event.key.keysym.sym, FALSE); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: SDL_ShowCursor(SDL_ENABLE); mouselastx = event.motion.x; mouselasty = event.motion.y; mouseeventcallback(event.button.x, event.button.y, event.button.button, event.type == SDL_MOUSEBUTTONDOWN); break; case SDL_MOUSEMOTION: SDL_ShowCursor(SDL_ENABLE); mouselastx = event.motion.x; mouselasty = event.motion.y; break; case SDL_QUIT: exit(EXIT_SUCCESS); } } } /* Alter the window decoration. */ void setsubtitle(char const *subtitle) { char buf[270]; if (subtitle && *subtitle) { sprintf(buf, "Tile World - %.255s", subtitle); SDL_WM_SetCaption(buf, "Tile World"); } else { SDL_WM_SetCaption("Tile World", "Tile World"); } } /* Shut down SDL. */ static void shutdown(void) { SDL_Quit(); } /* Initialize SDL, create the program's icon, and then initialize * the other modules of the library. */ int oshwinitialize(int silence, int soundbufsize, int showhistogram, int fullscreen) { SDL_Surface *icon; sdlg.eventupdatefunc = _eventupdate; if (SDL_Init(SDL_INIT_VIDEO) < 0) { errmsg(NULL, "Cannot initialize SDL system: %s\n", SDL_GetError()); return FALSE; } atexit(shutdown); setsubtitle(NULL); icon = SDL_CreateRGBSurfaceFrom(cciconimage, CXCCICON, CYCCICON, 32, 4 * CXCCICON, 0x0000FF, 0x00FF00, 0xFF0000, 0); if (icon) { SDL_WM_SetIcon(icon, cciconmask); SDL_FreeSurface(icon); } else warn("couldn't create icon surface: %s", SDL_GetError()); return _sdltimerinitialize(showhistogram) && _sdltextinitialize() && _sdltileinitialize() && _sdlinputinitialize() && _sdloutputinitialize(fullscreen) && _sdlsfxinitialize(silence, soundbufsize); } /* The real main(). */ int main(int argc, char *argv[]) { return tworld(argc, argv); } tworld-1.3.0/oshw-sdl/sdlout.c0000644000175000017500000006716510420613217016415 0ustar breadboxbreadbox/* sdlout.c: Creating the program's displays. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include "SDL.h" #include "sdlgen.h" #include "../err.h" #include "../state.h" /* Space to leave between graphic objects. */ #define MARGINW 8 #define MARGINH 8 /* Size of the prompt icons. */ #define PROMPTICONW 16 #define PROMPTICONH 10 /* The dimensions of the visible area of the map (in tiles). */ #define NXTILES 9 #define NYTILES 9 /* Erase a rectangle (useful for when a surface is locked). */ #define fillrect(r) (puttext((r), NULL, 0, PT_MULTILINE)) /* Get a generic tile image. */ #define gettileimage(id) (getcellimage(NULL, (id), Empty, -1)) /* Structure for holding information about the message display. */ typedef struct msgdisplayinfo { char msg[64]; /* text of the message */ unsigned int msglen; /* length of the message */ unsigned long until; /* when to erase the message */ unsigned long bolduntil; /* when to dim the message */ } msgdisplayinfo; /* The message display. */ static msgdisplayinfo msgdisplay; /* Some prompting icons. */ static SDL_Surface *prompticons = NULL; /* TRUE means the program should attempt to run in fullscreen mode. */ static int fullscreen = FALSE; /* Coordinates specifying the placement of the various screen elements. */ static int screenw, screenh; static SDL_Rect rinfoloc; static SDL_Rect locrects[8]; #define displayloc (locrects[0]) #define titleloc (locrects[1]) #define infoloc (locrects[2]) #define invloc (locrects[3]) #define hintloc (locrects[4]) #define rscoreloc (locrects[5]) #define messageloc (locrects[6]) #define promptloc (locrects[7]) /* TRUE means that the screen is in need of a full update. */ static int fullredraw = TRUE; /* Coordinates of the NW corner of the visible part of the map * (measured in quarter-tiles), or -1 if no map is currently visible. */ static int mapvieworigin = -1; /* * Display initialization functions. */ /* Set up a fontcolors structure, calculating the middle color from * the other two. */ static fontcolors makefontcolors(int rbkgnd, int gbkgnd, int bbkgnd, int rtext, int gtext, int btext) { fontcolors colors; colors.c[0] = SDL_MapRGB(sdlg.screen->format, rbkgnd, gbkgnd, bbkgnd); colors.c[2] = SDL_MapRGB(sdlg.screen->format, rtext, gtext, btext); colors.c[1] = SDL_MapRGB(sdlg.screen->format, (rbkgnd + rtext) / 2, (gbkgnd + gtext) / 2, (bbkgnd + btext) / 2); return colors; } /* Create three simple icons, to be used when prompting the user. */ static int createprompticons(void) { static Uint8 iconpixels[] = { 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,0, 0,0,0,0,1,2,2,2,2,1,0,0,0,0,0,0, 0,0,1,2,2,2,2,2,2,1,0,0,0,0,0,0, 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 0,0,1,2,2,2,2,2,2,1,0,0,0,0,0,0, 0,0,0,0,1,2,2,2,2,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0, 0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0, 0,0,0,0,2,2,2,2,2,2,2,2,0,0,0,0, 0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0, 0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0, 0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0, 0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0, 0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0, 0,0,0,0,2,2,2,2,2,2,2,2,0,0,0,0, 0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,2,2,2,2,1,0,0,0,0, 0,0,0,0,0,0,1,2,2,2,2,2,2,1,0,0, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, 0,0,0,0,0,0,1,2,2,2,2,2,2,1,0,0, 0,0,0,0,0,0,1,2,2,2,2,1,0,0,0,0, 0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0 }; if (!prompticons) { prompticons = SDL_CreateRGBSurfaceFrom(iconpixels, PROMPTICONW, 3 * PROMPTICONH, 8, PROMPTICONW, 0, 0, 0, 0); if (!prompticons) { warn("couldn't create SDL surface: %s", SDL_GetError()); return FALSE; } } SDL_GetRGB(bkgndcolor(sdlg.dimtextclr), sdlg.screen->format, &prompticons->format->palette->colors[0].r, &prompticons->format->palette->colors[0].g, &prompticons->format->palette->colors[0].b); SDL_GetRGB(halfcolor(sdlg.dimtextclr), sdlg.screen->format, &prompticons->format->palette->colors[1].r, &prompticons->format->palette->colors[1].g, &prompticons->format->palette->colors[1].b); SDL_GetRGB(textcolor(sdlg.dimtextclr), sdlg.screen->format, &prompticons->format->palette->colors[2].r, &prompticons->format->palette->colors[2].g, &prompticons->format->palette->colors[2].b); return TRUE; } /* Calculate the placements of all the separate elements of the * display. */ static int layoutscreen(void) { static char const *scoretext = "888 DRAWN AND QUARTERED" " 88,888 8,888,888 8,888,888"; static char const *hinttext = "Total Score "; static char const *rscoretext = "88888888"; static char const *chipstext = "Chips"; static char const *timertext = " 88888"; int fullw, infow, rscorew, texth; if (sdlg.wtile <= 0 || sdlg.htile <= 0) return FALSE; puttext(&displayloc, scoretext, -1, PT_CALCSIZE); fullw = displayloc.w; texth = displayloc.h; puttext(&displayloc, hinttext, -1, PT_CALCSIZE); infow = displayloc.w; puttext(&displayloc, rscoretext, -1, PT_CALCSIZE); rscorew = displayloc.w; infow += rscorew; displayloc.x = MARGINW; displayloc.y = MARGINH; displayloc.w = NXTILES * sdlg.wtile; displayloc.h = NYTILES * sdlg.htile; titleloc.x = displayloc.x; titleloc.y = displayloc.y + displayloc.h + MARGINH; titleloc.w = displayloc.w; titleloc.h = texth; infoloc.x = displayloc.x + displayloc.w + MARGINW; infoloc.y = MARGINH; infoloc.w = 4 * sdlg.wtile; if (infoloc.w < infow) infoloc.w = infow; infoloc.h = 6 * texth; puttext(&rinfoloc, chipstext, -1, PT_CALCSIZE); rinfoloc.x = infoloc.x + rinfoloc.w + MARGINW; rinfoloc.y = infoloc.y + 3 * texth; puttext(&rinfoloc, timertext, -1, PT_CALCSIZE); rinfoloc.h = 2 * texth; invloc.x = infoloc.x; invloc.y = infoloc.y + infoloc.h + MARGINH; invloc.w = 4 * sdlg.wtile; invloc.h = 2 * sdlg.htile; screenw = infoloc.x + infoloc.w + MARGINW; if (screenw < fullw) screenw = fullw; screenh = titleloc.y + titleloc.h + MARGINH; promptloc.x = screenw - MARGINW - PROMPTICONW; promptloc.y = screenh - MARGINH - PROMPTICONH; promptloc.w = PROMPTICONW; promptloc.h = PROMPTICONH; messageloc.x = infoloc.x; messageloc.y = titleloc.y; messageloc.w = promptloc.x - messageloc.x - MARGINW; messageloc.h = titleloc.h; hintloc.x = infoloc.x; hintloc.y = invloc.y + invloc.h + MARGINH; hintloc.w = screenw - MARGINW - hintloc.x; hintloc.h = messageloc.y - hintloc.y; if (hintloc.y + hintloc.h + MARGINH > promptloc.y) hintloc.h = promptloc.y - MARGINH - hintloc.y; rscoreloc.x = hintloc.x + hintloc.w - rscorew; rscoreloc.y = hintloc.y + 2 * texth; rscoreloc.w = rscorew; rscoreloc.h = hintloc.h - 2 * texth; return TRUE; } /* Create or change the program's display surface. */ static int createdisplay(void) { int flags; if (sdlg.screen) { SDL_FreeSurface(sdlg.screen); sdlg.screen = NULL; } flags = SDL_SWSURFACE | SDL_ANYFORMAT; if (fullscreen) flags |= SDL_FULLSCREEN; if (!(sdlg.screen = SDL_SetVideoMode(screenw, screenh, 32, flags))) { errmsg(NULL, "cannot open %dx%d display: %s\n", screenw, screenh, SDL_GetError()); return FALSE; } if (sdlg.screen->w != screenw || sdlg.screen->h != screenh) warn("requested a %dx%d display, got %dx%d instead", sdlg.screen->w, sdlg.screen->h); return TRUE; } /* Wipe the display. */ void cleardisplay(void) { SDL_FillRect(sdlg.screen, NULL, bkgndcolor(sdlg.textclr)); fullredraw = TRUE; mapvieworigin = -1; } /* * Tile rendering functions. */ /* Copy a single tile to the position (xpos, ypos). */ static void drawfulltile(int xpos, int ypos, SDL_Surface *src) { SDL_Rect rect = { xpos, ypos, src->w, src->h }; if (SDL_BlitSurface(src, NULL, sdlg.screen, &rect)) warn("%s", SDL_GetError()); } /* Copy a tile to the position (xpos, ypos) but clipped to the * displayloc rectangle. */ static void drawclippedtile(SDL_Rect const *rect, SDL_Surface *src) { int xoff, yoff, w, h; xoff = 0; if (rect->x < displayloc.x) xoff = displayloc.x - rect->x; yoff = 0; if (rect->y < displayloc.y) yoff = displayloc.y - rect->y; w = rect->w - xoff; if (rect->x + rect->w > displayloc.x + displayloc.w) w -= (rect->x + rect->w) - (displayloc.x + displayloc.w); h = rect->h - yoff; if (rect->y + rect->h > displayloc.y + displayloc.h) h -= (rect->y + rect->h) - (displayloc.y + displayloc.h); if (w <= 0 || h <= 0) return; { SDL_Rect srect = { xoff, yoff, w, h }; SDL_Rect drect = { rect->x + xoff, rect->y + yoff, 0, 0 }; if (SDL_BlitSurface(src, &srect, sdlg.screen, &drect)) warn("%s", SDL_GetError()); } } /* * Message display function. */ /* Refresh the message-display message. If update is TRUE, the screen * is updated immediately. */ static void displaymsg(int update) { int f; if (msgdisplay.until < SDL_GetTicks()) { *msgdisplay.msg = '\0'; msgdisplay.msglen = 0; f = 0; } else { if (!msgdisplay.msglen) return; f = PT_CENTER; if (msgdisplay.bolduntil < SDL_GetTicks()) f |= PT_DIM; } puttext(&messageloc, msgdisplay.msg, msgdisplay.msglen, f); if (update) SDL_UpdateRect(sdlg.screen, messageloc.x, messageloc.y, messageloc.w, messageloc.h); } /* Change the current message-display message. msecs gives the number * of milliseconds to display the message, and bold specifies the * number of milliseconds to display the message highlighted. */ int setdisplaymsg(char const *msg, int msecs, int bold) { if (!msg || !*msg) { *msgdisplay.msg = '\0'; msgdisplay.msglen = 0; msgdisplay.until = 0; msgdisplay.bolduntil = 0; } else { msgdisplay.msglen = strlen(msg); if (msgdisplay.msglen >= sizeof msgdisplay.msg) msgdisplay.msglen = sizeof msgdisplay.msg - 1; memcpy(msgdisplay.msg, msg, msgdisplay.msglen); msgdisplay.msg[msgdisplay.msglen] = '\0'; msgdisplay.until = SDL_GetTicks() + msecs; msgdisplay.bolduntil = SDL_GetTicks() + bold; } displaymsg(TRUE); return TRUE; } /* * The main display functions. */ /* Create a string representing a decimal number. */ static char const *decimal(long number, int places) { static char buf[32]; char *dest = buf + sizeof buf; unsigned long n; n = number >= 0 ? (unsigned long)number : (unsigned long)-(number + 1) + 1; *--dest = '\0'; do { *--dest = CHAR_MZERO + n % 10; n /= 10; } while (n); while (buf + sizeof buf - dest < places + 1) *--dest = CHAR_MZERO; if (number < 0) *--dest = '-'; return dest; } /* Display an empty map view. */ static void displayshutter(void) { SDL_Rect rect; rect = displayloc; SDL_FillRect(sdlg.screen, &rect, halfcolor(sdlg.dimtextclr)); ++rect.x; ++rect.y; rect.w -= 2; rect.h -= 2; SDL_FillRect(sdlg.screen, &rect, textcolor(sdlg.dimtextclr)); ++rect.x; ++rect.y; rect.w -= 2; rect.h -= 2; SDL_FillRect(sdlg.screen, &rect, halfcolor(sdlg.dimtextclr)); ++rect.x; ++rect.y; rect.w -= 2; rect.h -= 2; SDL_FillRect(sdlg.screen, &rect, bkgndcolor(sdlg.dimtextclr)); } /* Render the view of the visible area of the map to the display, with * the view position centered on the display as much as possible. The * gamestate's map and the list of creatures are consulted to * determine what to render. */ static void displaymapview(gamestate const *state) { SDL_Rect rect; SDL_Surface *s; creature const *cr; int xdisppos, ydisppos; int xorigin, yorigin; int lmap, tmap, rmap, bmap; int pos, x, y; if (state->statusflags & SF_SHUTTERED) { displayshutter(); return; } xdisppos = state->xviewpos / 2 - (NXTILES / 2) * 4; ydisppos = state->yviewpos / 2 - (NYTILES / 2) * 4; if (xdisppos < 0) xdisppos = 0; if (ydisppos < 0) ydisppos = 0; if (xdisppos > (CXGRID - NXTILES) * 4) xdisppos = (CXGRID - NXTILES) * 4; if (ydisppos > (CYGRID - NYTILES) * 4) ydisppos = (CYGRID - NYTILES) * 4; xorigin = displayloc.x - (xdisppos * sdlg.wtile / 4); yorigin = displayloc.y - (ydisppos * sdlg.htile / 4); mapvieworigin = ydisppos * CXGRID * 4 + xdisppos; lmap = xdisppos / 4; tmap = ydisppos / 4; rmap = (xdisppos + 3) / 4 + NXTILES; bmap = (ydisppos + 3) / 4 + NYTILES; for (y = tmap ; y < bmap ; ++y) { if (y < 0 || y >= CXGRID) continue; for (x = lmap ; x < rmap ; ++x) { if (x < 0 || x >= CXGRID) continue; pos = y * CXGRID + x; rect.x = xorigin + x * sdlg.wtile; rect.y = yorigin + y * sdlg.htile; s = getcellimage(&rect, state->map[pos].top.id, state->map[pos].bot.id, (state->statusflags & SF_NOANIMATION) ? -1 : state->currenttime); drawclippedtile(&rect, s); } } lmap -= 2; tmap -= 2; rmap += 2; bmap += 2; for (cr = state->creatures ; cr->id ; ++cr) { if (cr->hidden) continue; x = cr->pos % CXGRID; y = cr->pos / CXGRID; if (x < lmap || x >= rmap || y < tmap || y >= bmap) continue; rect.x = xorigin + x * sdlg.wtile; rect.y = yorigin + y * sdlg.htile; s = getcreatureimage(&rect, cr->id, cr->dir, cr->moving, cr->frame); drawclippedtile(&rect, s); } } /* Render all the various nuggets of data that comprise the * information display. timeleft and besttime supply the current timer * value and the player's best recorded time as measured in seconds. * The level's title, number, password, and hint, the count of chips * needed, and the keys and boots in possession are all used as well * in creating the display. */ static void displayinfo(gamestate const *state, int timeleft, int besttime) { SDL_Rect rect, rrect; char buf[512]; int n; puttext(&titleloc, state->game->name, -1, PT_CENTER); rect = infoloc; if (state->game->number) { sprintf(buf, "Level %d", state->game->number); puttext(&rect, buf, -1, PT_UPDATERECT); } else puttext(&rect, "", 0, PT_UPDATERECT); if (state->game->passwd && *state->game->passwd) { sprintf(buf, "Password: %s", state->game->passwd); puttext(&rect, buf, -1, PT_UPDATERECT); } else puttext(&rect, "", 0, PT_UPDATERECT); puttext(&rect, "", 0, PT_UPDATERECT); rrect.x = rinfoloc.x; rrect.w = rinfoloc.w; rrect.y = rect.y; rrect.h = rect.h; puttext(&rect, "Chips", 5, PT_UPDATERECT); puttext(&rect, "Time", 4, PT_UPDATERECT); puttext(&rrect, decimal(state->chipsneeded, 0), -1, PT_RIGHT | PT_UPDATERECT); if (timeleft == TIME_NIL) puttext(&rrect, "---", -1, PT_RIGHT); else puttext(&rrect, decimal(timeleft, 0), -1, PT_RIGHT); if (state->stepping) { rrect.x += rrect.w; rrect.w = infoloc.x + infoloc.w - rrect.x; if (state->stepping < 4) sprintf(buf, " (+%d)", state->stepping); else if (state->stepping > 4) sprintf(buf, " (odd+%d)", state->stepping & 3); else sprintf(buf, " (odd)"); puttext(&rrect, buf, -1, 0); } if (besttime != TIME_NIL) { if (timeleft == TIME_NIL) sprintf(buf, "(Best time: %s)", decimal(besttime, 0)); else sprintf(buf, "Best time: %s", decimal(besttime, 0)); n = (state->game->sgflags & SGF_REPLACEABLE) ? PT_DIM : 0; puttext(&rect, buf, -1, PT_UPDATERECT | n); } fillrect(&rect); for (n = 0 ; n < 4 ; ++n) { drawfulltile(invloc.x + n * sdlg.wtile, invloc.y, gettileimage(state->keys[n] ? Key_Red + n : Empty)); drawfulltile(invloc.x + n * sdlg.wtile, invloc.y + sdlg.htile, gettileimage(state->boots[n] ? Boots_Ice + n : Empty)); } if (state->statusflags & SF_INVALID) { puttext(&hintloc, "This level cannot be played.", -1, PT_MULTILINE); } else if (state->currenttime < 0 && state->game->unsolvable) { if (*state->game->unsolvable) { sprintf(buf, "This level is reported to be unsolvable: %s.", state->game->unsolvable); puttext(&hintloc, buf, -1, PT_MULTILINE); } else { puttext(&hintloc, "This level is reported to be unsolvable.", -1, PT_MULTILINE); } } else if (state->statusflags & SF_SHOWHINT) { puttext(&hintloc, state->hinttext, -1, PT_MULTILINE | PT_CENTER); } else { fillrect(&hintloc); } fillrect(&promptloc); } /* Display a prompt icon in the lower right-hand corner. completed is * -1, 0, or +1, depending on which icon is being requested. */ static int displayprompticon(int completed) { SDL_Rect src; if (!prompticons) return FALSE; src.x = 0; src.y = (completed + 1) * PROMPTICONH; src.w = PROMPTICONW; src.h = PROMPTICONH; SDL_BlitSurface(prompticons, &src, sdlg.screen, &promptloc); SDL_UpdateRect(sdlg.screen, promptloc.x, promptloc.y, promptloc.w, promptloc.h); return TRUE; } /* * The exported functions. */ /* Given a pixel's coordinates, return the integer identifying the * tile's position in the map, or -1 if the pixel is not on the map view. */ int _windowmappos(int x, int y) { if (mapvieworigin < 0) return -1; if (x < displayloc.x || y < displayloc.y) return -1; x = (x - displayloc.x) * 4 / sdlg.wtile; y = (y - displayloc.y) * 4 / sdlg.htile; if (x >= NXTILES * 4 || y >= NYTILES * 4) return -1; x = (x + mapvieworigin % (CXGRID * 4)) / 4; y = (y + mapvieworigin / (CXGRID * 4)) / 4; if (x < 0 || x >= CXGRID || y < 0 || y >= CYGRID) { warn("mouse moved off the map: (%d %d)", x, y); return -1; } return y * CXGRID + x; } /* Set the four main colors used to render text on the display. */ void setcolors(long bkgnd, long text, long bold, long dim) { int bkgndr, bkgndg, bkgndb; if (bkgnd < 0) bkgnd = 0x000000; if (text < 0) text = 0xFFFFFF; if (bold < 0) bold = 0xFFFF00; if (dim < 0) dim = 0xC0C0C0; if (bkgnd == text || bkgnd == bold || bkgnd == dim) { errmsg(NULL, "one or more text colors matches the background color; " "color scheme left unchanged."); return; } bkgndr = (bkgnd >> 16) & 255; bkgndg = (bkgnd >> 8) & 255; bkgndb = bkgnd & 255; sdlg.textclr = makefontcolors(bkgndr, bkgndg, bkgndb, (text >> 16) & 255, (text >> 8) & 255, text & 255); sdlg.dimtextclr = makefontcolors(bkgndr, bkgndg, bkgndb, (dim >> 16) & 255, (dim >> 8) & 255, dim & 255); sdlg.hilightclr = makefontcolors(bkgndr, bkgndg, bkgndb, (bold >> 16) & 255, (bold >> 8) & 255, bold & 255); createprompticons(); } /* Create the game's display. state is a pointer to the gamestate * structure. */ int displaygame(void const *state, int timeleft, int besttime) { displaymapview(state); displayinfo(state, timeleft, besttime); displaymsg(FALSE); if (fullredraw) { SDL_UpdateRect(sdlg.screen, 0, 0, 0, 0); fullredraw = FALSE; } else { SDL_UpdateRects(sdlg.screen, sizeof locrects / sizeof *locrects, locrects); } return TRUE; } /* Update the display to acknowledge the end of game play. completed * is positive if the play was successful or negative if unsuccessful. * If the latter, then the other arguments can contain point values * that will be reported to the user. */ int displayendmessage(int basescore, int timescore, long totalscore, int completed) { SDL_Rect rect; int fullscore; if (totalscore) { fullscore = timescore + basescore; rect = hintloc; puttext(&rect, "Level Completed", -1, PT_CENTER); rect.y = rscoreloc.y; rect.h = rscoreloc.h; puttext(&rect, "Time Bonus", -1, PT_UPDATERECT); puttext(&rect, "Level Bonus", -1, PT_UPDATERECT); puttext(&rect, "Level Score", -1, PT_UPDATERECT); puttext(&rect, "Total Score", -1, PT_UPDATERECT); rect = rscoreloc; puttext(&rect, decimal(timescore, 4), -1, PT_RIGHT | PT_UPDATERECT); puttext(&rect, decimal(basescore, 5), -1, PT_RIGHT | PT_UPDATERECT); puttext(&rect, decimal(fullscore, 5), -1, PT_RIGHT | PT_UPDATERECT); puttext(&rect, decimal(totalscore, 7), -1, PT_RIGHT | PT_UPDATERECT); SDL_UpdateRect(sdlg.screen, hintloc.x, hintloc.y, hintloc.w, hintloc.h); } return displayprompticon(completed); } /* Render a table on the display. title is a short string to let the * user know what they're looking at. completed determines the prompt * icon that will be displayed in the lower right-hand corner. */ int displaytable(char const *title, tablespec const *table, int completed) { SDL_Rect area; SDL_Rect *cols; int i, n; cleardisplay(); area.x = MARGINW; area.y = screenh - MARGINH - sdlg.font.h; area.w = screenw - 2 * MARGINW; area.h = sdlg.font.h; puttext(&area, title, -1, 0); area.h = area.y - MARGINH; area.y = MARGINH; cols = measuretable(&area, table); for (i = table->rows, n = 0 ; i ; --i) drawtablerow(table, cols, &n, 0); free(cols); displayprompticon(completed); SDL_UpdateRect(sdlg.screen, 0, 0, 0, 0); return TRUE; } /* Render a table with embedded illustrations on the display. title is * a short string to display under the table. rows is an array of * count lines of text, each accompanied by one or two illustrations. * completed determines the prompt icon that will be displayed in the * lower right-hand corner. */ int displaytiletable(char const *title, tiletablerow const *rows, int count, int completed) { SDL_Rect left, right; int col, id, i; cleardisplay(); left.x = MARGINW; left.y = screenh - MARGINH - sdlg.font.h; left.w = screenw - 2 * MARGINW; left.h = sdlg.font.h; puttext(&left, title, -1, 0); left.h = left.y - MARGINH; left.y = MARGINH; right = left; col = sdlg.wtile * 2 + MARGINW; right.x += col; right.w -= col; for (i = 0 ; i < count ; ++i) { if (rows[i].isfloor) id = rows[i].item1; else id = crtile(rows[i].item1, EAST); drawfulltile(left.x + sdlg.wtile, left.y, gettileimage(id)); if (rows[i].item2) { if (rows[i].isfloor) id = rows[i].item2; else id = crtile(rows[i].item2, EAST); drawfulltile(left.x, left.y, gettileimage(id)); } left.y += sdlg.htile; left.h -= sdlg.htile; puttext(&right, rows[i].desc, -1, PT_MULTILINE | PT_UPDATERECT); if (left.y < right.y) { left.y = right.y; left.h = right.h; } else { right.y = left.y; right.h = left.h; } } displayprompticon(completed); SDL_UpdateRect(sdlg.screen, 0, 0, 0, 0); return TRUE; } /* Render a table as a scrollable list on the display. One row is * highlighted as the current selection, initially set by the integer * pointed to by idx. The callback function inputcallback is called * repeatedly to determine how to move the selection and when to * leave. The row selected when the function returns is returned to * the caller through idx. */ int displaylist(char const *title, void const *tab, int *idx, int (*inputcallback)(int*)) { tablespec const *table = tab; SDL_Rect area; SDL_Rect *cols; SDL_Rect *colstmp; int linecount, itemcount, topitem, index; int j, n; cleardisplay(); area.x = MARGINW; area.y = screenh - MARGINH - sdlg.font.h; area.w = screenw - 2 * MARGINW; area.h = sdlg.font.h; puttext(&area, title, -1, 0); area.h = area.y - MARGINH; area.y = MARGINH; cols = measuretable(&area, table); if (!(colstmp = malloc(table->cols * sizeof *colstmp))) memerrexit(); itemcount = table->rows - 1; topitem = 0; linecount = area.h / sdlg.font.h - 1; index = *idx; n = SCROLL_NOP; do { switch (n) { case SCROLL_NOP: break; case SCROLL_UP: --index; break; case SCROLL_DN: ++index; break; case SCROLL_HALFPAGE_UP: index -= (linecount + 1) / 2; break; case SCROLL_HALFPAGE_DN: index += (linecount + 1) / 2; break; case SCROLL_PAGE_UP: index -= linecount; break; case SCROLL_PAGE_DN: index += linecount; break; case SCROLL_ALLTHEWAY_UP: index = 0; break; case SCROLL_ALLTHEWAY_DN: index = itemcount - 1; break; default: index = n; break; } if (index < 0) index = 0; else if (index >= itemcount) index = itemcount - 1; if (linecount < itemcount) { n = linecount / 2; if (index < n) topitem = 0; else if (index >= itemcount - n) topitem = itemcount - linecount; else topitem = index - n; } n = 0; SDL_FillRect(sdlg.screen, &area, bkgndcolor(sdlg.textclr)); memcpy(colstmp, cols, table->cols * sizeof *colstmp); drawtablerow(table, colstmp, &n, 0); for (j = 0 ; j < topitem ; ++j) drawtablerow(table, NULL, &n, 0); for ( ; j < topitem + linecount && j < itemcount ; ++j) drawtablerow(table, colstmp, &n, j == index ? PT_HILIGHT : 0); SDL_UpdateRect(sdlg.screen, 0, 0, 0, 0); n = SCROLL_NOP; } while ((*inputcallback)(&n)); if (n) *idx = index; free(cols); free(colstmp); cleardisplay(); return n; } /* Display a line of text, given by prompt, at the center of the display. * The callback function inputcallback is then called repeatedly to * obtain input characters, which are collected in input. maxlen sets an * upper limit to the length of the input so collected. */ int displayinputprompt(char const *prompt, char *input, int maxlen, int (*inputcallback)(void)) { SDL_Rect area, promptrect, inputrect; int len, ch; puttext(&inputrect, "W", 1, PT_CALCSIZE); inputrect.w *= maxlen + 1; puttext(&promptrect, prompt, -1, PT_CALCSIZE); area.h = inputrect.h + promptrect.h + 2 * MARGINH; if (inputrect.w > promptrect.w) area.w = inputrect.w; else area.w = promptrect.w; area.w += 2 * MARGINW; area.x = (screenw - area.w) / 2; area.y = (screenh - area.h) / 2; promptrect.x = area.x + MARGINW; promptrect.y = area.y + MARGINH; promptrect.w = area.w - 2 * MARGINW; inputrect.x = promptrect.x; inputrect.y = promptrect.y + promptrect.h; inputrect.w = promptrect.w; len = strlen(input); if (len > maxlen) len = maxlen; for (;;) { SDL_FillRect(sdlg.screen, &area, textcolor(sdlg.textclr)); ++area.x; ++area.y; area.w -= 2; area.h -= 2; SDL_FillRect(sdlg.screen, &area, bkgndcolor(sdlg.textclr)); --area.x; --area.y; area.w += 2; area.h += 2; puttext(&promptrect, prompt, -1, PT_CENTER); input[len] = '_'; puttext(&inputrect, input, len + 1, PT_CENTER); input[len] = '\0'; SDL_UpdateRect(sdlg.screen, area.x, area.y, area.w, area.h); ch = (*inputcallback)(); if (ch == '\n' || ch < 0) break; if (isprint(ch)) { input[len] = ch; if (len < maxlen) ++len; input[len] = '\0'; } else if (ch == '\b') { if (len) --len; input[len] = '\0'; } else if (ch == '\f') { len = 0; input[0] = '\0'; } else { /* no op */ } } cleardisplay(); return ch == '\n'; } /* Create a display surface appropriate to the requirements of the * game. */ int creategamedisplay(void) { if (!layoutscreen() || !createdisplay()) return FALSE; cleardisplay(); return TRUE; } /* Initialize the display with a generic surface capable of rendering * text. */ int _sdloutputinitialize(int _fullscreen) { sdlg.windowmapposfunc = _windowmappos; fullscreen = _fullscreen; screenw = 640; screenh = 480; promptloc.x = screenw - MARGINW - PROMPTICONW; promptloc.y = screenh - MARGINH - PROMPTICONH; promptloc.w = PROMPTICONW; promptloc.h = PROMPTICONH; createdisplay(); cleardisplay(); sdlg.textclr = makefontcolors(0, 0, 0, 255, 255, 255); sdlg.dimtextclr = makefontcolors(0, 0, 0, 192, 192, 192); sdlg.hilightclr = makefontcolors(0, 0, 0, 255, 255, 0); cleardisplay(); if (!createprompticons()) return FALSE; return TRUE; } tworld-1.3.0/oshw-sdl/sdlsfx.c0000644000175000017500000002270610406725441016405 0ustar breadboxbreadbox/* sdlsfx.c: Creating the program's sound effects. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include "SDL.h" #include "sdlgen.h" #include "../err.h" #include "../state.h" /* Some generic default settings for the audio output. */ #define DEFAULT_SND_FMT AUDIO_S16SYS #define DEFAULT_SND_FREQ 22050 #define DEFAULT_SND_CHAN 1 /* The data needed for each sound effect's wave. */ typedef struct sfxinfo { Uint8 *wave; /* the actual wave data */ Uint32 len; /* size of the wave data */ int pos; /* how much has been played already */ int playing; /* is the wave currently playing? */ char const *textsfx; /* the onomatopoeia string */ } sfxinfo; /* The data needed to talk to the sound output device. */ static SDL_AudioSpec spec; /* All of the sound effects. */ static sfxinfo sounds[SND_COUNT]; /* TRUE if sound-playing has been enabled. */ static int enabled = FALSE; /* TRUE if the program is currently talking to a sound device. */ static int hasaudio = FALSE; /* The volume level. */ static int volume = SDL_MIX_MAXVOLUME; /* The sound buffer size scaling factor. */ static int soundbufsize = 0; /* Initialize the textual sound effects. */ static void initonomatopoeia(void) { sounds[SND_CHIP_LOSES].textsfx = "\"Bummer\""; sounds[SND_CHIP_WINS].textsfx = "Tadaa!"; sounds[SND_TIME_OUT].textsfx = "Clang!"; sounds[SND_TIME_LOW].textsfx = "Ktick!"; sounds[SND_DEREZZ].textsfx = "Bzont!"; sounds[SND_CANT_MOVE].textsfx = "Mnphf!"; sounds[SND_IC_COLLECTED].textsfx = "Chack!"; sounds[SND_ITEM_COLLECTED].textsfx = "Slurp!"; sounds[SND_BOOTS_STOLEN].textsfx = "Flonk!"; sounds[SND_TELEPORTING].textsfx = "Bamff!"; sounds[SND_DOOR_OPENED].textsfx = "Spang!"; sounds[SND_SOCKET_OPENED].textsfx = "Clack!"; sounds[SND_BUTTON_PUSHED].textsfx = "Click!"; sounds[SND_BOMB_EXPLODES].textsfx = "Booom!"; sounds[SND_WATER_SPLASH].textsfx = "Plash!"; sounds[SND_TILE_EMPTIED].textsfx = "Whisk!"; sounds[SND_WALL_CREATED].textsfx = "Chunk!"; sounds[SND_TRAP_ENTERED].textsfx = "Shunk!"; sounds[SND_SKATING_TURN].textsfx = "Whing!"; sounds[SND_SKATING_FORWARD].textsfx = "Whizz ..."; sounds[SND_SLIDING].textsfx = "Drrrr ..."; sounds[SND_BLOCK_MOVING].textsfx = "Scrrr ..."; sounds[SND_SLIDEWALKING].textsfx = "slurp slurp ..."; sounds[SND_ICEWALKING].textsfx = "snick snick ..."; sounds[SND_WATERWALKING].textsfx = "plip plip ..."; sounds[SND_FIREWALKING].textsfx = "crackle crackle ..."; } /* Display the onomatopoeia for the currently playing sound effect. * Only the first sound is used, since we can't display multiple * strings. */ static void displaysoundeffects(unsigned long sfx, int display) { unsigned long flag; int i; if (!display) { setdisplaymsg(NULL, 0, 0); return; } for (flag = 1, i = 0 ; flag ; flag <<= 1, ++i) { if (sfx & flag) { setdisplaymsg(sounds[i].textsfx, 500, 10); return; } } } /* The callback function that is called by the sound driver to supply * the latest sound effects. All the sound effects are checked, and * the ones that are being played get another chunk of their sound * data mixed into the output buffer. When the end of a sound effect's * wave data is reached, the one-shot sounds are changed to be marked * as not playing, and the continuous sounds are looped. */ static void sfxcallback(void *data, Uint8 *wave, int len) { int i, n; (void)data; memset(wave, spec.silence, len); for (i = 0 ; i < SND_COUNT ; ++i) { if (!sounds[i].wave) continue; if (!sounds[i].playing) if (!sounds[i].pos || i >= SND_ONESHOT_COUNT) continue; n = sounds[i].len - sounds[i].pos; if (n > len) { SDL_MixAudio(wave, sounds[i].wave + sounds[i].pos, len, volume); sounds[i].pos += len; } else { SDL_MixAudio(wave, sounds[i].wave + sounds[i].pos, n, volume); sounds[i].pos = 0; if (i < SND_ONESHOT_COUNT) { sounds[i].playing = FALSE; } else if (sounds[i].playing) { while (len - n >= (int)sounds[i].len) { SDL_MixAudio(wave + n, sounds[i].wave, sounds[i].len, volume); n += sounds[i].len; } sounds[i].pos = len - n; SDL_MixAudio(wave + n, sounds[i].wave, sounds[i].pos, volume); } } } } /* * The exported functions. */ /* Activate or deactivate the sound system. When activating for the * first time, the connection to the sound device is established. When * deactivating, the connection is closed. */ int setaudiosystem(int active) { SDL_AudioSpec des; int n; if (!enabled) return !active; if (!active) { if (hasaudio) { SDL_PauseAudio(TRUE); SDL_CloseAudio(); hasaudio = FALSE; } return TRUE; } if (!SDL_WasInit(SDL_INIT_AUDIO)) { if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) { warn("Cannot initialize audio output: %s", SDL_GetError()); return FALSE; } } if (hasaudio) return TRUE; des.freq = DEFAULT_SND_FREQ; des.format = DEFAULT_SND_FMT; des.channels = DEFAULT_SND_CHAN; des.callback = sfxcallback; des.userdata = NULL; for (n = 1 ; n <= des.freq / TICKS_PER_SECOND ; n <<= 1) ; des.samples = (n << soundbufsize) >> 2; if (SDL_OpenAudio(&des, &spec) < 0) { warn("can't access audio output: %s", SDL_GetError()); return FALSE; } hasaudio = TRUE; SDL_PauseAudio(FALSE); return TRUE; } /* Load a single wave file into memory. The wave data is converted to * the format expected by the sound device. */ int loadsfxfromfile(int index, char const *filename) { SDL_AudioSpec specin; SDL_AudioCVT convert; Uint8 *wavein; Uint8 *wavecvt; Uint32 lengthin; if (!filename) { freesfx(index); return TRUE; } if (!enabled) return FALSE; if (!hasaudio) if (!setaudiosystem(TRUE)) return FALSE; if (!SDL_LoadWAV(filename, &specin, &wavein, &lengthin)) { warn("can't load %s: %s", filename, SDL_GetError()); return FALSE; } if (SDL_BuildAudioCVT(&convert, specin.format, specin.channels, specin.freq, spec.format, spec.channels, spec.freq) < 0) { warn("can't create converter for %s: %s", filename, SDL_GetError()); return FALSE; } if (!(wavecvt = malloc(lengthin * convert.len_mult))) memerrexit(); memcpy(wavecvt, wavein, lengthin); SDL_FreeWAV(wavein); convert.buf = wavecvt; convert.len = lengthin; if (SDL_ConvertAudio(&convert) < 0) { warn("can't convert %s: %s", filename, SDL_GetError()); return FALSE; } freesfx(index); SDL_LockAudio(); sounds[index].wave = convert.buf; sounds[index].len = convert.len * convert.len_ratio; sounds[index].pos = 0; sounds[index].playing = FALSE; SDL_UnlockAudio(); return TRUE; } /* Select the sounds effects to be played. sfx is a bitmask of sound * effect indexes. Any continuous sounds that are not included in sfx * are stopped. One-shot sounds that are included in sfx are * restarted. */ void playsoundeffects(unsigned long sfx) { unsigned long flag; int i; if (!hasaudio || !volume) { displaysoundeffects(sfx, TRUE); return; } SDL_LockAudio(); for (i = 0, flag = 1 ; i < SND_COUNT ; ++i, flag <<= 1) { if (sfx & flag) { sounds[i].playing = TRUE; if (sounds[i].pos && i < SND_ONESHOT_COUNT) sounds[i].pos = 0; } else { if (i >= SND_ONESHOT_COUNT) sounds[i].playing = FALSE; } } SDL_UnlockAudio(); } /* If action is negative, stop playing all sounds immediately. * Otherwise, just temporarily pause or unpause sound-playing. */ void setsoundeffects(int action) { int i; if (!hasaudio || !volume) return; if (action < 0) { SDL_LockAudio(); for (i = 0 ; i < SND_COUNT ; ++i) { sounds[i].playing = FALSE; sounds[i].pos = 0; } SDL_UnlockAudio(); } else { SDL_PauseAudio(!action); } } /* Release all memory for the given sound effect. */ void freesfx(int index) { if (sounds[index].wave) { SDL_LockAudio(); free(sounds[index].wave); sounds[index].wave = NULL; sounds[index].pos = 0; sounds[index].playing = FALSE; SDL_UnlockAudio(); } } /* Set the current volume level to v. If display is true, the * new volume level is displayed to the user. */ int setvolume(int v, int display) { char buf[16]; if (!hasaudio) return FALSE; if (v < 0) v = 0; else if (v > 10) v = 10; if (!volume && v) displaysoundeffects(0, FALSE); volume = (SDL_MIX_MAXVOLUME * v + 9) / 10; if (display) { sprintf(buf, "Volume: %d", v); setdisplaymsg(buf, 1000, 1000); } return TRUE; } /* Change the current volume level by delta. If display is true, the * new volume level is displayed to the user. */ int changevolume(int delta, int display) { return setvolume(((10 * volume) / SDL_MIX_MAXVOLUME) + delta, display); } /* Shut down the sound system. */ static void shutdown(void) { setaudiosystem(FALSE); if (SDL_WasInit(SDL_INIT_AUDIO)) SDL_QuitSubSystem(SDL_INIT_AUDIO); hasaudio = FALSE; } /* Initialize the module. If silence is TRUE, then the program will * leave sound output disabled. */ int _sdlsfxinitialize(int silence, int _soundbufsize) { atexit(shutdown); enabled = !silence; soundbufsize = _soundbufsize; initonomatopoeia(); if (enabled) setaudiosystem(TRUE); return TRUE; } tworld-1.3.0/oshw-sdl/sdltext.c0000644000175000017500000003403510420643665016572 0ustar breadboxbreadbox/* sdltext.c: Font-rendering functions for SDL. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include "SDL.h" #include "sdlgen.h" #include "../err.h" /* Accept a bitmap as an 8-bit SDL surface and from it extract the * glyphs of a font. (See the documentation included in the Tile World * distribution for specifics regarding the bitmap layout.) */ static int makefontfromsurface(fontinfo *pf, SDL_Surface *surface) { char brk[267]; unsigned char *p; unsigned char *dest; Uint8 foregnd, bkgnd; int pitch, wsum; int count, ch; int x, y, x0, y0, w; if (surface->format->BytesPerPixel != 1) return FALSE; if (SDL_MUSTLOCK(surface)) SDL_LockSurface(surface); pitch = surface->pitch; p = surface->pixels; foregnd = p[0]; bkgnd = p[pitch]; for (y = 1, p += pitch ; y < surface->h && *p == bkgnd ; ++y, p += pitch) ; pf->h = y - 1; wsum = 0; ch = 32; memset(pf->w, 0, sizeof pf->w); memset(brk, 0, sizeof brk); for (y = 0 ; y + pf->h < surface->h && ch < 256 ; y += pf->h + 1) { p = surface->pixels; p += y * pitch; x0 = 1; for (x = 1 ; x < surface->w ; ++x) { if (p[x] == bkgnd) continue; w = x - x0; x0 = x + 1; pf->w[ch] = w; wsum += w; ++ch; if (ch == 127) ch = 144; else if (ch == 154) ch = 160; else if (ch == 256) break; } brk[ch] = 1; } count = ch; if (!(pf->memory = calloc(wsum, pf->h))) memerrexit(); x0 = 1; y0 = 1; dest = pf->memory; for (ch = 0 ; ch < 256 ; ++ch) { pf->bits[ch] = dest; if (pf->w[ch] == 0) continue; if (brk[ch]) { x0 = 1; y0 += pf->h + 1; } p = surface->pixels; p += y0 * pitch + x0; for (y = 0 ; y < pf->h ; ++y, p += pitch) for (x = 0 ; x < pf->w[ch] ; ++x, ++dest) *dest = p[x] == bkgnd ? 0 : p[x] == foregnd ? 2 : 1; x0 += pf->w[ch] + 1; } if (SDL_MUSTLOCK(surface)) SDL_UnlockSurface(surface); return TRUE; } /* Given a text and a maximum horizontal space to occupy, return * the amount of vertial space needed to render the entire text with * word-wrapping. */ static int measuremltext(unsigned char const *text, int len, int maxwidth) { int brk, w, h, n; if (len < 0) len = strlen((char const*)text); h = 0; brk = 0; for (n = 0, w = 0 ; n < len ; ++n) { w += sdlg.font.w[text[n]]; if (isspace(text[n])) { brk = w; } else if (w > maxwidth) { h += sdlg.font.h; if (brk) { w -= brk; brk = 0; } else { w = sdlg.font.w[text[n]]; brk = 0; } } } if (w) h += sdlg.font.h; return h; } /* * Render a single line of pixels of the given text to a locked * surface at scanline. w specifies the total number of pixels to * render. (Any pixels remaining after the last glyph has been * rendered are set to the background color.) y specifies the vertical * coordinate of the line to render relative to the font glyphs. A * separate function is supplied for each possible surface depth. */ static void *drawtextscanline8(Uint8 *scanline, int w, int y, Uint32 *clr, unsigned char const *text, int len) { unsigned char const *glyph; int n, x; for (n = 0 ; n < len ; ++n) { glyph = sdlg.font.bits[text[n]]; glyph += y * sdlg.font.w[text[n]]; for (x = 0 ; w && x < sdlg.font.w[text[n]] ; ++x, --w) scanline[x] = (Uint8)clr[glyph[x]]; scanline += x; } while (w--) *scanline++ = (Uint8)clr[0]; return scanline; } static void *drawtextscanline16(Uint16 *scanline, int w, int y, Uint32 *clr, unsigned char const *text, int len) { unsigned char const *glyph; int n, x; for (n = 0 ; n < len ; ++n) { glyph = sdlg.font.bits[text[n]]; glyph += y * sdlg.font.w[text[n]]; for (x = 0 ; w && x < sdlg.font.w[text[n]] ; ++x, --w) scanline[x] = (Uint16)clr[glyph[x]]; scanline += x; } while (w--) *scanline++ = (Uint16)clr[0]; return scanline; } static void *drawtextscanline24(Uint8 *scanline, int w, int y, Uint32 *clr, unsigned char const *text, int len) { unsigned char const *glyph; Uint32 c; int n, x; for (n = 0 ; n < len ; ++n) { glyph = sdlg.font.bits[text[n]]; glyph += y * sdlg.font.w[text[n]]; for (x = 0 ; w && x < sdlg.font.w[text[n]] ; ++x, --w) { c = clr[glyph[x]]; #if SDL_BYTEORDER == SDL_BIG_ENDIAN *scanline++ = (Uint8)(c >> 16); *scanline++ = (Uint8)(c >> 8); *scanline++ = (Uint8)c; #else *scanline++ = (Uint8)c; *scanline++ = (Uint8)(c >> 8); *scanline++ = (Uint8)(c >> 16); #endif } } c = clr[0]; while (w--) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN *scanline++ = (Uint8)(c >> 16); *scanline++ = (Uint8)(c >> 8); *scanline++ = (Uint8)c; #else *scanline++ = (Uint8)c; *scanline++ = (Uint8)(c >> 8); *scanline++ = (Uint8)(c >> 16); #endif } return scanline; } static void *drawtextscanline32(Uint32 *scanline, int w, int y, Uint32 *clr, unsigned char const *text, int len) { unsigned char const *glyph; int n, x; for (n = 0 ; n < len ; ++n) { glyph = sdlg.font.bits[text[n]]; glyph += y * sdlg.font.w[text[n]]; for (x = 0 ; w && x < sdlg.font.w[text[n]] ; ++x, --w) scanline[x] = clr[glyph[x]]; scanline += x; } while (w--) *scanline++ = clr[0]; return scanline; } /* * The main font-rendering functions. */ /* Draw a single line of text to the screen at the position given by * rect. The bitflags in the final argument control the placement of * text within rect and what colors to use. */ static void drawtext(SDL_Rect *rect, unsigned char const *text, int len, int flags) { Uint32 *clr; void *p; void *q; int l, r; int pitch, bpp, n, w, y; if (len < 0) len = text ? strlen((char const*)text) : 0; w = 0; for (n = 0 ; n < len ; ++n) w += sdlg.font.w[text[n]]; if (flags & PT_CALCSIZE) { rect->h = sdlg.font.h; rect->w = w; return; } if (w >= rect->w) { w = rect->w; l = r = 0; } else if (flags & PT_RIGHT) { l = rect->w - w; r = 0; } else if (flags & PT_CENTER) { l = (rect->w - w) / 2; r = (rect->w - w) - l; } else { l = 0; r = rect->w - w; } if (flags & PT_DIM) clr = sdlg.dimtextclr.c; else if (flags & PT_HILIGHT) clr = sdlg.hilightclr.c; else clr = sdlg.textclr.c; pitch = sdlg.screen->pitch; bpp = sdlg.screen->format->BytesPerPixel; p = (unsigned char*)sdlg.screen->pixels + rect->y * pitch + rect->x * bpp; for (y = 0 ; y < sdlg.font.h && y < rect->h ; ++y) { switch (bpp) { case 1: q = drawtextscanline8(p, l, y, clr, NULL, 0); q = drawtextscanline8(q, w, y, clr, text, len); q = drawtextscanline8(q, r, y, clr, NULL, 0); break; case 2: q = drawtextscanline16(p, l, y, clr, NULL, 0); q = drawtextscanline16(q, w, y, clr, text, len); q = drawtextscanline16(q, r, y, clr, NULL, 0); break; case 3: q = drawtextscanline24(p, l, y, clr, NULL, 0); q = drawtextscanline24(q, w, y, clr, text, len); q = drawtextscanline24(q, r, y, clr, NULL, 0); break; case 4: q = drawtextscanline32(p, l, y, clr, NULL, 0); q = drawtextscanline32(q, w, y, clr, text, len); q = drawtextscanline32(q, r, y, clr, NULL, 0); break; } p = (unsigned char*)p + pitch; } if (flags & PT_UPDATERECT) { rect->y += y; rect->h -= y; } } /* Draw one or more lines of text to the screen at the position given by * rect. The text is broken up on whitespace whenever possible. */ static void drawmultilinetext(SDL_Rect *rect, unsigned char const *text, int len, int flags) { SDL_Rect area; int index, brkw, brkn; int w, n; if (flags & PT_CALCSIZE) { rect->h = measuremltext(text, len, rect->w); return; } if (len < 0) len = strlen((char const*)text); area = *rect; brkw = brkn = 0; index = 0; for (n = 0, w = 0 ; n < len ; ++n) { w += sdlg.font.w[text[n]]; if (isspace(text[n])) { brkn = n; brkw = w; } else if (w > rect->w) { if (brkw) { drawtext(&area, text + index, brkn - index, flags | PT_UPDATERECT); index = brkn + 1; w -= brkw; } else { drawtext(&area, text + index, n - index, flags | PT_UPDATERECT); index = n; w = sdlg.font.w[text[n]]; } brkw = 0; } } if (w) drawtext(&area, text + index, len - index, flags | PT_UPDATERECT); if (flags & PT_UPDATERECT) { *rect = area; } else { while (area.h) drawtext(&area, NULL, 0, PT_UPDATERECT); } } /* * The exported functions. */ /* Render a string of text. */ static void _puttext(SDL_Rect *rect, char const *text, int len, int flags) { if (!sdlg.font.h) die("no font available! (how did I get this far?)"); if (len < 0) len = text ? strlen(text) : 0; if (SDL_MUSTLOCK(sdlg.screen)) SDL_LockSurface(sdlg.screen); if (flags & PT_MULTILINE) drawmultilinetext(rect, (unsigned char const*)text, len, flags); else drawtext(rect, (unsigned char const*)text, len, flags); if (SDL_MUSTLOCK(sdlg.screen)) SDL_UnlockSurface(sdlg.screen); } /* Lay out the columns of the given table so that the entire table * fits within area (horizontally; no attempt is made to make it fit * vertically). Return an array of rectangles, one per column. This * function is essentially the same algorithm used within printtable() * in tworld.c */ static SDL_Rect *_measuretable(SDL_Rect const *area, tablespec const *table) { SDL_Rect *colsizes; unsigned char const *p; int sep, mlindex, mlwidth, diff; int i, j, n, i0, c, w, x; if (!(colsizes = malloc(table->cols * sizeof *colsizes))) memerrexit(); for (i = 0 ; i < table->cols ; ++i) { colsizes[i].x = 0; colsizes[i].y = area->y; colsizes[i].w = 0; colsizes[i].h = area->h; } mlindex = -1; mlwidth = 0; n = 0; for (j = 0 ; j < table->rows ; ++j) { for (i = 0 ; i < table->cols ; ++n) { c = table->items[n][0] - '0'; if (c == 1) { w = 0; p = (unsigned char const*)table->items[n]; for (p += 2 ; *p ; ++p) w += sdlg.font.w[*p]; if (table->items[n][1] == '!') { if (w > mlwidth || mlindex != i) mlwidth = w; mlindex = i; } else { if (w > colsizes[i].w) colsizes[i].w = w; } } i += c; } } sep = sdlg.font.w[' '] * table->sep; w = -sep; for (i = 0 ; i < table->cols ; ++i) w += colsizes[i].w + sep; diff = area->w - w; if (diff < 0 && table->collapse >= 0) { w = -diff; if (colsizes[table->collapse].w < w) w = colsizes[table->collapse].w - sdlg.font.w[' ']; colsizes[table->collapse].w -= w; diff += w; } if (diff > 0) { n = 0; for (j = 0 ; j < table->rows && diff > 0 ; ++j) { for (i = 0 ; i < table->cols ; ++n) { c = table->items[n][0] - '0'; if (c > 1 && table->items[n][1] != '!') { w = sep; p = (unsigned char const*)table->items[n]; for (p += 2 ; *p ; ++p) w += sdlg.font.w[*p]; for (i0 = i ; i0 < i + c ; ++i0) w -= colsizes[i0].w + sep; if (w > 0) { if (table->collapse >= i && table->collapse < i + c) i0 = table->collapse; else if (mlindex >= i && mlindex < i + c) i0 = mlindex; else i0 = i + c - 1; if (w > diff) w = diff; colsizes[i0].w += w; diff -= w; if (diff == 0) break; } } i += c; } } } if (diff > 0 && mlindex >= 0 && colsizes[mlindex].w < mlwidth) { mlwidth -= colsizes[mlindex].w; w = mlwidth < diff ? mlwidth : diff; colsizes[mlindex].w += w; diff -= w; } x = 0; for (i = 0 ; i < table->cols && x < area->w ; ++i) { colsizes[i].x = area->x + x; x += colsizes[i].w + sep; if (x >= area->w) colsizes[i].w = area->x + area->w - colsizes[i].x; } for ( ; i < table->cols ; ++i) { colsizes[i].x = area->x + area->w; colsizes[i].w = 0; } return colsizes; } /* Render a single row of a table to the screen, using cols to locate * the entries in the individual columns. */ static int _drawtablerow(tablespec const *table, SDL_Rect *cols, int *row, int flags) { SDL_Rect rect; unsigned char const *p; int c, f, n, i, y; if (!cols) { for (i = 0 ; i < table->cols ; i += table->items[(*row)++][0] - '0') ; return TRUE; } if (SDL_MUSTLOCK(sdlg.screen)) SDL_LockSurface(sdlg.screen); y = cols[0].y; n = *row; for (i = 0 ; i < table->cols ; ++n) { p = (unsigned char const*)table->items[n]; c = p[0] - '0'; rect = cols[i]; i += c; if (c > 1) rect.w = cols[i - 1].x + cols[i - 1].w - rect.x; f = flags | PT_UPDATERECT; if (p[1] == '+') f |= PT_RIGHT; else if (p[1] == '.') f |= PT_CENTER; if (p[1] == '!') drawmultilinetext(&rect, p + 2, -1, f); else drawtext(&rect, p + 2, -1, f); if (rect.y > y) y = rect.y; } if (SDL_MUSTLOCK(sdlg.screen)) SDL_UnlockSurface(sdlg.screen); *row = n; for (i = 0 ; i < table->cols ; ++i) { cols[i].h -= y - cols[i].y; cols[i].y = y; } return TRUE; } /* Free the resources associated with a font. */ void freefont(void) { if (sdlg.font.h) { free(sdlg.font.memory); sdlg.font.memory = NULL; sdlg.font.h = 0; } } /* Load the font contained in the given bitmap file. Error messages * will be displayed if complain is TRUE. The return value is TRUE if * the font was successfully retrieved. */ int loadfontfromfile(char const *filename, int complain) { SDL_Surface *bmp; fontinfo font; bmp = SDL_LoadBMP(filename); if (!bmp) { if (complain) errmsg(filename, "can't load font bitmap: %s", SDL_GetError()); return FALSE; } if (!makefontfromsurface(&font, bmp)) { if (complain) errmsg(filename, "invalid font file"); return FALSE; } SDL_FreeSurface(bmp); freefont(); sdlg.font = font; return TRUE; } /* Initialize the module. */ int _sdltextinitialize(void) { sdlg.font.h = 0; sdlg.puttextfunc = _puttext; sdlg.measuretablefunc = _measuretable; sdlg.drawtablerowfunc = _drawtablerow; return TRUE; } tworld-1.3.0/oshw-sdl/sdltile.c0000644000175000017500000010436110416125464016540 0ustar breadboxbreadbox/* sdltile.c: Functions for rendering tile images. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include "SDL.h" #include "sdlgen.h" #include "../err.h" #include "../state.h" /* Direction offsets. */ #define _NORTH + 0 #define _WEST + 1 #define _SOUTH + 2 #define _EAST + 3 /* The total number of tile images. */ #define NTILES 128 /* Flags that indicate the size and shape of an oversized * (transparent) tile image. */ #define SIZE_EXTLEFT 0x01 /* image extended leftwards by one tile */ #define SIZE_EXTRIGHT 0x02 /* image extended rightwards by one tile */ #define SIZE_EXTUP 0x04 /* image extended upwards by one tile */ #define SIZE_EXTDOWN 0x08 /* image extended downards by one tile */ #define SIZE_EXTALL 0x0F /* image is 3x3 tiles in size */ /* Structure providing pointers to the various tile images available * for a given id. */ typedef struct tilemap { SDL_Surface *opaque[16]; /* one or more opaque images */ SDL_Surface *transp[16]; /* one or more transparent images */ char celcount; /* count of animated images */ char transpsize; /* flags for the transparent size */ } tilemap; /* Different types of tile images as stored in the large format bitmap. */ enum { TILEIMG_IMPLICIT = 0, /* tile is not in the bitmap */ TILEIMG_SINGLEOPAQUE, /* a single opaque image */ TILEIMG_OPAQUECELS, /* one or more opaque images */ TILEIMG_TRANSPCELS, /* one or more transparent images */ TILEIMG_CREATURE, /* one of the creature formats */ TILEIMG_ANIMATION /* twelve transparent images */ }; /* Structure indicating where to find the various tile images in a * tile bitmap. The opaque and transp fields give the coordinates of * the tile in the small-format and masked-format bitmaps. For a * large-format bitmap, the ordering of the array determines the order * in which tile images are stored. The shape field defines what sort * of tile image is expected in the large-format bitmap. */ typedef struct tileidinfo { int id; /* the tile ID */ signed char xopaque; /* the coordinates of the opaque image */ signed char yopaque; /* (expressed in tiles, not pixels) */ signed char xtransp; /* coordinates of the transparent image */ signed char ytransp; /* (also expressed in tiles) */ int shape; /* enum values for the free-form bitmap */ } tileidinfo; /* The list of tile images. */ static tileidinfo const tileidmap[NTILES] = { { Empty, 0, 0, -1, -1, TILEIMG_SINGLEOPAQUE }, { Slide_North, 1, 2, -1, -1, TILEIMG_OPAQUECELS }, { Slide_West, 1, 4, -1, -1, TILEIMG_OPAQUECELS }, { Slide_South, 0, 13, -1, -1, TILEIMG_OPAQUECELS }, { Slide_East, 1, 3, -1, -1, TILEIMG_OPAQUECELS }, { Slide_Random, 3, 2, -1, -1, TILEIMG_OPAQUECELS }, { Ice, 0, 12, -1, -1, TILEIMG_OPAQUECELS }, { IceWall_Northwest, 1, 12, -1, -1, TILEIMG_OPAQUECELS }, { IceWall_Northeast, 1, 13, -1, -1, TILEIMG_OPAQUECELS }, { IceWall_Southwest, 1, 11, -1, -1, TILEIMG_OPAQUECELS }, { IceWall_Southeast, 1, 10, -1, -1, TILEIMG_OPAQUECELS }, { Gravel, 2, 13, -1, -1, TILEIMG_OPAQUECELS }, { Dirt, 0, 11, -1, -1, TILEIMG_OPAQUECELS }, { Water, 0, 3, -1, -1, TILEIMG_OPAQUECELS }, { Fire, 0, 4, -1, -1, TILEIMG_OPAQUECELS }, { Bomb, 2, 10, -1, -1, TILEIMG_OPAQUECELS }, { Beartrap, 2, 11, -1, -1, TILEIMG_OPAQUECELS }, { Burglar, 2, 1, -1, -1, TILEIMG_OPAQUECELS }, { HintButton, 2, 15, -1, -1, TILEIMG_OPAQUECELS }, { Button_Blue, 2, 8, -1, -1, TILEIMG_OPAQUECELS }, { Button_Green, 2, 3, -1, -1, TILEIMG_OPAQUECELS }, { Button_Red, 2, 4, -1, -1, TILEIMG_OPAQUECELS }, { Button_Brown, 2, 7, -1, -1, TILEIMG_OPAQUECELS }, { Teleport, 2, 9, -1, -1, TILEIMG_OPAQUECELS }, { Wall, 0, 1, -1, -1, TILEIMG_OPAQUECELS }, { Wall_North, 0, 6, -1, -1, TILEIMG_OPAQUECELS }, { Wall_West, 0, 7, -1, -1, TILEIMG_OPAQUECELS }, { Wall_South, 0, 8, -1, -1, TILEIMG_OPAQUECELS }, { Wall_East, 0, 9, -1, -1, TILEIMG_OPAQUECELS }, { Wall_Southeast, 3, 0, -1, -1, TILEIMG_OPAQUECELS }, { HiddenWall_Perm, 0, 5, -1, -1, TILEIMG_IMPLICIT }, { HiddenWall_Temp, 2, 12, -1, -1, TILEIMG_IMPLICIT }, { BlueWall_Real, 1, 14, -1, -1, TILEIMG_OPAQUECELS }, { BlueWall_Fake, 1, 15, -1, -1, TILEIMG_IMPLICIT }, { SwitchWall_Open, 2, 6, -1, -1, TILEIMG_OPAQUECELS }, { SwitchWall_Closed, 2, 5, -1, -1, TILEIMG_OPAQUECELS }, { PopupWall, 2, 14, -1, -1, TILEIMG_OPAQUECELS }, { CloneMachine, 3, 1, -1, -1, TILEIMG_OPAQUECELS }, { Door_Red, 1, 7, -1, -1, TILEIMG_OPAQUECELS }, { Door_Blue, 1, 6, -1, -1, TILEIMG_OPAQUECELS }, { Door_Yellow, 1, 9, -1, -1, TILEIMG_OPAQUECELS }, { Door_Green, 1, 8, -1, -1, TILEIMG_OPAQUECELS }, { Socket, 2, 2, -1, -1, TILEIMG_OPAQUECELS }, { Exit, 1, 5, -1, -1, TILEIMG_OPAQUECELS }, { ICChip, 0, 2, -1, -1, TILEIMG_OPAQUECELS }, { Key_Red, 6, 5, 9, 5, TILEIMG_TRANSPCELS }, { Key_Blue, 6, 4, 9, 4, TILEIMG_TRANSPCELS }, { Key_Yellow, 6, 7, 9, 7, TILEIMG_TRANSPCELS }, { Key_Green, 6, 6, 9, 6, TILEIMG_TRANSPCELS }, { Boots_Ice, 6, 10, 9, 10, TILEIMG_TRANSPCELS }, { Boots_Slide, 6, 11, 9, 11, TILEIMG_TRANSPCELS }, { Boots_Fire, 6, 9, 9, 9, TILEIMG_TRANSPCELS }, { Boots_Water, 6, 8, 9, 8, TILEIMG_TRANSPCELS }, { Block_Static, 0, 10, -1, -1, TILEIMG_IMPLICIT }, { Overlay_Buffer, 2, 0, -1, -1, TILEIMG_IMPLICIT }, { Exit_Extra_1, 3, 10, -1, -1, TILEIMG_SINGLEOPAQUE }, { Exit_Extra_2, 3, 11, -1, -1, TILEIMG_SINGLEOPAQUE }, { Burned_Chip, 3, 4, -1, -1, TILEIMG_SINGLEOPAQUE }, { Bombed_Chip, 3, 5, -1, -1, TILEIMG_SINGLEOPAQUE }, { Exited_Chip, 3, 9, -1, -1, TILEIMG_SINGLEOPAQUE }, { Drowned_Chip, 3, 3, -1, -1, TILEIMG_SINGLEOPAQUE }, { Swimming_Chip _NORTH, 3, 12, -1, -1, TILEIMG_SINGLEOPAQUE }, { Swimming_Chip _WEST, 3, 13, -1, -1, TILEIMG_SINGLEOPAQUE }, { Swimming_Chip _SOUTH, 3, 14, -1, -1, TILEIMG_SINGLEOPAQUE }, { Swimming_Chip _EAST, 3, 15, -1, -1, TILEIMG_SINGLEOPAQUE }, { Chip _NORTH, 6, 12, 9, 12, TILEIMG_CREATURE }, { Chip _WEST, 6, 13, 9, 13, TILEIMG_IMPLICIT }, { Chip _SOUTH, 6, 14, 9, 14, TILEIMG_IMPLICIT }, { Chip _EAST, 6, 15, 9, 15, TILEIMG_IMPLICIT }, { Pushing_Chip _NORTH, 6, 12, 9, 12, TILEIMG_CREATURE }, { Pushing_Chip _WEST, 6, 13, 9, 13, TILEIMG_IMPLICIT }, { Pushing_Chip _SOUTH, 6, 14, 9, 14, TILEIMG_IMPLICIT }, { Pushing_Chip _EAST, 6, 15, 9, 15, TILEIMG_IMPLICIT }, { Block _NORTH, 0, 14, -1, -1, TILEIMG_CREATURE }, { Block _WEST, 0, 15, -1, -1, TILEIMG_IMPLICIT }, { Block _SOUTH, 1, 0, -1, -1, TILEIMG_IMPLICIT }, { Block _EAST, 1, 1, -1, -1, TILEIMG_IMPLICIT }, { Tank _NORTH, 4, 12, 7, 12, TILEIMG_CREATURE }, { Tank _WEST, 4, 13, 7, 13, TILEIMG_IMPLICIT }, { Tank _SOUTH, 4, 14, 7, 14, TILEIMG_IMPLICIT }, { Tank _EAST, 4, 15, 7, 15, TILEIMG_IMPLICIT }, { Ball _NORTH, 4, 8, 7, 8, TILEIMG_CREATURE }, { Ball _WEST, 4, 9, 7, 9, TILEIMG_IMPLICIT }, { Ball _SOUTH, 4, 10, 7, 10, TILEIMG_IMPLICIT }, { Ball _EAST, 4, 11, 7, 11, TILEIMG_IMPLICIT }, { Glider _NORTH, 5, 0, 8, 0, TILEIMG_CREATURE }, { Glider _WEST, 5, 1, 8, 1, TILEIMG_IMPLICIT }, { Glider _SOUTH, 5, 2, 8, 2, TILEIMG_IMPLICIT }, { Glider _EAST, 5, 3, 8, 3, TILEIMG_IMPLICIT }, { Fireball _NORTH, 4, 4, 7, 4, TILEIMG_CREATURE }, { Fireball _WEST, 4, 5, 7, 5, TILEIMG_IMPLICIT }, { Fireball _SOUTH, 4, 6, 7, 6, TILEIMG_IMPLICIT }, { Fireball _EAST, 4, 7, 7, 7, TILEIMG_IMPLICIT }, { Bug _NORTH, 4, 0, 7, 0, TILEIMG_CREATURE }, { Bug _WEST, 4, 1, 7, 1, TILEIMG_IMPLICIT }, { Bug _SOUTH, 4, 2, 7, 2, TILEIMG_IMPLICIT }, { Bug _EAST, 4, 3, 7, 3, TILEIMG_IMPLICIT }, { Paramecium _NORTH, 6, 0, 9, 0, TILEIMG_CREATURE }, { Paramecium _WEST, 6, 1, 9, 1, TILEIMG_IMPLICIT }, { Paramecium _SOUTH, 6, 2, 9, 2, TILEIMG_IMPLICIT }, { Paramecium _EAST, 6, 3, 9, 3, TILEIMG_IMPLICIT }, { Teeth _NORTH, 5, 4, 8, 4, TILEIMG_CREATURE }, { Teeth _WEST, 5, 5, 8, 5, TILEIMG_IMPLICIT }, { Teeth _SOUTH, 5, 6, 8, 6, TILEIMG_IMPLICIT }, { Teeth _EAST, 5, 7, 8, 7, TILEIMG_IMPLICIT }, { Blob _NORTH, 5, 12, 8, 12, TILEIMG_CREATURE }, { Blob _WEST, 5, 13, 8, 13, TILEIMG_IMPLICIT }, { Blob _SOUTH, 5, 14, 8, 14, TILEIMG_IMPLICIT }, { Blob _EAST, 5, 15, 8, 15, TILEIMG_IMPLICIT }, { Walker _NORTH, 5, 8, 8, 8, TILEIMG_CREATURE }, { Walker _WEST, 5, 9, 8, 9, TILEIMG_IMPLICIT }, { Walker _SOUTH, 5, 10, 8, 10, TILEIMG_IMPLICIT }, { Walker _EAST, 5, 11, 8, 11, TILEIMG_IMPLICIT }, { Water_Splash, 3, 3, -1, -1, TILEIMG_ANIMATION }, { Bomb_Explosion, 3, 6, -1, -1, TILEIMG_ANIMATION }, { Entity_Explosion, 3, 7, -1, -1, TILEIMG_ANIMATION } }; /* The heap of remembered surfaces. */ static SDL_Surface **surfaceheap = NULL; static int surfacesused = 0; static int surfacesallocated = 0; /* The directory of tile images. */ static tilemap tileptr[NTILES]; /* An internal buffer surface. */ static SDL_Surface *opaquetile = NULL; /* Create a fresh surface. If transparency is true, the surface is * created with 32-bit pixels, so as to ensure a complete alpha * channel. Otherwise, the surface is created with the same format as * the screen. */ static SDL_Surface *newsurface(int w, int h, int transparency) { SDL_Surface *s; if (transparency) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN s = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA | SDL_RLEACCEL, w, h, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); #else s = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA | SDL_RLEACCEL, w, h, 32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); #endif } else { s = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, sdlg.screen->format->BitsPerPixel, sdlg.screen->format->Rmask, sdlg.screen->format->Gmask, sdlg.screen->format->Bmask, sdlg.screen->format->Amask); } if (!s) die("couldn't create surface: %s", SDL_GetError()); if (!transparency && sdlg.screen->format->palette) SDL_SetColors(s, sdlg.screen->format->palette->colors, 0, sdlg.screen->format->palette->ncolors); return s; } /* Add the given surface to the heap of remembered surfaces. */ static void remembersurface(SDL_Surface *surface) { if (surfacesused >= surfacesallocated) { surfacesallocated += 256; xalloc(surfaceheap, surfacesallocated * sizeof *surfaceheap); } surfaceheap[surfacesused++] = surface; } /* Free all surfaces on the heap. */ static void freerememberedsurfaces(void) { int n; for (n = 0 ; n < surfacesused ; ++n) if (surfaceheap[n]) SDL_FreeSurface(surfaceheap[n]); free(surfaceheap); surfaceheap = NULL; surfacesused = 0; surfacesallocated = 0; } /* Set the size of one tile. FALSE is returned if the dimensions are * invalid. */ static int settilesize(int w, int h) { if (w % 4 || h % 4) { warn("tile dimensions must be divisible by four"); return FALSE; } sdlg.wtile = w; sdlg.htile = h; sdlg.cptile = w * h; opaquetile = newsurface(w, h, FALSE); remembersurface(opaquetile); return TRUE; } /* * Functions for using tile images. */ /* Overlay a transparent tile image into the given tile-sized buffer. * index supplies the index of the transparent image. */ static void addtransparenttile(SDL_Surface *dest, int id, int index) { SDL_Surface *src; SDL_Rect rect = { 0, 0, sdlg.wtile, sdlg.htile }; src = tileptr[id].transp[index]; if (tileptr[id].transpsize & SIZE_EXTLEFT) rect.x += sdlg.wtile; if (tileptr[id].transpsize & SIZE_EXTUP) rect.y += sdlg.htile; SDL_BlitSurface(src, &rect, dest, NULL); } /* Return a surface for the given creature or animation. rect is * assumed to point to an "integral" tile location, so if moving is * non-zero, the dir and moving values are used to adjust rect to * point to the exact mid-tile position. rect is also adjusted * appropriately when the creature's image is larger than a single * tile. */ static SDL_Surface *_getcreatureimage(SDL_Rect *rect, int id, int dir, int moving, int frame) { SDL_Surface *s; tilemap const *q; int n; if (!rect) die("getcreatureimage() called without a rect"); q = tileptr + id; if (!isanimation(id)) q += diridx(dir); if (!q->transpsize || isanimation(id)) { if (moving > 0) { switch (dir) { case NORTH: rect->y += moving * sdlg.htile / 8; break; case WEST: rect->x += moving * sdlg.wtile / 8; break; case SOUTH: rect->y -= moving * sdlg.htile / 8; break; case EAST: rect->x -= moving * sdlg.wtile / 8; break; } } } if (q->transpsize) { if (q->transpsize & SIZE_EXTLEFT) rect->x -= sdlg.wtile; if (q->transpsize & SIZE_EXTUP) rect->y -= sdlg.htile; } n = q->celcount > 1 ? frame : 0; if (n >= q->celcount) die("requested cel #%d from a %d-cel sequence (%d+%d)", n, q->celcount, id, diridx(dir)); s = q->transp[n] ? q->transp[n] : q->opaque[n]; rect->w = s->w; rect->h = s->h; return s; } /* Return an image of a cell with the given tiles. If the top tile is * transparent, the appropriate composite image is constructed in the * overlay buffer. (If the top tile is opaque but has transparent * pixels, the image returned is constructed in a private surface). If * rect is not NULL, the width and height fields are filled in. */ static SDL_Surface *_getcellimage(SDL_Rect *rect, int top, int bot, int timerval) { SDL_Surface *dest; int nt, nb; if (!tileptr[top].celcount) die("map element %02X has no suitable image", top); if (rect) { rect->w = sdlg.wtile; rect->h = sdlg.htile; } nt = (timerval + 1) % tileptr[top].celcount; if (bot == Nothing || bot == Empty || !tileptr[top].transp[0]) { if (tileptr[top].opaque[nt]) return tileptr[top].opaque[nt]; SDL_BlitSurface(tileptr[Empty].opaque[0], NULL, opaquetile, NULL); addtransparenttile(opaquetile, top, nt); return opaquetile; } if (!tileptr[bot].celcount) die("map element %02X has no suitable image", bot); nb = (timerval + 1) % tileptr[bot].celcount; dest = tileptr[Overlay_Buffer].opaque[0]; if (tileptr[bot].opaque[nb]) { SDL_BlitSurface(tileptr[bot].opaque[nb], NULL, dest, NULL); } else { SDL_BlitSurface(tileptr[Empty].opaque[0], NULL, dest, NULL); addtransparenttile(dest, bot, nb); } addtransparenttile(dest, top, nt); return dest; } /* * Functions for copying individual tiles. */ /* Return the color of the pixel at (x, y) on the given surface. (The * surface must be locked before calling this function.) */ static Uint32 pixelat(SDL_Surface *s, int x, int y) { switch (s->format->BytesPerPixel) { case 1: return (Uint32)((Uint8*)s->pixels + y * s->pitch)[x]; case 2: return (Uint32)((Uint16*)((Uint8*)s->pixels + y * s->pitch))[x]; case 3: #if SDL_BYTEORDER == SDL_BIG_ENDIAN return (Uint32)((((Uint8*)s->pixels + y * s->pitch)[x * 3 + 0] << 16) | (((Uint8*)s->pixels + y * s->pitch)[x * 3 + 1] << 8) | (((Uint8*)s->pixels + y * s->pitch)[x * 3 + 2] << 0)); #else return (Uint32)((((Uint8*)s->pixels + y * s->pitch)[x * 3 + 0] << 0) | (((Uint8*)s->pixels + y * s->pitch)[x * 3 + 1] << 8) | (((Uint8*)s->pixels + y * s->pitch)[x * 3 + 2] << 16)); #endif case 4: return ((Uint32*)((Uint8*)s->pixels + y * s->pitch))[x]; } return 0; } /* Create a new surface containing a single tile without any * transparent pixels. */ static SDL_Surface *extractopaquetile(SDL_Surface *src, int ximg, int yimg, int wimg, int himg) { SDL_Surface *dest; SDL_Rect rect; rect.x = ximg; rect.y = yimg; rect.w = wimg; rect.h = himg; dest = newsurface(rect.w, rect.h, FALSE); SDL_BlitSurface(src, &rect, dest, NULL); return dest; } /* Create a new surface containing a single tile with transparent * pixels, as indicated by the given color key. */ static SDL_Surface *extractkeyedtile(SDL_Surface *src, int ximg, int yimg, int wimg, int himg, Uint32 transpclr) { SDL_Surface *dest; SDL_Surface *temp; SDL_Rect rect; dest = newsurface(wimg, himg, TRUE); SDL_FillRect(dest, NULL, SDL_MapRGBA(dest->format, 0, 0, 0, SDL_ALPHA_TRANSPARENT)); SDL_SetColorKey(src, SDL_SRCCOLORKEY, transpclr); rect.x = ximg; rect.y = yimg; rect.w = dest->w; rect.h = dest->h; SDL_BlitSurface(src, &rect, dest, NULL); SDL_SetColorKey(src, 0, 0); temp = dest; dest = SDL_DisplayFormatAlpha(temp); SDL_FreeSurface(temp); if (!dest) die("%s", SDL_GetError()); SDL_SetAlpha(dest, SDL_SRCALPHA | SDL_RLEACCEL, 0); return dest; } /* Create a new surface containing a single tile. Pixels with the * given transparent color are replaced with the corresponding pixels * from the empty tile. */ static SDL_Surface *extractemptytile(SDL_Surface *src, int ximg, int yimg, int wimg, int himg, Uint32 transpclr) { SDL_Surface *dest; SDL_Surface *temp; SDL_Rect rect; dest = newsurface(wimg, himg, FALSE); if (tileptr[Empty].opaque[0]) SDL_BlitSurface(tileptr[Empty].opaque[0], NULL, dest, NULL); SDL_SetColorKey(src, SDL_SRCCOLORKEY, transpclr); rect.x = ximg; rect.y = yimg; rect.w = dest->w; rect.h = dest->h; SDL_BlitSurface(src, &rect, dest, NULL); SDL_SetColorKey(src, 0, 0); temp = dest; dest = SDL_DisplayFormat(temp); SDL_FreeSurface(temp); if (!dest) die("%s", SDL_GetError()); return dest; } /* Create a new surface containing a single tile with transparent * pixels, as indicated by the mask tile. */ static SDL_Surface *extractmaskedtile(SDL_Surface *src, int ximg, int yimg, int wimg, int himg, int xmask, int ymask) { SDL_Surface *dest; SDL_Surface *temp; SDL_Rect rect; unsigned char *s, *d; Uint32 transp, black; int x, y; rect.x = ximg; rect.y = yimg; rect.w = wimg; rect.h = himg; dest = newsurface(rect.w, rect.h, TRUE); SDL_BlitSurface(src, &rect, dest, NULL); black = SDL_MapRGB(src->format, 0, 0, 0); transp = SDL_MapRGBA(dest->format, 0, 0, 0, SDL_ALPHA_TRANSPARENT); if (SDL_MUSTLOCK(src)) SDL_LockSurface(src); if (SDL_MUSTLOCK(dest)) SDL_LockSurface(dest); d = (Uint8*)dest->pixels; s = (Uint8*)src->pixels + ymask * src->pitch + xmask * src->format->BytesPerPixel; for (y = 0 ; y < dest->h ; ++y) { for (x = 0 ; x < dest->w ; ++x) { if (pixelat(src, xmask + x, ymask + y) == black) ((Uint32*)d)[x] = transp; } s += src->pitch; d += dest->pitch; } if (SDL_MUSTLOCK(src)) SDL_UnlockSurface(src); if (SDL_MUSTLOCK(dest)) SDL_UnlockSurface(dest); temp = dest; dest = SDL_DisplayFormatAlpha(temp); SDL_FreeSurface(temp); if (!dest) die("%s", SDL_GetError()); SDL_SetAlpha(dest, SDL_SRCALPHA | SDL_RLEACCEL, 0); return dest; } /* * Reading the small format. */ /* Transfer the tiles to the tileptr array, using tileidmap to * identify and locate the individual tile images. Any magenta pixels * in tiles that are allowed to have transparencies are made * transparent. */ static int initsmalltileset(SDL_Surface *tiles) { SDL_Surface *s; Uint32 magenta; int id, n; magenta = SDL_MapRGB(tiles->format, 255, 0, 255); for (n = 0 ; n < (int)(sizeof tileidmap / sizeof *tileidmap) ; ++n) { id = tileidmap[n].id; tileptr[id].opaque[0] = NULL; tileptr[id].transp[0] = NULL; tileptr[id].celcount = 0; tileptr[id].transpsize = 0; if (tileidmap[n].xtransp >= 0) { s = extractkeyedtile(tiles, tileidmap[n].xopaque * sdlg.wtile, tileidmap[n].yopaque * sdlg.htile, sdlg.wtile, sdlg.htile, magenta); if (!s) return FALSE; remembersurface(s); tileptr[id].celcount = 1; tileptr[id].opaque[0] = NULL; tileptr[id].transp[0] = s; } else if (tileidmap[n].xopaque >= 0) { s = extractopaquetile(tiles, tileidmap[n].xopaque * sdlg.wtile, tileidmap[n].yopaque * sdlg.htile, sdlg.wtile, sdlg.htile); if (!s) return FALSE; remembersurface(s); tileptr[id].celcount = 1; tileptr[id].opaque[0] = s; tileptr[id].transp[0] = NULL; } } return TRUE; } /* * Reading the masked format. */ /* Individually transfer the tiles to a one-dimensional array. The * black pixels in the maskimage are copied onto the indicated section * as transparent pixels. Then fill in the values of the tileptr * array, using tileidmap to identify the individual tile images. */ static int initmaskedtileset(SDL_Surface *tiles) { SDL_Surface *s; int id, n; for (n = 0 ; n < (int)(sizeof tileidmap / sizeof *tileidmap) ; ++n) { id = tileidmap[n].id; tileptr[id].celcount = 0; tileptr[id].opaque[0] = NULL; tileptr[id].transp[0] = NULL; tileptr[id].transpsize = 0; if (tileidmap[n].xopaque >= 0) { s = extractopaquetile(tiles, tileidmap[n].xopaque * sdlg.wtile, tileidmap[n].yopaque * sdlg.htile, sdlg.wtile, sdlg.htile); if (!s) return FALSE; remembersurface(s); tileptr[id].celcount = 1; tileptr[id].opaque[0] = s; } if (tileidmap[n].xtransp >= 0) { s = extractmaskedtile(tiles, tileidmap[n].xtransp * sdlg.wtile, tileidmap[n].ytransp * sdlg.htile, sdlg.wtile, sdlg.htile, (tileidmap[n].xtransp + 3) * sdlg.wtile, tileidmap[n].ytransp * sdlg.htile); if (!s) return FALSE; remembersurface(s); tileptr[id].celcount = 1; tileptr[id].transp[0] = s; } } return TRUE; } /* * Reading the large format. */ /* Copy a sequence of count tiles from the given surface at the * position indicated by rect into separate surfaces, stored in the * array at ptrs. transpclr indicates the color of the pixels to * replace with the corresponding pixels from the Empty tile. */ static int extractopaquetileseq(SDL_Surface *tiles, SDL_Rect const *rect, int count, SDL_Surface **ptrs, Uint32 transpclr) { int x, n; for (n = 0, x = rect->x ; n < count ; ++n, x += rect->w) { ptrs[n] = extractemptytile(tiles, x, rect->y, rect->w, rect->h, transpclr); if (!ptrs[n]) return FALSE; remembersurface(ptrs[n]); } return TRUE; } /* Copy a sequence of count tiles from the given surface at the * position indicated by rect into separate surfaces, stored in the * array at ptrs. transpclr indicates the color of the pixels to make * transparent. */ static int extracttransptileseq(SDL_Surface *tiles, SDL_Rect const *rect, int count, SDL_Surface** ptrs, Uint32 transpclr) { int x, n; for (n = count - 1, x = rect->x ; n >= 0 ; --n, x += rect->w) { ptrs[n] = extractkeyedtile(tiles, x, rect->y, rect->w, rect->h, transpclr); if (!ptrs[n]) return FALSE; remembersurface(ptrs[n]); } return TRUE; } /* Extract the tile images for a single tile type from the given * surface at the given coordinates. shape identifies the arrangement * of tile image(s) that may be present. transpclr indicates the color * of the pixels that are to be treated as transparent. pd points to a * pointer to the buffer where the tile images are to be copied. Upon * return, the pointer at pd is updated to point to the first byte in * the buffer after the copied tile images. */ static int extracttileimage(SDL_Surface *tiles, int x, int y, int w, int h, int id, int shape, Uint32 transpclr) { SDL_Rect rect; int n; rect.x = x; rect.y = y; rect.w = sdlg.wtile; rect.h = sdlg.htile; switch (shape) { case TILEIMG_SINGLEOPAQUE: if (h != 1 || w != 1) { warn("outsized single tiles not permitted (%02X=%dx%d)", id, w, h); return FALSE; } tileptr[id].transpsize = 0; tileptr[id].celcount = 1; extractopaquetileseq(tiles, &rect, 1, tileptr[id].opaque, transpclr); break; case TILEIMG_OPAQUECELS: if (h != 1) { warn("outsized map tiles not permitted (%02X=%dx%d)", id, w, h); return FALSE; } tileptr[id].transpsize = 0; tileptr[id].celcount = w; extractopaquetileseq(tiles, &rect, w, tileptr[id].opaque, transpclr); break; case TILEIMG_TRANSPCELS: if (h != 1) { warn("outsized map tiles not permitted (%02X=%dx%d)", id, w, h); return FALSE; } tileptr[id].transpsize = 0; tileptr[id].celcount = w; extracttransptileseq(tiles, &rect, w, tileptr[id].transp, transpclr); break; case TILEIMG_ANIMATION: if (h == 2 || (h == 3 && w % 3 != 0)) { warn("off-center animation not permitted (%02X=%dx%d)", id, w, h); return FALSE; } if (h == 3) { tileptr[id].transpsize = SIZE_EXTALL; tileptr[id].celcount = w / 3; rect.w = 3 * sdlg.wtile; rect.h = 3 * sdlg.htile; } else { tileptr[id].transpsize = 0; tileptr[id].celcount = w; rect.w = sdlg.wtile; rect.h = sdlg.htile; } extracttransptileseq(tiles, &rect, tileptr[id].celcount, tileptr[id].transp, transpclr); if (tileptr[id].celcount < 12) { for (n = 11 ; n >= 0 ; --n) tileptr[id].transp[n] = tileptr[id].transp[(n * tileptr[id].celcount) / 12]; tileptr[id].celcount = 12; } break; case TILEIMG_CREATURE: if (h == 1) { if (w == 1) { tileptr[id].transpsize = 0; tileptr[id].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id].transp, transpclr); tileptr[id + 1] = tileptr[id]; tileptr[id + 2] = tileptr[id]; tileptr[id + 3] = tileptr[id]; } else if (w == 2) { tileptr[id].transpsize = 0; tileptr[id].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id].transp, transpclr); rect.x += sdlg.wtile; tileptr[id + 1].transpsize = 0; tileptr[id + 1].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id + 1].transp, transpclr); tileptr[id + 2] = tileptr[id]; tileptr[id + 3] = tileptr[id + 1]; } else if (w == 4) { for (n = 0 ; n < 4 ; ++n) { tileptr[id + n].transpsize = 0; tileptr[id + n].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id + n].transp, transpclr); rect.x += sdlg.wtile; } } else { warn("invalid packing of creature tiles (%02X=%dx%d)", id, w, h); return FALSE; } } else if (h == 2) { if (w == 1) { tileptr[id].transpsize = 0; tileptr[id].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id].transp, transpclr); tileptr[id + 1].transpsize = 0; tileptr[id + 1].celcount = 1; rect.y += sdlg.htile; extracttransptileseq(tiles, &rect, 1, tileptr[id + 1].transp, transpclr); tileptr[id + 2] = tileptr[id]; tileptr[id + 3] = tileptr[id + 1]; } else if (w == 2) { tileptr[id].transpsize = 0; tileptr[id].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id].transp, transpclr); rect.x += sdlg.wtile; tileptr[id + 1].transpsize = 0; tileptr[id + 1].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id + 1].transp, transpclr); rect.x -= sdlg.wtile; rect.y += sdlg.htile; tileptr[id + 2].transpsize = 0; tileptr[id + 2].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id + 2].transp, transpclr); rect.x += sdlg.wtile; tileptr[id + 3].transpsize = 0; tileptr[id + 3].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id + 3].transp, transpclr); } else if (w == 8) { tileptr[id].transpsize = 0; tileptr[id].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id].transp, transpclr); rect.x += 4 * sdlg.wtile; tileptr[id + 1].transpsize = 0; tileptr[id + 1].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 1].transp, transpclr); rect.x -= 4 * sdlg.wtile; rect.y += sdlg.htile; tileptr[id + 2].transpsize = 0; tileptr[id + 2].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 2].transp, transpclr); rect.x += 4 * sdlg.wtile; tileptr[id + 3].transpsize = 0; tileptr[id + 3].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 3].transp, transpclr); } else if (w == 16) { rect.w = sdlg.wtile; rect.h = 2 * sdlg.htile; tileptr[id].transpsize = SIZE_EXTDOWN; tileptr[id].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id].transp, transpclr); rect.x += 4 * sdlg.wtile; tileptr[id + 2].transpsize = SIZE_EXTUP; tileptr[id + 2].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 2].transp, transpclr); rect.x += 4 * sdlg.wtile; rect.w = 2 * sdlg.wtile; rect.h = sdlg.htile; tileptr[id + 1].transpsize = SIZE_EXTRIGHT; tileptr[id + 1].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 1].transp, transpclr); rect.y += sdlg.htile; tileptr[id + 3].transpsize = SIZE_EXTLEFT; tileptr[id + 3].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 3].transp, transpclr); } else { warn("invalid packing of creature tiles (%02X=%dx%d)", id, w, h); return FALSE; } } else { warn("invalid packing of creature tiles (%02X=%dx%d)", id, w, h); return FALSE; } break; } return TRUE; } /* Extract the large-format tile images from the given surface. The * surface is scanned to find the delimiter pixels. Upon return, the * pointers to each tile image is stored in the appropriate field of * the tileptr array. */ static int initlargetileset(SDL_Surface *tiles) { SDL_Rect *tilepos = NULL; Uint32 transpclr; int row, nextrow; int n, x, y, w, h; if (SDL_MUSTLOCK(tiles)) SDL_LockSurface(tiles); transpclr = pixelat(tiles, 1, 0); for (w = 1 ; w < tiles->w ; ++w) if (pixelat(tiles, w, 0) != transpclr) break; if (w == tiles->w) { warn("Can't find tile separators"); return FALSE; } if (w % 4 != 0) { warn("Tiles must have a width divisible by 4."); return FALSE; } for (h = 1 ; h < tiles->h ; ++h) if (pixelat(tiles, 0, h) != transpclr) break; --h; if (h % 4 != 0) { warn("Tiles must have a height divisible by 4."); return FALSE; } if (!settilesize(w, h)) return FALSE; xalloc(tilepos, (sizeof tileidmap / sizeof *tileidmap) * sizeof *tilepos); row = 0; nextrow = sdlg.htile + 1; h = 1; x = 0; y = 0; for (n = 0 ; n < (int)(sizeof tileidmap / sizeof *tileidmap) ; ++n) { if (tileidmap[n].shape == TILEIMG_IMPLICIT) continue; findwidth: w = 0; for (;;) { ++w; if (x + w * sdlg.wtile >= tiles->w) { w = 0; break; } if (pixelat(tiles, x + w * sdlg.wtile, row) != transpclr) break; } if (!w) { row = nextrow; ++nextrow; y += 1 + h * sdlg.htile; h = 0; do { ++h; if (y + h * sdlg.htile >= tiles->h) { h = 0; break; } nextrow += sdlg.htile; } while (pixelat(tiles, 0, nextrow) == transpclr); if (!h) { warn("incomplete tile set: missing %02X", tileidmap[n].id); goto failure; } x = 0; goto findwidth; } tilepos[n].x = x + 1; tilepos[n].y = y + 1; tilepos[n].w = w; tilepos[n].h = h; x += w * sdlg.wtile; } if (SDL_MUSTLOCK(tiles)) SDL_UnlockSurface(tiles); tileptr[Empty].transpsize = 0; tileptr[Empty].celcount = 1; tileptr[Empty].opaque[0] = extractopaquetile(tiles, 1, 1, sdlg.wtile, sdlg.htile); tileptr[Empty].transp[0] = NULL; remembersurface(tileptr[Empty].opaque[0]); for (n = 1 ; n < (int)(sizeof tileidmap / sizeof *tileidmap) ; ++n) { if (tileidmap[n].shape == TILEIMG_IMPLICIT) continue; if (!extracttileimage(tiles, tilepos[n].x, tilepos[n].y, tilepos[n].w, tilepos[n].h, tileidmap[n].id, tileidmap[n].shape, transpclr)) goto failure; } extracttileimage(tiles, 1, 1, 1, 1, Overlay_Buffer, TILEIMG_SINGLEOPAQUE, transpclr); tileptr[Block_Static].celcount = 1; tileptr[Block_Static].opaque[0] = tileptr[Block].transp[0]; tileptr[Block_Static].transp[0] = NULL; tileptr[HiddenWall_Perm] = tileptr[Empty]; tileptr[HiddenWall_Temp] = tileptr[Empty]; tileptr[BlueWall_Fake] = tileptr[BlueWall_Real]; free(tilepos); return TRUE; failure: freetileset(); free(tilepos); return FALSE; } /* * The exported functions. */ /* Free all memory allocated for the current set of tile images. */ void freetileset(void) { int m, n; for (n = 0 ; n < (int)(sizeof tileptr / sizeof *tileptr) ; ++n) { tileptr[n].celcount = 0; tileptr[n].transpsize = 0; for (m = 0 ; m < 16 ; ++m) { tileptr[n].opaque[m] = NULL; tileptr[n].transp[m] = NULL; } } sdlg.wtile = 0; sdlg.htile = 0; sdlg.cptile = 0; opaquetile = NULL; freerememberedsurfaces(); } /* Load the set of tile images stored in the given bitmap. Error * messages will be displayed if complain is TRUE. The return value is * TRUE if the tiles were successfully identified and loaded into * memory. */ int loadtileset(char const *filename, int complain) { SDL_Surface *tiles = NULL; int f, w, h; tiles = SDL_LoadBMP(filename); if (!tiles) { if (complain) errmsg(filename, "cannot read bitmap: %s", SDL_GetError()); return FALSE; } if (tiles->format->palette && sdlg.screen->format->palette) SDL_SetColors(sdlg.screen, tiles->format->palette->colors, 0, tiles->format->palette->ncolors); if (tiles->w % 2 != 0) { freetileset(); f = initlargetileset(tiles); } else if (tiles->w % 13 == 0 && tiles->h % 16 == 0) { w = tiles->w / 13; h = tiles->h / 16; freetileset(); f = settilesize(w, h) && initmaskedtileset(tiles); } else if (tiles->w % 7 == 0 && tiles->h % 16 == 0) { w = tiles->w / 7; h = tiles->h / 16; freetileset(); f = settilesize(w, h) && initsmalltileset(tiles); } else { if (complain) errmsg(filename, "image file has invalid dimensions (%dx%d)", tiles->w, tiles->h); f = FALSE; } SDL_FreeSurface(tiles); return f; } /* Initialization. */ int _sdltileinitialize(void) { sdlg.getcreatureimagefunc = _getcreatureimage; sdlg.getcellimagefunc = _getcellimage; return TRUE; } tworld-1.3.0/oshw-sdl/sdltimer.c0000644000175000017500000000552010362156223016715 0ustar breadboxbreadbox/* sdltimer.c: Game timing functions. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include "SDL.h" #include "sdlgen.h" /* By default, a second of game time lasts for 1000 milliseconds of * real time. */ static int mspertick = 1000 / TICKS_PER_SECOND; /* The tick counter. */ static int utick = 0; /* The time of the next tick. */ static int nexttickat = 0; /* A histogram of how many milliseconds the program spends sleeping * per tick. */ static int showhistogram = FALSE; static unsigned hist[100]; /* Set the length (in real time) of a second of game time. A value of * zero selects the default length of one second. */ void settimersecond(int ms) { mspertick = (ms ? ms : 1000) / TICKS_PER_SECOND; } /* Change the current timer setting. If action is positive, the timer * is started (or resumed). If action is negative, the timer is * stopped if it is running and the counter is reset to zero. If * action is zero, the timer is stopped if it is running, and the * counter remains at its current setting. */ void settimer(int action) { if (action < 0) { nexttickat = 0; utick = 0; } else if (action > 0) { if (nexttickat < 0) nexttickat = SDL_GetTicks() - nexttickat; else nexttickat = SDL_GetTicks() + mspertick; } else { if (nexttickat > 0) nexttickat = SDL_GetTicks() - nexttickat; } } /* Return the number of ticks since the timer was last reset. */ int gettickcount(void) { return (int)utick; } /* Put the program to sleep until the next timer tick. If we've * already missed a timer tick, then wait for the next one. */ int waitfortick(void) { int ms; ms = nexttickat - SDL_GetTicks(); if (showhistogram) if (ms < (int)(sizeof hist / sizeof *hist)) ++hist[ms >= 0 ? ms + 1 : 0]; if (ms <= 0) { ++utick; nexttickat += mspertick; return FALSE; } while (ms < 0) ms += mspertick; SDL_Delay(ms); ++utick; nexttickat += mspertick; return TRUE; } /* Move to the next timer tick without waiting. */ int advancetick(void) { return ++utick; } /* At shutdown time, display the histogram data on stdout. */ static void shutdown(void) { unsigned long n; int i; settimer(-1); if (showhistogram) { n = 0; for (i = 0 ; i < (int)(sizeof hist / sizeof *hist) ; ++i) n += hist[i]; if (n) { printf("Histogram of idle time (ms/tick)\n"); if (hist[0]) printf("NEG: %.1f%%\n", (hist[0] * 100.0) / n); for (i = 1 ; i < (int)(sizeof hist / sizeof *hist) ; ++i) if (hist[i]) printf("%3d: %.1f%%\n", i - 1, (hist[i] * 100.0) / n); } } } /* Initialize and reset the timer. */ int _sdltimerinitialize(int _showhistogram) { showhistogram = _showhistogram; atexit(shutdown); settimer(-1); return TRUE; } tworld-1.3.0/res/0000755000175000017500000000000010420664541013757 5ustar breadboxbreadboxtworld-1.3.0/res/atiles.bmp0000644000175000017500002123013610416055514015747 0ustar breadboxbreadboxBM^0E6(j(0Eޭڨ٨ϨǨ٨樨Ԩծδ˲ᨨׯܪ˨γٲⶶѨΨߨܯ樨樨֨ѨݰèԨ娨稨بݨ訨㨨ϯ躺񸸸ݺꨨ騨֪ꨨཽ𳳳ª󨨨ݶըڨ娨ݨܨ鹹⨨֨¯޲򨨨Ũᨨضֺ뽽ߨٶѾǨܭҺϵپꮮרԾɨ𨨨䶶娨ۨȨdz﨨ߨè֯񯯯ܨר騨稨稨ٳͯ츸ᨨѿ﨨ۼǪ׶Ҩ׽䨨ިبب˿载ٸب򨨨㮮źѨ۳ǯ㨨ۨ˾Өͷ񨨨߸人˨ܺବ쨨ϵ쨨ܼͳۨ񻻻⽽⨨򨨨娨޸񸸸췷㾾רŨƶ箮⨨κスިݨ⨨רȨ쨨쨨ʨѨծ먨ʺ𨨨򨨨ҭ۶ŭ򨨨մ񱱱麺㨨Ѷ樨ߨۨϨ٨騨Ҩ¬иڨҾǼߨ󵵵_s\ovexvriRcUfzg}wP`uTeިezwjP`䨨z]pttnp_skbvUgptxnZmZmi𹹹vrbvP`uਨzezo]rnZmi~uowg}xg|tf|_rvtUgᴴg}P`_sTexWiszezzni~]pmexcwP`WisorTeUfworotRbۻzf{vmRcnxpf{ezzcwssP`ߨP`ezbvUgumoZmjtoZmtUfurtxn\oxf{uP`xcwtrRcttoRPPFuFgF`PukpZnFk}LsL}FpYw]]e\L25\bf}NwPLxcbcwjv_tRPP]gTTR_z_\_{TuRLmFkFFFkjjjom~F{FFnnopoou~iZnJHJUrwZRw``}sUFTu_s{}zrJouzL2Lzbbtf|NkLJJfbb{UfjtjZzLJJYuiirTfb}RRb{t\\t݀pjTsTvFxFFFFFijjs_RtFrFFFFmU\]uUeLrJHFHJo޲YZNFFZF"HFFLUx\\rUFFFFHr\\\NoYkP`cYjb}NuJFFR{c{cbxczg_jT{LJJJJk{jZ}RRPRWst]ZbwsjfgPfNNuFkJrFuFFFFFiikkӳȨHFvL~FFFFFnsLF{NR}JFFFHrvYPFFFFF;sUڼ]Z]UFFFFP{\]z|v_u`|`cL}HJc~{bug_t_sjRJJNRtfffiT~PUYspLbsc\`sroorp~~ffZnLFFFFFFFFFFFFkFFFFFHwwFFFmUUnFFFFJLwrJYWUZxkFFFFFFNYexZZ]\n;FFFFU~]`__cLHHHHHJYkfx]`gLJJNNNR_feegeRRPUWJNb`c`\`bnjffLFFFFFFFFFFFFFggmjiHFFFFkHHjmonTFFFFFF~omnsootUUtNFFFFFFsssusP`\bvcwZrFFFFP]xxxssupc_Wuf{bJHHHHHUcʦg]\__zJJNN]sfecWYg}U}RPUf}spb__b"URZ`romffi`]gn}{z|}t}fgLFFFFiFFFFFiiPPHFFikoRpJFFFHJno}WUUUFFFFLNWstjrv_ZoYYR\HpFFFFNPR\_`_UUUYZ~FFFHHHTYZpYxf]\\\PPPRLvLJHHLNNP_\eBDUURRJ|HHHPPUUWgezo_]YYZRRPPPYY_mef]\\fpogeeFFFFFFNeegkjH_WiimFFFFHiiijnzg}pFU}wc{HFF=opsTYvF}FFFFLWtttYFkHnuj|ZYPumRFFFFP\zz]kJLrc_WUJJFFFFFFHTUberFrFNkg]\PNNJFFFHLLN\Y\fcUWTPPHFFFNTWpevso_YWYYPNPW]_p{{{|rgeece\\ejk}vtponozzzzet~LFFFFrefL{FrFoFcfmLrLpU|UwWejNNNP}FFFFFFNjUfFb;FPFFFFFFFNFFFFcP`WtiTLnLLFFFJJJLTYYYWP{FFFFTpbw]YYRPPPPFFFFFFFNNPZ\]]]FFHJW`_UUJHHFFFFFFFFTTUWcNrLLLNJm{f\NN=@HHHFFFFLLLN\__`YWYeUTTPNNN@HFFLNNRTTUcffRRRfcZYWWWWWWWWWWW]_WWbi\\ccccccej٨njfPLJFFeeFFFFFFT{T|RTniLFFFFFFJBjsFFZgFcYsoPHFFFFFFFFFF}oFFFFFP|mxxULLspFFFFHJJLUWWWxFFFFFbp|ZYPFFFFFFFFFNPZZZ\]FFFHTb_UHHHFFFFFFFFFHTWWWWZUfLJLTg\NLFFHFFFFFFLN\]]FF_oYY]nP`YUNNN@@LLLRTceHHHHJetZWWWWUUU\]mnUU`r`\ZZbcccciijz|nosonmnwxx~~~ie\bNFHJHFFFFFFFFRPPPgwPPFj}FFF.FJBHYkP`FFFFFFFW~UF{YzP`PHN;FP`FFFFFFFFFF"FFFFFFNP}\{\{Jk\WTLJFFF}FHHJJTTUUUPFFFP]bvZYPPNFFFFFFFFLNNNPPPPPPTFuFRRRJFWb`WUJHHFFFFFFFFFFFFRTTUUUUUWZ}\LNPNNLHLLLLJFFFFFJFJLLNZZNFFFF\\_umZZ|p稱ZPNNNNNRNRRLLLLLLRRRTUULHHHHHW򶶶ZPPWW_YUUUUUZ\\jeU_`rn]ZZZcbcijniLkFFFFRFFFFFFFFFFRHFTiFFFFF稸F=oFFFFFFFRFLTk{]pr\oxxR\NFuFFFFFFFFFFFFFFFFFFNJYmm\oLLJP]FFFFFFFHHFFFJJFLuFFFRT_PFFPTJFFFFFFLLNNNFNPRFoUR\FBUYZJHFFPf`+.FFFFFFFFRTFFFTURm\ZcfjP`RNHHHHRtjWJJJFFFFFFFFFFFF\_pn\{j|PNNNZbwRPPPRRTNHFFHUefPNNWgnUUZZZijveo``s˨f\ZZpmbciiix~sjmmwwx~~~}||ieJP~FFFFF~jFFFFFFFFHFFHRf}kPNFFTFFFFF]pFFFFFFFJFJUYoTzF|‹tWFFFFFFFFFFFFFFFHHHJZx{xJFF_tfFFFFFFFHHFFFJ'FFNFFPJL_FFFFmviUFFFFJFFLLLFFFFNNNPLr_UNTTTWYJHFFFUwweUFFFFFFFFRFFFFFFTTUWLp`x\eZTf{iPHHHFWgwzcJJJJNTJFJFFFFFFZ\`f\PNNNY`uxPPPPW]g_RWWRNPccfRPNNNox}{ZZZn]ZY`g}sbikmifFFf|FFF}}FFFFFFFFFFHTNf{nFzzFFLFFFFFFFFJLTJHFU\_gnmYFFFFFFFFFFFNPn]JFFF{eeinncFHHFFFJLYߨJJJmFFFFHv_cgkbNFFFFFNHnb_kPYo_HFFFFj5È}m_TNWgofLFFFFFTTTWm}{WYT]JHHFHbrec|jNJJU_c`HHFHJ\ZZ\iwff|\ncPHFN_{\P`s_iYeccfZPN]wZZgggsvxnorfZYetgvuuuw}~vji"}~zJFForn}{FFΨFFFFFFFFRP}]puڊw{FFNHFFFFFFFRHFF`twvx{|zmFFHFFFFFFNZLFF8wtstvwvnRFFFJJJJLN2HmFJJ]JFF`Ҏno|~wj]LFFNNNNNNPRT~TjTeNPRTe}HFFFYm.wjcn}zw_RF]UUTTTTYb|WpNHFFZfukcUYntwNNNJZZZ\kg_PHFUcnx~sT]]egncsvYWPNPY`u}ZfrnmYZcvtui'iFFFP`|@fJFFFFFFFFF]mFFFbvoFF󸸸FFFFFFFFFY{RHFzs}}z]FP`NHJFFFFWFFFFFxxwuvwxucHRJNR{k{m]HFFi}xuotzunWuWNPT2JPsRcNFFFFbn_o_N\{|]TWYDN_`檸gNHFF_gu{j`U]PZZ_jvbPHFZfr|~\\\eieccr]PNUg}ffefronorjZ_nutsss~zjn|NP~FFf{mm{nt~HHHFFFFFFFFR}PFJFFFǨrJFFFFFFFFWHFWi¬}nFNrNNHFFWFFJxxubcwUTRLLLLFRTwsFFFFmxwuojv{}vUWWNPNDTHwYpw_NFFFFbocYcWZTTTUWWYNokzkDNHFFZiu}mT\\_Z\_HFPgp~uZZZeeccfWPNL`g~n{eccncYis{kzFFijFrg}H{~f|HHFFFFFTuonFkp"UftF_sJJL|P`FFFF`xFf{o`۬}}f|~NNHJFH{g|Y|P`FF_zxxuwpinxjRJLNFwFzFs`oHFFFFuvvnkbRrtnYWNRRTxgvZHFJFNogvUUw}}P`]TUWZs;RHFiurktRYZfZ\_񵵵k]LLbiYWbfeWfstWLeƇcb``ooorkZWwronns~}nkwutuzFFFFLLFvFLuZ`tP`5sHHrFFR~FkFuF5z|~wǾJP`i~FNFvFn{o;gNRwPNNNFcwHHfWTuFFJkxvo`\ZLjwRJJJLLNPmFFFF+jtLLNoYPcxP`NPPPRUz`vZm_LF;FFpnf~vgJRPRUrTTTUWYLHFWusrozUNNNNZo_sZNNP\]_bPNLLgvvwWTTT`UWWPNL}|`]]]```rZYYx_\\\npmwpt򨨧FFFFFFFFF訰.FD`P`HPFFFFF]{{TF28ZmvLPZmUTFrFtFHw}|rbW+FFuN~FF_sHbYwY|H{ntxwFFHJmUJ'JJJL`tvWiܨ`jw`HFFFFsTHJNpPzcwNNP.Txf~]NHFFFrruFFFFFU}HHHP`Ws]scHFFFnvspLJJJNZkNNN\_f{ZobNLJvt~RPR`{cwUUekUT_NLLL`਩_i~_`egb`]ܨWYnnoomxsg}t~xZwNFFFFFFvPJNvRPHFFFFLFFFFiwزJFFJLLtJb\RRPFWFFwL~FFuHf}PPWFWzUFFuzxwFFFFJsJH;;JLZnsbFFFFtrTFFFFFFFFFNNP;R]_JHFFFoor~gFFFFFFHRFFFoTTUWzucNLJJPssp\HFFFFFL\YLLLLNN\zi]PLLL~utFFFFFFFFcmPPPTTUUWfvf{ZUTTbLHHHLNbY~Yk__mYke`u{YPPTgvUxiegWiNFFFFJF5HFZJLmugNFFӨNFFFYf|Nnoo稨`FiLLPT5DHFFF{sRUF~FFFFFFFHPU\rFHcxxgJUFFFFFFrFwkJL\o\vN\nbxuRFFFFFFFvNHFFFFFNPjjtbFFFxoFFFFFFFFJkTmTHFFFFHTTWRrJJR]FFFFFFFneTFFFLLt\URnHFFFFFFJoos]PNNTU_]U_JFFFFJNkTYY]`zg~r~c`cPLLR\ofzgxi|vunc`biz}{ur`uzmf{ZxLJFFFJHbWFFF{ujbJLLNfZ\p\jpHHFZUFF~LLPR\pŨRJPPR2F'R}UWsk\FFHWjPPUUWHHfci_}xFFFFFFFFFFJJLwr'PLz\RPFFFFFFFHJFFFFFFFrTePPRvY|RPrٺFFFFFFFFNNHFFFFFFFTTUp\LJ\ZRFFFFFFFLNJJFFFFFLLNkZTRPxjHFF}FFFFFF}\]LLLFFLNTTTuZnt\Zv\HFFFFFFFHJPvWWRNPWWY_mbsobPNJHHJFJLPx_o\fu_WWZ`uf{oLJJFLwHcgLbF~}tHJJJLfNNL2oFFHuNfZHF|LNNPnRR`䨨~skFFFF'YFmPRRWH薲euΛ._cYFxFFFFFRWHFFF+LLNҨ\NLzFFFnTfFFFFFFFFFF+wNPPjsxUPgFFFFFFFFFFFFFFFFFFbvT{YJxPF|FFFFFFFFHHFFFFFFFLLNg~P`sRx`FFFFFFFFFFFFJJJHFFFNNTU{Wi`Z}}mWFFFFFFFFFFPRTPJNW]enbuj`~w_LJHHFFHNbY]fpwu|m`UW\c'z{~{w{zPrLJJJNZmfFW}tcHJJJJFFPNY]oD5=BgBFF]HzueLL8xNNP\RRi~Pj~zFFFWRFxZzgPJJWW=W~RHsrFFFFFFFLi`WHBDFJ._JLLt5YLL{fFFFFx`tFFFFFFFFFF'NNPPTRgzUFFFFcxFFFFFFFFFFFFFwUWkWkFFFFFFFFFFFFFFFFFFFFFLLB=g}cTRfTFFFFFFFFFFFFFFHHJFFFFNNTTYZ]YubPHFFFFFFFFFFFPPRNNPPJLPZ\c{rg`cTLJHHJFHJNP_bbo`ue_WYZ`++LJLTZbsvۨ}sbHJJJFFFWYn"FL+FZ~ntcLxwFFHRR'|k}FFP`FpzoWF`uvPJTN{{vpFFFFFfg`UFFJU]JL++NLsmPFFFFFFFFFFNFFFFFFNPR}bFFFFFFvFFFFFFFFFFFFFHUtz\W\sTFFFFFF_sP`FFFFFFFFFFFFLxnT\`P}rYFFFFFFFFFFFFFFFHFFFFFRY``vsr\mwUJFFFFFFFFFFFHJNPJP\]jkgn]RJJLHJLNR]copxxu~uoc_b_ew{}|z|LLLLUUYx=FFF{_sr_HJJFFFPPYYY\zsus_rxDs`LLLNFFTTUwN.2zoT}RFFxjFnD+TFFFFFP`PJJJJN`uRH{z2xzWJFFFF]f]TFFFJJLLZWLRv{n]HFFFFFFFFFFFFFFFFNP]RPgvcPFFFFFFFFFFFFFFFFFFHJYWJk}iWFFFFFzkFFFFFFFFFFFHLRRTU\䶸]s_R\xnYLFFFFFFYmFFFFFFFFFFFFRRYYr\oZY~t`UHHFFFFFFFFFFJHHJJHJLR`b`fke]TNNPRLNNPRRWbpuwcmpzez\nLLLLcjFpLJFxsR`cwFFHHJJFPP}gLFZ_}FFFYmFFLLFw_Uv_nkN}jik|{PFFFFH.FFFri~JJJwsHiwJ5fxxwWFkFFFWNFFFFFFLLLP`{WFvvvtwtrrmTFFFFFFFFFFFFF~TPxmkkeHFFFFFFFFFFFFFFHNfYc~pcbc\FFFFFFFFFFFFFFHPRU\txcRi|zr`ZYZPFFvP`FFFFFFFFFFFRYv\ob|]Zu\UUYHJFFFFFFHHJHJPbc\ex}ifob]ejpRTYWers_svtxspnjorx~rP`|{}rtrnLLLFFFHJJpFf}FFWi}FJJJJJFPPF~˪FLe|"jf쨨wFzsF\nNN_J|JPPPPPNFx}sgk}}FFFFFFFHHPPJJ\eWUUUUUFUxgswHWFxxwktFFFFFFFFLLLtgN]zZYWFftvvvtitttttjZnFFFFFFFFFFFF_RF}rrr{ooooeFFFFFFFFFFFFHNNڨi\LUzojji\FFFFFFFFFFFFHRTUU`R`x~}}|wpki`PFFFFFFFFFFFFNPUbP`ccx\WkxsmfzprFFFHHJHHLLNPce{xux~TTPRWY]}P`kug}LLFFFbrLFv_sbuiFFLJJJLF}FF`8F|FNkNeFHNNFFebuFF}fFFF`RNFLRTFFxcvzkFFFFxwiFFFFPUPiWWYFRttvvvs]FHJttx`tFFFFFFFFFFLuT|\nZW]_]Fbrrrrrk\FFooiLFFFFFFFFFHJU`ffZFFzbtjmcJFFFFFFFFHHUkppm`FYw}}}}}|z`FFFHHJFFFNRfrrw~{m\H\wsrPHHHJJJLNZw{jkgsDBTeUUTUW]wr~v}}LFFFFkoFtxvtFFFNzfLLJLFFFWxFFFL΁N]xnHF֨PNNNNJ}wFFWNNFFFFnFF}zeF]JFHNZTRRN|LFFFFZLRRTFoxFFFHxxmFFHJLgYWWYRFFzmPPPWWYFFmtvvvuiJLPtpLJJLLFFFs}Rc\\WPJTUU]]FFtrrrrpiZcokf{FFFFFHHLr_zzYkcZkW]\\\eZF`kjfYriZFFFHJJLNPwgecFFp|}}}}t`HHHJJLLNNPT{mHWj|tRRRRTTLNWYZf|سjNex|tuWUWWYZ\]ppgsbuLFFFLFFPnFFFLLLLFFJc@FFFFzFށ{cuP`JJFR|NNFFFFFJ`FFFFFFFpHFF}oTuJwTRoFFrrFJFJLFFFFczpsbFFHJxvFW@HHJzZwWY+FFFFFPYFFFFoxvvteNtzJJJLLLRp]\WNHFHTU_FF]wrrpjTopNPRHJLv`tb\TZ\eFFpmkkc\oHHJJN]{~tbWccnkFUv|}}}}}cNNPTWgbopxkJ_nx}RRWZv|jYj~``beg~vmnouf{pZkf{N~NNFFFFg}~|HFFFFFuN|NNNRFFFFFFFFFFF_~LFJP`NFRRRFFFFFFFFFF}}}rFnP`]~LgTTUpFitFFFFFFFFFFFnw{xxxxwYR5HJJLN{vZYY+FFFFFFPPFFeuvtPtutJJ樨LLLNNR|Rb]WTxFFHTTU]`FFFUuTUnPPPRRTUYe]TRNNZZfeFFFmkjxuwP`JJJJLLNPscZ@UbekFFYsz|}}}RPNPPRRTUv\omc`kFR_m}YWYY\_TN\o|``f~kzZmPxP}iFFFFF{g}FFFFFsm|FFF`FHF'FFtDcFFurP`FFFFFFFרFrFFFe}}}FFFFFuxRcNpu~FFFFFFFFFFFFFwxxxHHHHJJpP`zLZFFFFFFFYNFFptttttrLLJRLLNj݁`ukFFFFJU~TFFFFLwrsv\PPRU_rf|ZRJNZ]fFFFPn{xUJJJJZ`U@@coocFFTbkptw{}o]pPPRTgz`u__`ozwLFN\ix~|niYYZ\bg}g}sn{Z\wf`bcmn|~vw~jNuFFFFFFFFkcxcwFrHFFFFF`PFFz|FR~2LrsFLvFFgYtJFNzHo2@ҨNFPu`wFFNNPRFxRmNFFFFRR\RFwRJF_twwFHHHHHJJRzg|{P`HTFFFFFJzW~WwNwNF}FbpstpJFLLLLLLNkPFFFFFHp]FFFFnvvrFRPPRRRRTTbogTTJJJP]fZFFUbnvxwniYJJJJLL]_tZUUWcFFW`ceov`wiPPPRRT__okNHT\``b`vYYZZ\_tmZYr{~i``kjP`t}vmFFFcFmHusFFFFFFTTiF~FpFFgg}F5wLLFFWWsF}FFTWoPwgFNPw_rFLN\WFFYjtUTRcrmFFFHJW@JvsiFFT`frxYWF_mmLJFLLNNZ||g}TeݨFFF]]TFFWfcLFFRRTWuuTFLNtfZFFLWfccJLLN\{P`bRWspk`NFPZ]jRRRRUr騨`ZTo~}wkNLNtstZZZ]bmn{iT_wg`bem{Wiws}~vvx|goL~~zzkFtJJJ~xFFFFFFRP~Nx{UFFFL]rLT~FFRTeJvHUYT}RRRjFFFH{PPvpJJLN\NtZUUUTTTTcNFFFFJiUYHYjTU`\YWY]TFFFPNNNPY_sp\pbLt\e`]\LTTPPHHHTTTTUW`s`tR}HnPpfcbLkeTNLLLLNZ]fcLoN]m``okTTRRRTTTUe|cwb=k]j\Z\\_jtPbbbcN~ccFTJtoPFFFFFFFPrfFFF+LtFFFRTJo\oRjFFFDPm`tFFFJJNm\UUFFFFFFJwLT}bwFRcu\ZYYFFFFF\PPY]NNkcxfib]\]FFJsNJzUUW\zspfcbceP{RNZ\gUiun~rmbbjkmWTTUcfuexzmjkttum]\]_oez"|xxxx{z\ocefn~xxz|NeFFLJFFFFFFFFFFvPPPFFF_NLLFFFFFFFYnsxRRFFFFFF|RPFFFLWYbrbnUUUrtpFFFFFTTTzFxYkPPRTZYYYZFFFFFRb}PPPRZFLLN`c~_]]_FFFYfUUU_wUtWptP`rfcZ~n\}]\\\wtmjbWWWcmmvb{__`xjmxpLJFHHxnfJFFFFFF吟H~vèUvNLFFFFFFH}~pFFFRkU`P";FFFFFY_tWFFFgu{UTLFFPR_xZFFFFFbUvPNc_]_FFJUUWU{k|f|WjҮecefNpm]\]irkkmzYceprP`ezYkrmmuxb`o{}zz{sno}mPsLJF''DFNtgNJFFFFFFJLRNH+uwHxtmiNFFFFFFUJHpR.HFFFFFLx_vYJ\FirRcWTLLFFFFPRTUtsZFFFFLpPPvmWgx_FFPeYUUUU}x}oeefn\\]mmfcevze{nc~g}xLFFTzmYzgnFFFFJJJJLNFFFFFFFFHP`LzZmLsLtr풨bwp;HHFFFFe''uLFFF_]YP_pRPFFFFYe`}H}HmivWUWLF|{jef`\\gcommoecfpnvwrno{\o}{{pPvLFFTFoeFFFJJJJJJLNTzPHFYoUF~FFFNNNNPULJTtTuoJHHHHJuiPULFFFFH\~\ZRRFFHJFRsuWWNJoP`prg\]xwncwppsTfxcw\eFoYxifFFFJJJJJLN\ZfRf}m`vivFFNNNNLLn~Ww]pvbvsrmRJHJJJtr}]us_}}xRFJJJLWwgը]Upoexw{b𨱲}}~WnTNxifFFFJJJJJLLNNRkUTpxPvktRHFFNNNNNNNPUunUwUZoJJJJJRRTZwZ]YWNNfz\TRLncWWPNP|bou_UUWf|Zm]gۭY\P{FFFLLLLNikFHHNNNPRjUUrnJJJRRTpZYL5vssWWZNrbgp}xw\Tozc`WPRnjUWvr_i}iiuZYN}LLFNNNNNNNg\g}~DHHPPPPPPPPRRZWWnJRRRTTx{\Z\8sgYWNNNNPPn`vbbb]s]\ZTRT`YRRRjWW]jp_fYkpggNNYjjjij}mPRRRRRT|_nzexpLuTTTTvw]\tmYNNWWzcxx`bg}x\ZRTgob``YigY]{trtr`gwYkpswcwxjwRb樨zcxZnbuP`tjrsrkmtcxi~P`P`ݨexP`ji~P`zz\oxnz_sumP`f|g|ZmxcxZntscxtZmzP`wxnn]rwoums丸Ufwiung|ng}vrvopsoo]p]ptvZmRcpum`upZnwP`vrP`vmwbutuP`of{xkntsP`ntP`P`oTeP`xmpxmx]ppsxezopTeiubvxezwwxg}rjP`騨rzUfp]pwcx\ownP`mpwji~Yjzkg}P`z_snvYkP`zg|ti~wj''ј͖לҙј㥥ﮮߢ{{FFppss;;ccoo{{ࣣ{{WWϗ{{||""ZZ``ᤤΖNN姧==..UU⥥稨㦦++{{˔;;ϗccΗ||RR稨++{{DD{{Ȓ;;ppcc{{ss穩LL槧22..Ïﯯ\\ZZᤤҙࣣ||{{NN{{''RR뫫{{骪ꫫ쬬xxtt쭭̕Ǒ;;55ߣܠ՜vvRRFF||񯯨{{槧ǐ88ߣҙޢ__..Ȓ{{ᤤ񯯨{{DD姧姧˔姧Ηޢј䦦묬՜JJܠﮮ{{BB樨}}䦦ꪪԚ詩..zzŽٞ˔ii姧RRϗ骪ЗȒLLʓם''姧穩{{{{]]{{{{FF򱱨ݡ""PPLLܠל~~{{""cc..ٞ{{䦦ܠPP͖ݡŐ22ﮮďܠDD쬬]]骪++{{˔{{З⤤묬Ɛ槧\\ٞff""++bbɒ骪ϗ骪Ԛܠ槧Ő;;BBם{{Žҙﯯ쬬۠{{͕{{㥥לFFꪪ詩ꪪ}}{{㥥򰰨{{ꪪ۠뫫DD~~˔۠ii쬬UU~~Ï{{..;;ם==;;{{֜㥥''++姧..{{ߣ++̕񰰩..͕HH򰰯UUߢڟ{{З{{說{{לǑ22Η..~~樨骪јTTWW88ppߢ՜󱱽""@@FFZZ||ee{{UU姧䦦YYꫫ⥥֜ʓ؝樨穩88쬬񯯵묬{{~~ﮮꪪ˔⥥88ɒ۠{{""RRNN骪..לत''쬬ڟɒ묬~~++LLccHH㦦˔ƐLL++ǐ"";;ɒל``ڟǐࣣᤤ㥥{{++ꪪ{{묬WW쬬""bbʓ{{̕ҙӚݡďjjިwwԛ..姧ࣣ==ݡ͕ss22ڟ{{ᤤ{{55{{姧..{{ȒЗᤤٞϗ骪WWYYɒPP뫫iiŐݡ..FF{{''姧稨{{ҙ묬۠穩ߢRRҙ骪LL{{225522ј""{{ꫫ{{詩Ǒ{{ǐ穩iitt""ҙΖ++22BB槧DD䧧{{ﯯJJ''䦦@@͖ʓ̕묬ZZ55骪Ǻ䧧說ff{{5522UUǑ''NN穩HH{{묬쭭ooڟ骪јﯯЗ{{==HHҙٞﮮHH''ٞ䧧..ϗŐܠ䧧@@Ӛȑ򰰨㥥۠RRٞ22PP++]]詩˔||==՜򰰸ל__++++BB{{55ݡPP؝⥥TTPP}}֜88詩ם""eeFF@@՜ÏםzzԚssߣ""ooŐ{{@@DD󱱨HH88JJkkuu{{ݡ֜NN++FF;;Η͖묬؝22{{ccﮮ""姧TT槧vv֜ҙLL{{ﯯvvDD{{說..ccतᤤ++ꪪ說骪ҙᤤHHᤤ˔詩˔{{՜++++ܠڟ姧ߢ@@~~ꪪޢ''''ٞcc˔⤤Ï@@ܠBBܠלҙ詩++Ï@@UUјNN++WW\\YY֜֜לkk՜++zz؝֜..ȒǑ{{ᤤ֜Ǒ{{۠ꫫUU骪;;ttPPTT묬ꪪ55LL;;ם++ݡTTࣣۨם~~֜{{++""ܠ22樨ﯯ槧ww22ᤤ{{Ž䧧22뫫..ʓ~~''55͖RR򰰨{{ԚǐJJBB骪NN뫫ꪪΗ{{55ݡ{{̕..詩""==ﮮ̕稨۠ϗ]]ʓ{{88ם՜ࣣ~~ꫫܠȑ}}{{HH22穩ﯯŐ{{]]槧ҙߣꪪ՛ԛ==""{{ٞ''PPrrHH{{JJ++jjʓ䦦''ǐ||՛֜{{ݡ؝88㥥DD⥥{{..쬬{{..姧՛''""֜{{樨䧧DD̕TT稨..לďmmﯯNNnnΗUU~~rrFF說22ߢpp..Ɛ՛јԛ{{͖ΖRRߢ++㦦՛ݡߣ++PP22DD骪⤤ggBBѾ``穩骪==ꫫ򱱨{{ﮮ~~姧詩TTꫫ{{''BB22뫫ݡ..ԚҙÏ뫫{{֜{{{{''ߢ{{㥥姧樨⤤iiFF؝ᤤΗ||RR䦦㦦ﮮ++;;88YYܠRRFF{{gg88ܠŐnn۠TTNNٞ{{ggmm˔2288ꫫࣣLLࣣpp++骪ʓNN{{""""ﮮÎ䦦TTᤤ՜++ߢ""{{ܠԚ֜ÏΗٞɒ񯯨{{HH@@ݡttﮮ""묬՛NNFFHH""֜RRƐﮮ\\묬Ǒ詩ᤤ{{ϗ쬬}}++TT''{{詩͖ݡŐ{{ٞ==ꫫ{{BB{{؝ȑ؝穩ܠ⥥""ɒFF@@ooꪪ""22ŽTTÏ{{..{{ל{{۠""++{{BB==JJםȒÎ{{㦦zz{{ʓ]]++ߣӚ{{̕22۠BBȑ''vvɒꪪ{{;;ZZڟ22oo==ј뫫םݡڟJJ..88PP@@||""䧧۠==ď۠22''++⥥""''ࣣ++''Ő{{@@||Î__ߣ..ٞ稨ᤤ姧..mm뫫""ל⤤{{ȑ뫫骪""ʓDDﯯޢ{{֜ҙﯯ}}ﮮ""뫫8888ɒ""ݡnnFFff詩{{ss}}⥥̕PP22Ǒ==++WW穩{{稨{{ڟӚbb詩Ő++22䧧YY""{{gg{{""==''@@''ٞ槧뫫Ő..骪ᤤ뫫""姧{{ܠ묬तbbݡ詩@@⤤BBssjj姧ᤤڟ{{۠쬬Ӛל..쬬WWbbј{{22骪穩؝''ϗ穩P"P"P"A]]\YYYYYYYYYYYY]]\YYY"|xz"|xz"|xz{xzt{rf\YYYYYYYcpg\YYoxkbYYvtn`ZYYYYt{rf\YYIJ"zj_cYi_znzIJ"zj_cYi_znzIJ"zj_cYi_znx~rj_cYi_znyYY\\YYYYY\\YYYYYYcwwi]YYwfbZYYYi~|o\Y~rbYY}|mYYYYYcwwi]YYμPǴısj2BB=885D@"YPi_wμPǴısj2BB=885D@"YPi_zμPǴısj2BB=885D@"YPi]~r~2`Y.==;852D@"YPi_uP""P"u1}P"}P"u1}_wsj{zp`YYYY_wsj{zp`YYYYxrjkmu}|zmY{kgcfnwweYYYZYYYZi|mZYpYxrjkmu}|zmYͺ"˷ɶB\\\\\\TTT@@@D@"bYsͺ"˷ɶB\\\\\\TTT@@@D@"cY|ͺ"˷ɶB\\\\\\TTT@@@D@"]Toeui}}{i`5LLLNNNHHH;;;D@"bYs}"|tPNE|xz"|xtv|}wsuy"|x~txmpf970"|xtv|}wsuy~zfYYYYYY~zfYYYYYYvjijt}_rf\_cowpYYtpswYYi{Yvjijt}_ϼϻκmj`jjjiiibbbTTT885`W{o|ϼϻκmj`jjjiiibbbTTT885j_ϼϻκmj`jjjiiibbbTTT882YP\RcZvuuNNFUUUUUUPPPFFF552f\wIJ"zj_cYg]oeodxj_cYi_znzIJ"zj_cYi_znuzntutsgf\bYi_znzIJ"zj_cYi_xmtui_bYeZj_i_IJ"zj_cYi_znuzntutsgf\bYi_znzpbYYYYYYYpbYYYYYYY{k]`fs|Yvm\YY_mx{r\Ytmjkv\kiotZ{k]`fs|YҾӾԿtrguuuiiiYYY==;YPj`|oҾӾԿroerrriii\\\BB=zҾӾԿtrguuufffNNN222WNYPYPwkujvj888@@@jjjTTTJJJ;;8ti}μPǴısj2B@=882D@"YP]Uj_9ne2BB=885D@"YPi_zμPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_zμPǴısj2BB=885D@"YPcZoc?g_+88252.D@"YP]TcZμPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_z{riZYYYYY{riZYYYYYvnku{Ywi]ck}riYocgnzYvnnsbvnku{Y.'8`rrrttteeeRRR88.YPYPdZ.'8pkT\\\___eee\\\ne2".'8`rrrtttggg\\\FFF=8+bYaYUMYP@=.;;;;;;===JJJHHHYR+t|ͺ"˷ɶB\\\WWWLLL;;;D@"ZPcZe\y}zjc@\\\\\\TTT@@@D@"cY|ͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{ͺ"˷ɶB\\\\\\TTT@@@D@"YPYPXOpg2BBB@@@;;;222D@"YPYPUMͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{ujYYYYYYYYujYYYY}mYvrbY{~YtpufY}mYHZe`kkkiii\\\@@@NHYPE>FôTZZZ\\\UUUDDDjc@NHZe`trgkkkfffYYYBBB]U"si+D@'888;;;;;;888==8ZU2tuvu1ϼϻκmj`fff___TTTDDD55.YP\T_Uvkj`NJ.DDDeeeiiibbbTTT885j_ϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_ϼϻκmj`jjjiiibbbTTTBBBD@+TJYPHH@@@@;;;222...22.YPYPYPϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_xmZYYYr}uiYYr}uiYYxmZYYY}um`YYo}tpeYY|fYYoYY}um`YYcfZ8WkkkcccNNN@=+`V]}W\\\ZZZPPPNJ.{cfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ottҾӾԿroejjj]]]===...22.YPYPYP(((FD2DDDPPPUUU___iii\\\BB=zҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;sҾӾԿtrguuuiiiggg```UUUDDD@=.~~sB@;............22.YPYPYPҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;s{o\YYmuZYmuZY{o\YYre\YYYwpj`YYYtk_YY|x|p`YYre\YYYH'ų.kkkgggZZZ===~yfZZZ\\\WWWDDDj`~H'Ӿ˸|wejjjbbbRRR777............85.WNYP\Rsgzn.'8Z\\\HHH;;;...B='YPYP;;;HHHPPPWWWZZZ\\\\\\rrrjjj\\\sj2.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y..'8`rrruuummmrrrooojjjcccYYYJJJ999000sxnvkNH+............D@"YPYPUM.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y.{wn]Yw]Yw]Y{wn]Yr_YYYYwkZYYYYt_YYYY|xvztfbYYr_YYYY.Ҿ]jjj```LLL555WWW\\\ZZZPPPFD2vkz9.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWPHZ]PLH8PJULYPYPYPUMA;---<<>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5AHZe`trgnkb}xgrrrrrroookkkeee\\\NNN<<<999MG*]T]UYPYPULNHB='B='YPYPYPE>HZe`trgkkknnnjjj```RRR:::>>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5AweYYwYYwYYweYYzi\YYYYkZYYYYYYj\YYYY]~v}vp`YYzi\YYYYkkkfffWWW888AAAYYY\\\WWWHHH(((kkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... eJwmmbpeocj_cY\TYPYP=6000===HHHPPPWWW\\\\\\\\\ZZZ}WôT8Կκɶı"fZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{fZ8Կκɶ;`ppprrrpppmmmfff___RRR@@@<<<dZmbpeocj_cY\TYPYPYPYPYPUMfZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{}jYYiYiY}jYYs_YYYYzn]ZZ\YYYY}cYYYYYY_cnwuuzugbYYs_YYYYiiijjj___HHH999SSS\\\\\\RRR;;;jjjiiiib8t}~ztujg]\TYPYPLF...)))=t}~ztujg]\TYPYPOG///===HHHNNNUUUWWW\\\\\\YYYWWW]F'Ӿϻ˷ǴIJ"cH'Ӿϻ˷RnnnmmmfffZZZDDDbZ!t}~ztujg]\TYPYPNG...............D@'YPuju}cH'Ӿϻ˷ǴIJ"mmmooorrrpppnnniii```UUUDDD<<>>+ɶѼvcκɵðpeWP +ɶѼvcκɵðpeVN.ɶѼvcκɵðpeQJ999+ɶѼvcκɵðpeVNtnoZYuYuYtnoZY++kkzz..""""roukZ++DD22YYYRRԚ55""}|``==22WW++uupp88m++kkzz..""""roukZXVHcZmbpeocj_cY\TYPYP=6E>UMYPYPUMP"AP"P"P"AP"e[mbpeocj_cY\TYPYPUL?:&Ǵм8vv;ϻʶŲmbIC!DDDWWWcccWǴм8vv;ϻʶŲmbVP8Ǵм8vv;ϻʶŲmbSO4Ǵм8vv;ϻʶŲmbFD.@@@888NNNǴм8vv;ϻʶŲmbSO4rgj\Y`Y`Yrgj\Y22ZZHHZZJJumneY88TT@@YYNNDD]]FFu;;++UUrr''88Բ@@Y22ZZHHZZJJumneYof1t}~ztujg]\TYPYPOGUMYPYPYPYPYPeZi_"|xz{xz"|xz"|xz"|xz{xz"|xulb$t}~ztujg]\TYPYPOGñκӿϻ˷Ų}e[111HHHZZZfffnnn+κӿϻ˷Ų}e[κӿϻ˷Ų}bYñκӿϻ˷Ų}cZNNNYYYWWWLLL===999κӿϻ˷Ų}bYvmiZYxYYxYYvmiZY88ӏ88""\\zzbbvjk`Y""55==..''FF@@""UU``HHccHHux22{{..55RRv88ӏ88""\\zzbbvjk`Y~urfbWYPYPXOYPYPYPYPYPYP\Tj_pfIJ"zj_cYi_znx~rj_cYi_znyIJ"zj_cYi_znzIJ"zj_cYi_znzIJ"zj_cYi_znx~rj_cYi_znyIJ"zj_cYi]nczn~urfbWYPYPOGǸcɶѽҾκʶıt$$$NNN___gggsss|||nnnVɶѽҾκʶıtHHHZZZZɶѽҾκʶıtJF5333ȹeɶѽҾκʶıtXVHbbbiiifff```ZZZNNN@@@666EEEHHHZZZZɶѽҾκʶıtJF5333rgYYr\Yr\YrgYY..ȣYY88==poZYTTjjƼcc""2255""""}}ף\\""zwtnf++UUff''''xx}}]];;..ȣYY88==poZYzwkcZYPYPYPYPD@"22.22.D@"YPeZxmμPǴısj2BB=885D@"YPi]~r~2`Y.==;852D@"YPi_uμPǴısj2BB=885D@"YPi_zμPǴısj2BB=885D@"YPi_wμPǴısj2BB=885D@"YPi]~r~2`Y.==;852D@"YPi_uμPǴısj2BB=885D@"YPmbzwkcZYPYP=65˷ѽӾм͹ȴ¯bZ!P"<<dZ|o|P"u:III___mmmrrrF˷ѽӾм͹ȴ¯ib8UUULLL777???si+aWYPeZuixpYY~}Y~}YxpYY""||ƺDD{rYYY__''++~~==~sY55pp޳mm..''''v""||ƺDD{rY|wkbWYPYPB='.........222D@"bYt}ͺ"˷ɶB\\\\\\TTT@@@D@"]Toeui}}{i`5LLLNNNHHH;;;D@"bYs}ͺ"˷ɶB\\\\\\TTT@@@D@"cY|ͺ"˷ɶB\\\\\\TTT@@@D@"bYsͺ"˷ɶB\\\\\\TTT@@@D@"]Toeui}}{i`5LLLNNNHHH;;;D@"bYs}ͺ"˷ɶB\\\\\\RRR888B='|wkbWYPXXXkkkFɶκмѼϻ͹ɶısj8DDD"|s65.DDDWWWccckkkrrrjjjddd°5ɶκмѼϻ͹ɶıznYWN"we_=cccnnnsssrrrkkk5ɶκмѼϻ͹ɶıwn>>IJ"zj_cYZT"TPDZZZfffnnnooogggcccñǴɶȵƳ¯mbocvIJ"zi_\YJgggpppssspppgggXXXñǴɶȵƳ¯jjjkkkiiibbbUUUBBB=8+WNYP]Tg]znzIJ"ǴɶȵƳ¯iiijjjkkkiiieee___WWWLLL===@=+NHYPYP`WbYi_znzIJ"zi_\YJgggpppssspppgggXXXñǴɶȵƳ¯jjjkkkiiibbbUUUBBB=8+WNYP]Tg]znztYzztYpYrjtYpYP¯ıŲŲðug]YPNH......;;;@@@882uҾӾԿtrguuufffNNN222WNYPYPwkujvj888@@@jjjTTTJJJ;;8ti}ҾӾԿroerrriii\\\BB=zҾӾԿtrguuuiiiYYY==;YPj`|oҾӾԿtrguuufffNNN222WNYPYPwkujvj888@@@jjjTTTJJJ;;8ti}ҾӾԿtrguuukkkiii;¯ıŲŲðug]YPUMYP_Ue\P~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZμPǴısj2BB==;8PPJ___gggsss|||nnnfffbbb"';piBB='YPi_zμPǴısj2BB=WWWjjjpppsssooodddXXX.SkkkjjjeeeYYYFFF222882D@"YPi_zμPǴızrFZ@'Rjjjkkkjjjfff```ZZZNNN@@@88.==;885D@"YPi_zμPǴısj2BB=WWWjjjpppsssooodddXXX.SkkkjjjeeeYYYFFF222882D@"YPi_zrYk`kYk`kYrYri]r"|ıȴʶ˷ʶɵdzñ~uj\TUL...222@@@BBBg_+.'8`rrrtttggg\\\FFF=8+bYaYUMYP@=.;;;;;;===JJJHHHYR+t|.'8pkT\\\___eee\\\ne2".'8`rrrttteeeRRR88.YPYPdZ.'8`rrrtttggg\\\FFF=8+bYaYUMYP@=.;;;;;;===JJJHHHYR+t|.'8`rrruuunnnooo'ıȴʶ˷ʶɵdzñ~uj\TYPYPYP\TcZj`od"geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWujuͺ"˷ɶB\\\\\\WWWjjjxxxvvvmmmdddͺ"˷ɶNoooiiiWWW888D@"cY|ͺ"˷ɶB\\\\\\kkkrrrrrrmmmgeZ~1;|wekkkfff\\\NNNTTT@@@D@"cY|ͺ"˷ɶBbbbpppnnn___FB.cY|llliiikkkjjjgggccc\\\RRRYYYTTT@@@D@"cY|ͺ"˷ɶB\\\\\\kkkrrrrrrmmmgeZ~1;|wekkkfff\\\NNNTTT@@@D@"cY|mYxnjxYYYxnjxYmYnZ_YnIJ"zj_cY¯ɶ͹κϻϻκ˸ȵIJtcYYPNH+B@;HH@pg2EHZe`trgkkkfffYYYBBB]U"si+D@'888;;;;;;888==8ZU2tuvu1FôTZZZ\\\UUUDDDjc@NHZe`kkkiii\\\@@@NHYPE>HZe`trgkkkfffYYYBBB]U"si+D@'888;;;;;;888==8ZU2tuvu1HZe`trgmj`N¯ɶ͹κϻϻκ˸ȵIJtcYYPYPYPYPZP]ToeIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znϼϻκmj`jjjiiibbbrrrjjjzsWdddϼϻκmj`nnnkkk___RRR885j_ϼϻκmj`jjjiiijjjrrrkkkc`Rϼ˸]kkkgggfffbbbTTT885j_ϼϻκmj`kkkoookkkWWW882j_]kkkkkkiiieeeiiibbbTTT885j_ϼϻκmj`jjjiiijjjrrrkkkc`Rϼ˸]kkkgggfffbbbTTT885j_@@ZZ|jYzkYYYmrm]YYYmrm]YYzkYY@@ZZ|jYbpbμPǴısj2BB=882FB.Ƴ͹мҾӿ;cTκ"ȵñzj_YPvkscfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ott]}W\\\ZZZPPPNJ.{cfZ8WkkkcccNNN@=+`VcfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ottcfZ8ԿκɶƳ͹мҾӿ;cTκ"ȵñzj_YPB='22.55.D@"YPg]uμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_zҾӾԿtrguuuiiibbbfffwpP'ҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiiibbbNNLzҾӾԿtrgtttiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾų.Wkkktttiii\\\BB=zҾӾԿtrguuuiiibbbNNLzҾӾԿtrgtttiii\\\BB=zTTRR|jYvj_YYYw_YYw_YYvj_YYYTTRR|jYwY˷ɶB\\\\\\WWW___'ȵϻӾvT˸dz~oc]Uxn~H'Ӿ˸|wejjjbbbRRR777............85.WNYP\Rsgzn~yfZZZ\\\WWWDDDj`~H'ų.kkkgggZZZ===H'Ӿ˸|wejjjbbbRRR777............85.WNYP\RsgznH'Ӿϻ˷ȵϻӾvT˸dz~ocUL......DDD;;;D@"cY|˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2@@22|jY}r`YYYYzgYYzgYY}r`YYYY@@22|jYtϼϻκmj`jjjiiikkknnn@ɶѼvcκɵðpe]Tt~?.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWPWWW\\\ZZZPPPFD2vkz9.Ҿ]jjj```LLL555.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWP.Ҿϼͺ""ɶѼvcκɵðpePJ;;;===TTTLLL882j_ϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_HZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`B~jt_YYYYbYbYt_YYYY~j|ҾӾԿtrguuuooopppZǴм8vv;ϻʶŲmbMG*kkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... YYY\\\WWWHHH(((kkkfffWWW888AAAkkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... Ǵм8vv;ϻʶŲmbLH8HHH]]]___WWWB@=zҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zfZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı"v_{eZYYYYwZYwZY{eZYYYYv_.'8`rrruuukkkbbbzrFκӿϻ˷Ų}dZjjjiiiib8t}~ztujg]\TYPYPLF...)))SSS\\\\\\RRR;;;iiijjj___HHH999jjjiiiib8t}~ztujg]\TYPYPLF...)))ñκӿϻ˷Ų}wmP]]]jjjfff\\\sj2".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"88==mYx`YYYYjYjYx`YYYY88==mYHZe`trgmj`BɶѽҾκʶıtwn<~urfbWYPYPNGQQQVVV\\\WWWHHHlllkkkeeeUUU777wn<~urfbWYPYPNGȹeɶѽҾκʶıtJ]Zroemj`BPHZe`trgmj`BPHZe`trgmj`BP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμPWWPPeu_YYYzYzYu_YYYWWPPecfZ8Կκɶı˷ѽӾм͹ȴ¯ja$zwkcZYPYP=6WWWWWWPPP<<<jjjiii]]]DDDEEEzwkcZYPYP=6°5˷ѽӾм͹ȴ¯=eZ8Կκɶı"cfZ8Կκɶı"cfZ8Կκɶı"++r_YYY""gY""gYr_YYY++H'Ӿϻ˷ǴIJ"°5ɶκмѼϻ͹ɶı|wkbWYPPPPWWWUUUHHH---kkkeeeRRR666|wkbWYP°5ɶκмѼϻ͹ɶıH'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"jo`YY''PP++uY''PP++uYo`YYj.Ҿϼͺ"μPñǴɶȵƳ¯"^X4Szrf\TYPA;AAATTTUUUNNN===jjjiii\\\@@@Szrf\TYPA;V+ǴɶȵƳ¯.Ҿϼͺ"μP.Ҿϼͺ"μP.Ҿϼͺ"μPunYY++YY55vY++YY55vYunYY.={\fffNNN¯ıŲŲðug]YPQIHHHRRRPPPHHHiiikkkcccNNN999¯ıŲŲðug]YPQIfffnnnW+P{sYY..wY..wY{sYYlllrrrmmm\\\;;;ıȴʶ˷ʶɵdzñ~uj\TWNHHHLLLHHH===kkkgggZZZ===ıȴʶ˷ʶɵdzñ~uj\TWNddd|||ccc>>>|tZYYY|tZYooopppeeeJJJHHH¯ɶ͹κϻϻκ˸ȵIJtcYYP777BBBDDD@@@///jjj```LLL¯ɶ͹κϻϻκ˸ȵIJtcYYPmmmnnnWWW'''x~zv_Y_Y_Y~zv_YxmmmrrrkkkYYY<<<Ƴ͹мҾӿ;cTκ"ȵñzj_YP888;;;;;;555lllkkkfffWWW888Ƴ͹мҾӿ;cTκ"ȵñzj_YPdddvvvfffDDDPP~~==vvxvcYt_YYt_YYvxvcYPP~~==vvvvpppooocccDDDȵϻӾvT˸dz~ocWN.........---iiiiiiYYY@@@999ȵϻӾvT˸dz~ocWNmmmjjjsssZZZssHH]""PPssNNu|xgYu`YYYu`YYY""PPssNNu|xgYssHH]nnnrrrjjjUUU<<<.ɶѼvcκɵðpeSKVP8WP XPYPYPWNOHB='...... bbbNNNFD.QJXPYPYPWNQIA;.ɶѼvcκɵðpeSKcccrrrgggHHH55YY{Y++~~؅''==DD""tvwfY}jYYYY}jYYYY++~~؅''==DD""tvwfY55YY{Yrrrooo```@@@AAAǴм8vv;ϻʶŲmbIC!P"e[mbpeocj_cY\TYPYPUL?:&P"AXVHcZmbpeocj_cY\TYPYP=6E>UMYPYPUMǴм8vv;ϻʶŲmbIC!gggxxx___111JJPPvY""55""bb..wvsbYx`YYYY]]\YYYx`YYYY""55""bb..wvsbYJJPPvYYYYYYYYYY]]\YYYnnnrrriiiRRR999ñκӿϻ˷Ų}e["|xulb$t}~ztujg]\TYPYPOG"|xz{xzof1t}~ztujg]\TYPYPOGUMYPYPYPYPYPeZi_ñκӿϻ˷Ų}e[bbbooojjjNNNxx55tY""Á88HHffUUztp\YwbYYYYt{rf\YYwbYYYY""Á88HHffUUztp\Yxx55tYvtn`ZYYYYoxkbYYYYYYYcpg\YYt{rf\YYnnnrrrnnn___<<<ǸcɶѽҾκʶıtIJ"zj_cYi]nczn~urfbWYPYPOGIJ"zj_cYi_znx~rj_cYi_zny~urfbWYPYPXOYPYPYPYPYPYP\Tj_pfǸcɶѽҾκʶıtfffbbb++UUn++֥kk..ujYs`YYYYYYYcwwi]YYs`YYYY++֥kk..ujY++UUn}|mYY~rbYYwfbZYYYi~|o\YYYYcwwi]YYooopppfffNNN0005˷ѽӾм͹ȴ¯bZ!μPǴısj2BB=885D@"YPmbzwkcZYPYP=6μPǴısj2BB=885D@"YPi]~r~2`Y.==;852D@"YPi_uzwkcZYPYPYPYPD@"22.22.D@"YPeZxm5˷ѽӾм͹ȴ¯bZ!nnnkkkSSS$$$P""P"u1}P"}P"u1}@@uu55euu˴FFjY|`YYYxrjkmu}|zmY|`YYYuu˴FFjY@@uu55epYYZYYYZi|mZY{kgcfnwweYYxrjkmu}|zmYrrrmmm\\\999XXXkkkFɶκмѼϻ͹ɶısj8DDDͺ"˷ɶB\\\\\\RRR888B='|wkbWYPͺ"˷ɶB\\\\\\TTT@@@D@"]Toeui}}{i`5LLLNNNHHH;;;D@"bYs}|wkbWYPYPB='.........222D@"bYt}XXXkkkFɶκмѼϻ͹ɶısj8DDDddd|||ccc<<<"|tPNE|xz"|xtv|}wsuy"|x~txmpf970"|xtv|}wsuy""88..fYr`YYYvjijt}_r`YYY""88..fYYi{YtpswYrf\_cowpYYvjijt}_ooopppeeeJJJXXXgggrrrrrrZǴɶȵƳ¯'ws]gggZZZ@@@>>>ϼϻκmj`jjjiii___WWWpiBzrf\TYPA;ϼϻκmj`jjjiiibbbTTT882YP\RcZvuuNNFUUUUUUPPPFFF552f\wRzrf\TYPB='......222;;;52.i_XXXgggrrrrrrZǴɶȵƳ¯'ws]gggZZZ@@@>>>dddmmmnnnWWWIJ"zj_cYg]oeodxj_cYi_znzIJ"zj_cYi_znuzntutsgf\bYi_znzIJ"zj_cYi_xmtui_bYeZj_i_IJ"zj_cYi_znuzntutsgf\bYi_znzbbo_YY{k]`fs|Yo_YYbb\kiotZtmjkvvm\YY_mx{r\Y{k]`fs|YmmmrrrkkkYYY@=.YPXOP~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZҾӾԿtrguuukkkiii;¯ıŲŲðug]YPUMYP_Ue\ҾӾԿtrguuufffNNN222WNYPYPwkujvj888@@@jjjTTTJJJ;;8ti}P¯ıŲŲðug]YPNH......;;;@@@882uP~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZPzsWvvvfffμPǴısj2B@=882D@"YP]Uj_9ne2BB=885D@"YPi_zμPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_zμPǴısj2BB=885D@"YPcZoc?g_+88252.D@"YP]TcZμPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_zxbrjYYYvnku{YrjYYYbxvnnsbocgnzYwi]ck}riYvnku{YpppooocccDDDTJYPoct"geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWuju.'8`rrruuunnnooo'ıȴʶ˷ʶɵdzñ~uj\TYPYPYP\TcZj`od.'8`rrrtttggg\\\FFF=8+bYaYUMYP@=.;;;;;;===JJJHHHYR+t|"|ıȴʶ˷ʶɵdzñ~uj\TUL...222@@@BBBg_+"geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWuju"'jjjsssZZZ65.ͺ"˷ɶB\\\WWWLLL;;;D@"ZPcZe\y}zjc@\\\\\\TTT@@@D@"cY|ͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{ͺ"˷ɶB\\\\\\TTT@@@D@"YPYPXOpg2BBB@@@;;;222D@"YPYPUMͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{\tg]YY}mYtg]YY\tpufY{~YvrbY}mYIJ"`rrrjjjUUUD@+YPcYxmIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znHZe`trgmj`N¯ɶ͹κϻϻκ˸ȵIJtcYYPYPYPYPZP]ToeHZe`trgkkkfffYYYBBB]U"si+D@'888;;;;;;888==8ZU2tuvu1IJ"zj_cY¯ɶ͹κϻϻκ˸ȵIJtcYYPNH+B@;HH@pg2EIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znIJ"wpPrrrgggTPDϼϻκmj`fff___TTTDDD55.YP\T_Uvkj`NJ.DDDeeeiiibbbTTT885j_ϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_ϼϻκmj`jjjiiibbbTTTBBBD@+TJYPHH@@@@;;;222...22.YPYPYPϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_sf`YY}um`YYsf`YYoYY|fYYo}tpeYY}um`YYμPǴ;rrrooo```BBBD@"YPi_zμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_zcfZ8ԿκɶƳ͹мҾӿ;cTκ"ȵñzj_YPB='22.55.D@"YPg]ucfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ottμPǴısj2BB=882FB.Ƴ͹мҾӿ;cTκ"ȵñzj_YPvksμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_zμPǴısj2fffxxx___ZT"sҾӾԿroejjj]]]===...22.YPYPYP(((FD2DDDPPPUUU___iii\\\BB=zҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;sҾӾԿtrguuuiiiggg```UUUDDD@=.~~sB@;............22.YPYPYPҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;ssrfg]YYre\YYYrfg]YYs|x|p`YYtk_YYwpj`YYYre\YYY˷ɶ}xgrrrgggTTT@@@D@"cY|˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|H'Ӿϻ˷ȵϻӾvT˸dz~ocUL......DDD;;;D@"cY|H'Ӿ˸|wejjjbbbRRR777............85.WNYP\Rsgzn˷ɶB\\\\\\WWW___'ȵϻӾvT˸dz~oc]Uxn~˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|˷ɶB\\\bbbjjjPPJcY|.'8Z\\\HHH;;;...B='YPYP;;;HHHPPPWWWZZZ\\\\\\rrrjjj\\\sj2.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y..'8`rrruuummmrrrooojjjcccYYYJJJ999000sxnvkNH+............D@"YPYPUM.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y.oeicYYr_YYYYoeicYY|xvztfbYYt_YYYYwkZYYYYr_YYYYϼϻκnkbmmmiiibbbTTT885j_ϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_.Ҿϼͺ""ɶѼvcκɵðpePJ;;;===TTTLLL882j_.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWPϼϻκmj`jjjiiikkknnn@ɶѼvcκɵðpe]Tt~?ϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_ϼϻκmj`jjjiiibbbWWW=;8j_HZ]PLH8PJULYPYPYPUMA;---<<>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5AHZe`trgnkb}xgrrrrrroookkkeee\\\NNN<<<999MG*]T]UYPYPULNHB='B='YPYPYPE>HZe`trgkkknnnjjj```RRR:::>>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5A{n`fbYYzi\YYYY{n`fbYY]~v}vp`YYj\YYYYkZYYYYYYzi\YYYYҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zǴм8vv;ϻʶŲmbLH8HHH]]]___WWWB@=zkkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... ҾӾԿtrguuuooopppZǴм8vv;ϻʶŲmbMG*ҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zeJwmmbpeocj_cY\TYPYP=6000===HHHPPPWWW\\\\\\\\\ZZZ}WôT8Կκɶı"fZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{fZ8Կκɶ;`ppprrrpppmmmfff___RRR@@@<<<dZmbpeocj_cY\TYPYPYPYPYPUMfZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{o__`YYs_YYYYo__`YYY_cnwuuzugbYY}cYYYYYzn]ZZ\YYYYs_YYYY.'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"ñκӿϻ˷Ų}wmP]]]jjjfff\\\sj2"jjjiiiib8t}~ztujg]\TYPYPLF...))).'8`rrruuukkkbbbzrFκӿϻ˷Ų}dZ.'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"=t}~ztujg]\TYPYPOG///===HHHNNNUUUWWW\\\\\\YYYWWW]F'Ӿϻ˷ǴIJ"cH'Ӿϻ˷RnnnmmmfffZZZDDDbZ!t}~ztujg]\TYPYPNG...............D@'YPuju}cH'Ӿϻ˷ǴIJ"mmmooorrrpppnnniii```UUUDDD<<>>ıȴʶ˷ʶɵdzñ~uj\TWNlllrrrmmm\\\;;;ıȴʶ˷ʶɵdzñ~uj\TWNıȴʶ˷ʶɵdzñ~uj\TWNıȴʶ˷ʶɵdzñ~uj\TWNıȴʶ˷ʶɵdzñ~uj\TWN`cYwvcYYcY`iYjYbYwvcYYmmmnnnWWW'''¯ɶ͹κϻϻκ˸ȵIJtcYYPooopppeeeJJJHHH¯ɶ͹κϻϻκ˸ȵIJtcYYP¯ɶ͹κϻϻκ˸ȵIJtcYYP¯ɶ͹κϻϻκ˸ȵIJtcYYP¯ɶ͹κϻϻκ˸ȵIJtcYYP\nY~ssiYYnY\''..""pY""``""++++''""WWwYoY~ssiYYdddvvvfffDDDƳ͹мҾӿ;cTκ"ȵñzj_YPmmmrrrkkkYYY<<<Ƴ͹мҾӿ;cTκ"ȵñzj_YPƳ͹мҾӿ;cTκ"ȵñzj_YPƳ͹мҾӿ;cTκ"ȵñzj_YPƳ͹мҾӿ;cTκ"ȵñzj_YP~\Y""""sYxuwiYY""""sY~\YWWuuLL''8855tY++׵''""ggmm''YYο22pxuwiYYmmmjjjsssZZZȵϻӾvT˸dz~ocWNvvvpppooocccDDDȵϻӾvT˸dz~ocXPȵϻӾvT˸dz~ocWNȵϻӾvT˸dz~ocXPȵϻӾvT˸dz~ocWNbYHHmmWW@@2288UUTT;;p;;PP88rnuiZYHHmmWW@@2288UUTT;;pbYHH88``22;;==""t''22UUvv;;jjTT~""''vn;;PP88rnuiZYcccrrrgggHHH.ɶѼvcκɵðpeSKnnnrrrjjjUUU<<<'''>>>+ɶѼvcκɵðpeWP +ɶѼvcκɵðpeVN.ɶѼvcκɵðpeQJ999+ɶѼvcκɵðpeVNsYccDŽDDb++kkzz..""""roukZccDŽDDbsY``==22WW++uupp88mYYRRԚ55""}|++DD22Y++kkzz..""""roukZgggxxx___111Ǵм8vv;ϻʶŲmbIC!rrrooo```@@@AAADDDWWWcccWǴм8vv;ϻʶŲmbVP8Ǵм8vv;ϻʶŲmbSO4Ǵм8vv;ϻʶŲmbFD.@@@888NNNǴм8vv;ϻʶŲmbSO4Y''PPYYWWUUYYȗTT''22ZZHHZZJJumneY''PPYYWWUUYYȗTT''Y;;++UUrr''88Բ@@YYYNNDD]]FFu88TT@@22ZZHHZZJJumneYbbbooojjjNNNñκӿϻ˷Ų}e[nnnrrriiiRRR999111HHHZZZfffnnn+κӿϻ˷Ų}e[κӿϻ˷Ų}bYñκӿϻ˷Ų}cZNNNYYYWWWLLL===999κӿϻ˷Ų}bY88c@@~~]]22j88ӏ88""\\zzbbvjk`Y@@~~]]22j88c22{{..55RRvUU``HHccHHux""55==..''FF@@""88ӏ88""\\zzbbvjk`YfffbbbǸcɶѽҾκʶıtnnnrrrnnn___<<<$$$NNN___gggsss|||nnnVɶѽҾκʶıtHHHZZZZɶѽҾκʶıtJF5333ȹeɶѽҾκʶıtXVHbbbiiifff```ZZZNNN@@@666EEEHHHZZZZɶѽҾκʶıtJF5333==bbj55WWUU;;Y..ȣYY88==poZY55WWUU;;Y==bbj++UUff''''xx}}]];;""}}ף\\""zwtnfTTjjƼcc""2255""..ȣYY88==poZYnnnkkkSSS$$$5˷ѽӾм͹ȴ¯bZ!ooopppfffNNN000P"<<dZ|o|P"u:III___mmmrrrF˷ѽӾм͹ȴ¯ib8UUULLL777???si+aWYPeZui..zzn'';;88++Y""||ƺDD{rY'';;88++Y..zzn55pp޳mm..''''v~~==~sYYY__''++""||ƺDD{rYddd|||ccc<<<XXXkkkFɶκмѼϻ͹ɶısj8DDDrrrmmm\\\999"|s65.DDDWWWccckkkrrrjjjddd°5ɶκмѼϻ͹ɶıznYWN"we_=cccnnnsssrrrkkk5ɶκмѼϻ͹ɶıwn>>ooopppeeeJJJIJ"zj_cYZT"TPDZZZfffnnnooogggcccñǴɶȵƳ¯mbocvIJ"zi_\YJgggpppssspppgggXXXñǴɶȵƳ¯jjjkkkiiibbbUUUBBB=8+WNYP]Tg]znzIJ"ǴɶȵƳ¯iiijjjkkkiiieee___WWWLLL===@=+NHYPYP`WbYi_znzIJ"zi_\YJgggpppssspppgggXXXñǴɶȵƳ¯jjjkkkiiibbbUUUBBB=8+WNYP]Tg]znz""pY""tYjrpYPzsWvvvfffP~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZmmmrrrkkkYYY@=.YPXOμPǴısj2BB==;8PPJ___gggsss|||nnnfffbbb"';piBB='YPi_zμPǴısj2BB=WWWjjjpppsssooodddXXX.SkkkjjjeeeYYYFFF222882D@"YPi_zμPǴızrFZ@'Rjjjkkkjjjfff```ZZZNNN@@@88.==;885D@"YPi_zμPǴısj2BB=WWWjjjpppsssooodddXXX.SkkkjjjeeeYYYFFF222882D@"YPi_zr]ir"'jjjsssZZZ65."geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWujupppooocccDDDTJYPoctͺ"˷ɶB\\\\\\WWWjjjxxxvvvmmmdddͺ"˷ɶNoooiiiWWW888D@"cY|ͺ"˷ɶB\\\\\\kkkrrrrrrmmmgeZ~1;|wekkkfff\\\NNNTTT@@@D@"cY|ͺ"˷ɶBbbbpppnnn___FB.cY|llliiikkkjjjgggccc\\\RRRYYYTTT@@@D@"cY|ͺ"˷ɶB\\\\\\kkkrrrrrrmmmgeZ~1;|wekkkfff\\\NNNTTT@@@D@"cY|""fn""fY_ZnIJ"wpPrrrgggTPDIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znIJ"`rrrjjjUUUD@+YPcYxmϼϻκmj`jjjiiibbbrrrjjjzsWdddϼϻκmj`nnnkkk___RRR885j_ϼϻκmj`jjjiiijjjrrrkkkc`Rϼ˸]kkkgggfffbbbTTT885j_ϼϻκmj`kkkoookkkWWW882j_]kkkkkkiiieeeiiibbbTTT885j_ϼϻκmj`jjjiiijjjrrrkkkc`Rϼ˸]kkkgggfffbbbTTT885j_bpbμPǴısj2fffxxx___ZT"sμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_zμPǴ;rrrooo```BBBD@"YPi_zҾӾԿtrguuuiiibbbfffwpP'ҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiiibbbNNLzҾӾԿtrgtttiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾų.Wkkktttiii\\\BB=zҾӾԿtrguuuiiibbbNNLzҾӾԿtrgtttiii\\\BB=zYw˷ɶB\\\bbbjjjPPJcY|˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|˷ɶ}xgrrrgggTTT@@@D@"cY|.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2tϼϻκmj`jjjiiibbbWWW=;8j_ϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_ϼϻκnkbmmmiiibbbTTT885j_HZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`B|ҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zfZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"HZe`trgmj`BPHZe`trgmj`BPHZe`trgmj`BPHZe`trgmj`BP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμPcfZ8Կκɶı"cfZ8Կκɶı"cfZ8Կκɶı"cfZ8Կκɶı"H'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ".Ҿϼͺ"μP.Ҿϼͺ"μP.Ҿϼͺ"μP.Ҿϼͺ"μP|fez`fi}pPJLiNNxwrnZRU~PL]x]gYJLbrbjvLNZ444444444222""""""RbZs|LHWWwtwg]g}i]_JJ]III;;;GGGDDD&&&;;;GGGDDD&&&;;;GGGDDD&&&:::;;;<<>>EEEDDDFFF>>>EEEDDDFFF<<<EEEDDD===+++888FFF777BBBDDD***;;;$$$555""";;;$$$PRgN~}PFF_NFJWWFHRLHH}]RHFJW888KKK;;;TTTHHHOOO;;;YYYHHHLLL;;;PPPHHH<<<+++000III;;;GGGHHH???&&&%%%+++"""333***999)))***%%%222###+++333***999)))***YY%% qaVTE33~xkLYY%% qaVTE,,}%%f Z YVTTTETJUoJ\b]JJZLPL\YijNFJ\ZNHFFZfUJFFJeLLL888DDDFFF"BH8NTDDD(((FFF"BH8NTDDD(((FFF"BH8NTDDD(((777+++000FFF"BH8NTDDD>>>!!!666)))<<>>FFFGGG555333>>>'''===+++HHH888BBB@@@===BBB222BBB@@@666"""000aaa@@@ZZZ,,,FFF555<<>>PPPJJJGGGDDDDDDBBBBBB\\\;;;GGGAAA888444PPPGGGBBB:::<<>>zzz-00BFF'22"22".."++'++-00@@@***888...>>>...EEETTT222moo'22"22"..'.."++8;;555@@@===<<<===,,,>>>zzz-00BFF'22"22".."++'++-00@@@***888...,,Tbfc\YYYYXO++Z{{b,,Tbfc\YYYYXO,,Tbfc\YYYYXO;;_RRYTTY;;YYW7BBl7;;_RRYTTY;;YYW7''iHHYYYYYYYYYYTTYFFYRRYYYYLLYTTY;;YYW7}PL\ktHFHT]UPPJUTbsmZHRxe|ur{YFHYvetzkixxgWPWcunnnnmkjgeb__kwpjggiosv}xgcigiifeefreeeEEE777ZϐjzZϐjzGGGPPP...'''!!!Zϐjz777EEE<<>>===@@@444888Y]]2BB5HH5JJ5JJ2FF.BB'88++"''===777---""" <<<rrrxxxMSS2BB5HH5JJ5JJ2FF.BB'88++!**000DDD888xx''nFFfnnvrrxggmkko``iRR]88Y""YYWArExx''nFFfnnvrrxggmkko``iRR]88Y""YYWAxx++oTTn~~HHe""\YWA""nRRYYYYWWY22YYQ^""nRRYYYYWWY22YYQgRRYYYYYYYYYYNNYYY22YTTYYYYWWY22YYQPJJ_nswHFFFFHPibNHHHTb|~eJNjZin]j{|ZFH|{pzzoi]]nm\YUUUWYZZWWUTRRPNLJJJJLPUb_YWTRRPRRTTUZ`bbcc`]]]gn\UPNWbbZTUR]eikkjigffintx{vUUU@@@HHH+Zao+ZaoCCCJJJ999AAA<<<<<<+Zao;;;...LLLGGGEEE555+ZaoGGGGGGDDD888666HHH<<>>III999NNNLLLYYYNNNIIIBBB888;;;XXXLLLLLLaaaRRR@@@FPP8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++===@@@###BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""AAA]]]YYY@JJ8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++...DDD666BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777""""""%%%###"""HHppu|||ffi]]`YYYYYYTTYYYYRRY..YYTfHHppu|||ffi]]`YYYYYYTTYYYYRRY..YYTTTŽȾ55`YT|HHYWWYYYYRRY''YXBBt|HHYWWYYYYRRY''YX''""_WWYYYYYYYYYYLLYYYY22YHHYYYYRRY''YXbLHJ]mpFFFFRNHFFJewTJcbm]HLi{\FPjzs}wnzjguYPNNNNNNLLLJJJHHFFFFFHJTk`}bfie`ZYUPLJJJLLLLRRPNR\r`YUTT\]]\WPLHHL]jmie\Ynb{i}stxbLL`{ztpnkms{voZLLL<<<[[[{<<<{>>>JJJ111GGG{:::...DDD444{GGG555sssQQQ888@@@LLL444!!!777HHHFFF999KKK@@@999UUUKKK???[[[<<<666)))>>>8BB;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22"''555888)))GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***```999;;;8888885@@;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22'++@@@!!!GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***NNN######)))   ###FF};;uu~JJ|=={''j_Y""Y..Y88YTTYYYYNNYRRY''YXDD{FF};;uu~JJ|=={''j_Y""Y..Y88YTTYYYYNNYRRY''YXFF}==ϲffZZ8888RRmmss{{{..\XHHZWWYYYYYYY..YYHHZWWYYYYYYY..YY;;YYYYZZZ______..ZYYYY@@YYYYZZZ..ZYJFHZgkHHJHHR``PHFFF`cN_bjTFFLx\FHPftsn|fbwutxwiRNJJJHHHHHFFFFFHHHFFFFFFHHJJLLPUbbZWUUTRRRRRTTRPPRNLJHHHHHHHHHHHJHHHHJT\bceYUPNLLLNPU\YTRPLJLLJFFHJT]n||ui_jZ}Wvc\PJHJYzsccinspeTJNUGGG888 \iZgR]CL*0...666GGG]]]888uuuEEE444999BBB[gZgR]CL*0<<333;;;@@@BBBBBBBBB@@@DDD777999QQQ444000+++===;;;PPPFFF999777GGGHHHEEE]]]DDD@@@)))WWWAAA'''DDDIIINNN=HHBZZD__F``F``F``F``F``F``F``F``D]]@WW8LL'88"++000&&&CCCfffHHH;FFBZZD__F``F``F``F``F``F``F``F``D]]@WW8LL'88'++BBBDDD***@@@999=HHBZZD__F``F``F``F``F``F``F``F``D]]@WW8LL'88+..BBB000CCCfffHHH;FFBZZD__F``F``F``F``F``F``F``F``D]]@WW8LL'88'++BBBDDD***???&&&%%%+++"""000%%%+++"""000%%%+++"""333***999)))!!!888"""222999)))%%%888"""222999)))***%%%222###......)))222###......)))222###+++333***999)))!!!888"""222999)))%%%888"""222999)))***KKRR55bbrkkk]]c```]]]ZZZYYYYYYYYYTTYYYYRRY''Y22YWWYRRYHHYYJJKKRR55bbrkkk]]c```]]]ZZZYYYYYYYYYTTYYYYRRY''Y22YWWYRRYHHYYKKff}RR}}jjoWWeYtWWYWWYTTYYYYHHYYtWWYWWYTTYYYYHHYY88ZYYY]]]``````@@ZYYYYYYnnszzzWWeYJFFLTU_Wn]HJ_bRJFFHnYgzgNLHFFFLo]HLP`ikckfR]w~usrii_YLHLZjspePFFFJPUJFFFFJT_gmnke\URP]cZWRRRPNNNJHHHHHFHHNUYZZWNHJHFFFFFHT]YJFJYp]YZZRNJHFFFFFFHHHHFFHZg_JFFFFFLjzWTRWPLTUNLLLHFRtxfxz]FFHJU[t{~n}NZAIM***EEE222999BBBMMM;;;LLL~n}NZ$6;MMMHHHHHH???...OOO=Y`~n}NZ27QQQ>_g~n}NZ)8=,,,===!!!DDD...222CCC:::,,,+++<<<BBB===GGG222BBB444DDD,,,FFFDDDWWWGGG@@@BBB***YYYDDD...333DDD888444FFF]kkD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB'..WWWPPP+++FFFQQQFYYD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<>>>BBB___FFF@UUD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++222777"""FFFQQQFYYD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<>>>!!!666)))<<>>vT_ 555DDDWWW```[[[XXXPPP@@@===TTTDDDAAADDDAAA===222777GGGvT_BBB;;;EEEEEEDDD===999>>>PPPvT_;;;444#CKHRKVLWJUHQBL7="EEE///999;;;...777:::;;;#CKHRKVLWJUHQBL7=",,,FFF222AAABBB###BBB#CKHRKVLWJUHQBL7="GGG...HHH111ccc...#CKHRKVLWJUHQBL7="///EEE333]]]111JJJGGG666:::@@@iiiD\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..wwwFFF###GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999@@@BBBDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..;;;'''GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999DDD000CCCTTT000HHH8885;;'55"22".."..".."..".."..".."..".."..".."..".."..".."..".."+++..+++@@@DDD---<<<===,,,>>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888...>>>...EEETTT222moo'22"22"..".."..".."..".."..".."..".."..".."..".."..".."..'.."++8;;555@@@===<<<===,,,>>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888.....LL~~rrrbbv.."";;==22''''nNNYYYYWWYTTYYYY''YQ..^..LL~~rrrbbv.."";;==22''''nNNYYYYWWYTTYYYY''YQ..LL''}wkb_YYYYYYYLLYZZZ''YQ''nYYYTTY22YYYYRRYYABBE''nYYYTTY22YYYYRRYYA''88____nnnvvvzzzWWeYYYYYZjRR{{YAcHFFFHufZJFFFHNrLHFJfsLJPJUuwgeUJPftfTHFJWWWYUNHFFFHHHHFFFFFHR]bgvogbZU_RPPJHHFFFFFFFHRRRTY`iv}WLo\PHFFFFFFFHP\nwgfRHHNZfpxvfZLFHTctOOO~_m3>BFFFHHHGGGFFFDDD444555~_m3>@UUU]]][[[WWWRRRBBBJJJ;;;cccEEE===888-Xa~_m 24PPP===UUUGGGDDD===4Zd~_m)58###X`ccrm|opn~jzesZgNZFR>G222@@@###666555 ;;;...X`ccrm|opn~jzesZgNZFR>GHHHFFF,,,@@@X`ccrm|opn~jzesZgNZFR>G;;;BBB!!!888FFF***bbbX`ccrm|opn~jzesZgNZFR>G&&&EEE777888UUU ,,,JJJCCCDDDTTT222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..bbb222>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFQQQ999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222@@@+++>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222VVV;;;;BB2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++'++...777==="""<<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888TTT>>>===@@@444888Y]]2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++"''===777---""" <<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888zz~;;''zzⓓzzRR..22cWWYYYYYYYRRYY77zz~;;''zzⓓzzRR..22cWWYYYYYYYRRYY7==}xkb\YYYYYYYYY''YYYYRRYY7NNYWWY''YFFYNNY..YWrNNYWWY''YFFYNNY..YWp]]]mmmwww{{{bbnYYYYYYm}wwss{55`WPHFFFFU{eRHFFFHN`WLHFHgU\~{}_PL__jtjgZLPeizTwW\FFJUUUWTPJHFFFFFFFHHHFFFFHUbjzJN\sUUTTRRPJHFFFFFFFLZksnZHHJNUs]Ym\TNJHFFFFFFFFFHY~z~ugYYZZRLHFPgutcWUZbimmgZNTfrYAAA=_g;k5gv7@D888NNN8882220002228884]f;k5gvDKO888BBB$$$FFF?dn;k5gv~555PPP888Ben;k5gvB%*\\\Mgnn~{}xtm|_mNZEOEEE===-2DKO3>@%*000JJJ>>>IIIrrrvvvB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..888###QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222NNNKKK999@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBAAA%%%QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222LLLaaaRRR@@@FPP8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++===@@@###BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""AAA]]]YYY@JJ8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++...DDD666BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""UUzz{rrʍ弼}}''tRRYWWYYYY22YWlUUzz{rrʍ弼}}''tRRYWWYYYY22YWUUss|sibZZYYYYYYYYYY@@YYYY22YW88eYYYRRY''YYYYRRYY=BB=88eYYYRRY''YYYYRRYY=''YY]vvv""YYYYY]r@@Y=gHFFFFJgze_cHFFFFHLjLHHN`NLxn\bw{R]gp{wmj]RgjNnoctJFfYZUNJHFFFFFHHJJLLHFFHP\be|W|YWURLFFFFFFFUrkLFHL\xiUJHFFFFFFFFFFFFZ|{z]JYT|JHHUnznfegiif`YYnwbNLLLCCCiwgv/3AAAlll000...555:::>>>QQQiwgv-2FFFKKKiwgv-9<;;;HHHiwgv/3AAAGGGFFF===>>>^z{{tiwUbFPDDD?G`mgvgv_mT_27555555^z{{tiwUbFPEEE0@D`mgvgv_mT_)8=333^z{{tiwUbFPFFF?G`mgvgv_mT_AIMDDD^z{{tiwUbFP@@@?E`mgvgv_mT_$6;LLL<<<bbb111666EEEB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..sssjjj)))GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@EEEWWWBBBB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH".....GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@666)))>>>8BB;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22"''555888)))GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***```999;;;8888885@@;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22'++@@@!!!GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***VV''ggDD""HHZWWYWWYYVVVV''ggDD""HHZWWYWWYYVV''vvzwk`Z\ZZYYYYYYYYYYYHHYWWYY~YYYYYY""YTTYYYY""YOb~YYYYYY""YTTYYYY""YONN\wwwBBbYYYYiu""\ORJHNJFLbjbJ]eFFFFFHNbTLHJW]{uJHo}JFHZptebJPZm~|}ppjZLRgkZYrnTFL]ZURPLHFFFFFHHJJJLJHFFFHJJ_ZZ\ZWUPHFFFFFFHP\jrogfiox}_RHFFFFFFJJHFFFFJ`v{}gLJRRTU|PLHFHRi}ui_]_cgjjjirjNEEE>>>AAAB˶r`mGGG>>>OOO===<<<>>>B˶r`mGGG>>>PPPIIIB˶r`m444AAAPPPGGGB˶r`mPPPNNNLLLHHH999wm|WcEO)]h~~vgvNZ8?***wm|WcEO,]h~~vgvNZ7>***wm|WcEO,]h~~vgvNZ7@***wm|WcEO-]h~~vgvNZ ;A***GGGrrr888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..&&&???... ???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""BBBCCCCCC777B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..;;;DDD000???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""iii888\]]=TTBZZD]]D__D__F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__D]]@YY;PP.BB++8;;HHH666 HHHBBB@@@999<<>>!v`oDM~iwCL{'_kDDDHHHEEE!v`oDM~iwCL{'_kDDDHHHBBB!v`oDM~iwCL{'_kDDDHHHEEE!v`oDM~iwCL{'_kDDDHHHEEEDDD888444777B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..^^^sss...DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%HHHFFFTTT@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..***777"""DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%GGG888444FFF]kkD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB'..WWWPPP+++IIIQQQFYYD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<>>>BBB___FFF@UUD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++222777"""IIIQQQFYYD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<PPBB5522׉""""nRRY''YPPPPBB5522׉""""nRRY''YPPBBii~g''vv{{{zzztttUUc@@ZYYY22YLLY''YBBbYYYLLY""YZZZ``iY9BB7BBbYYYLLY""YZZZ``iY9''22iuu~ZZ\kw88Y9jLFHJFFHHHFHRebfnw]JJPgJHRYUPYZkgmcgYHFFFFU]JFFvgrcTvpWRfenYJRiwtmfjkx]J]FHHJJJHHFFFFFHYkoojecej}}f]RHFFFFFH`UPLHFJe}eNLegoTZTLLgz`ZTLLgWWW777;;;...999NNNQEEEBBB...GGG555888;;;<<<BBBRRRW===UUU;;;???TTTWBBB@@@///222QQQAAAOOO;;;;;;A,,,BBBGGGJJJHHHFFFDDD}m|LWwR]+{8NT}m|LWwR]+{8NT}m|LWwR]+{8NT}m|LWwR]+{8NTSSSLLLZZZB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..---%%%AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))QQQGGG999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@DDD---AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))IIIZZZBZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..222555(((AAA;;;888888BZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..555888)))"""OOOKKKBBB;;;BYYFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..BBBDDD---AAA;;;888888BZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..555888)))"""""eepp'';;_FFYU""m""eepp'';;_FFYU""ôZiFFwwwvvvsssmmm```YY\..ZYYYYYFFYU@@fYYYFFZY__`kkoY@@fYYYFFZY__`kkoY..mnn}ZZbwYWLFFFFFFFFFHRc]_viRJJPePJHPUPJTnou`YcYHFFFHNUcTLHFf}\ZvwYNPc]`JFFLWciijcf{`LRFFFFHHHHHHHFFFFFFFJNPWY]bi`YNJHFFFFFHYoZURPLHFFFNeousj]NJm~}r|WZ\WLTuweRLe???999......111HHH-NVR]P\LWDM9A;;;GGG:::,,,DDD...<<<-NWR]P\LWDM9AEEE777BBB:::<<>>>>>@@@eeeUggHccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22{{{FFF###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999@@@BBBDDDB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22===---###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999ÓHH;;LLYYÓHH;;LLYYôǤ''`ssswwwvvvmmmnnnkkkiii```]]]___LLYYRRYRRYY''@@gZZZFFZ_ffiiimY;BB=''@@gZZZFFZ_ffiiimY;''++..pmm{\bm}Y;kLFFFFFFFFFJZeYY|vkRLJPiJHLNJHRsrmYU`YJFFFHW]PHFYZ]w}|\RmLHHHFHTbigZNg~ubNZFFFFHHFFFFFFFFFHJRUTRTY_fvuYRNJHFFFFFFJ\grUNJHFFFFHLUWUNHF_c_NHH_z|s_Ug~wvLLL;;;***222<<<G^ehvsusm|`oPZEODDDDDD:::BBB***LLLOekhvsusm|`oPZEOEEE333888;;;>>>Oekhvsusm|`oPZEODDD777555sss666;;;:::AY`hvsusm|`oPZEOEEE888_Ҳv;uR]+Ŷk[f+Z.{FFF;;;<<<_Ҳv;uQ[+Ŷk[g+Z.{FFF;;;777_Ҳv;uR]+Ŷk \i+Z.{FFF;;;>>>_Ҳv;uR]+Ŷk[g+Z.{FFF;;;>>>DDDTTT222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..bbb222>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFQQQ999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222@@@+++>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..qqqBBB]]]===BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22555bbb222DDD777BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, FFFQQQ;;;DYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'55@@@BBB+++DDD777BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, rr++vvDD88cYrrrr++vvDD88cYrr++сkkwPPnHHp;;r..p..m22i@@bDD]NN\YY]]]]___```___]]]\\\___YYYNNYFFYYYYY22BBf]]]NN_''k|||rrx\22BBf]]]NN_''k|||rrx\NN;;rZix88\YLFFFFFFFHHTijWT{pzbLLLiRLJHHFFRkjgRU]YJFFFHPek]\HFRvo~_Zv{bPRcWLJLLFFHZgcYRLeggnbTUjNLJHHFFFFFFFFFHPbrz{z{|zZPPNNLJHHFHHHHHHLTZbgmu_RNLHFFFFFHLPNJFFRsmYLHFFHLTY_befff`ZgrBBB+++...777QQQHhqw}vkzWcFPGGG===999BBB999Rpxw}vkzWcFP&&&EEE000>>>;;;<<>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***NNNLLLBBBDDDDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HH5;;BBB<<<%%%>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***55YEL55YE;;ƐvvJJp88_HHYWWYYYYYYYZZZYYYYYYTTYRRY""YE..==LL````FFg==znnvcBB..==LL````FFg==znnvc''xxHHpww`t}ZZȒcnNFHPRHFFLJ\roPTzebNHLWmNJHFFRZr\bPU\THFFFHW]PHFP`Te_txsfUTPLHFFUe_\\LLUZ`cpfbZZc_HFFFFFHL\r||`rJJJHHHJNPPPPRRRPNNPRY`mzYRHFFFFFFHHHHFHP_e_Z\co}nbZPLHHHHHFFHLPU`onrHHHJJJ000~xm|UbEOFFFFFF999GGG~xm|UbEO///DDD***VVV999===~xm|UbEO@@@DDD222@@@;;;cu{~xm|UbEOKKKHv{Z.hvaef0)ZefffkkkHv{Z.hv@DE*}%WaSSSYYYHv{Z.hvPSU*)Yd]]]kkkHv{Z.hvaef4%Zessskkkbbb111666EEEB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..sssjjj)))GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@EEEWWWBBBB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH".....GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@```999;;;888;==HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB222===NNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$UUUZZZ@@@@BBHbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB888888)))***NNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$;;''++];;;;''++];;ųYYYYێ먨xxNN++m88ZTTYYYYYYYYYYYYYYYY@@YRR;;TTZ]]c..wJJ|ppuFFffRR;;TTZ]]c..wJJ|ppuFFffϜPPn55`m|ffTTnfZNHLeiWFHLLbxoNT{UHFHLPWPNJFFFHLUPzrZNUUNFHHFJRWgULFFN~ZJH`s_bowwi`ife\cYRLHJLWf]]cTR_`UHY{we]`_fePHFFFFFH\|~z`FHHHHHHHJNNLLNPPRRRUUUUYcuWURRNJFFFFFFFFFFFJYb_Z]ZTP_pZZUTPNNNNNPNHFFFFHc|ncWvW[[[FFF>>>0wiwNZ>GHHHIIIBBB;;;JJJ///3wiwNZ>G444BBB)))???;;;;;;3wiwNZ>GGGG...@@@;;;,}wiwNZ>GHHH999wPelTTT===5mz=Y`666wAY`;;;;;;5n{>_gBBB555wG^eNNN222/kv[t{DDD888[[[wPelAAA-U^===GGGrrr888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..&&&???... ???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""BBBCCCCCC777B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..;;;DDD000???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""VVVKKK[[[HHHHHHFUUJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNY]]TTT,,,999%%%>>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###DDDDDDGGGDDDBRRJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NN;BBHHHHHH666&&&NNN>>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###''tT''k''tT'']]"";;88m;;YWWYYYYYYYYYY@@YTzz""bbbkkk""''nbBB{zz""bbbkkk""''nb''ҨkkwUU|x++obnNHUpzgHHJJcwkHUzRFFHLbtRJHFFFFFHggTNRPHFHHHLYWJFFLnYFFFLem_RPYe`RJL]bWsRPWZcn_\eZesfPFFbj`U]`cPJFFFFFFHUpFFFFHHHHHHFFFFFHHJPU\]`cgsPNJHFFHHHHHHFFPeotvwvvw}\WTNNNHFFFFFY{_LFFFt_mFR"\\\JJJ444t_mFR"@@@@@@000^^^TTTBBBt_mFR"GGG888***;;;t_mFR"HHH999~Rpx???999?dn-XauOOO888YYY~Efn;;;;;;JJJBen4ZdvBBB444]]]~Jiq999...=_gSxGGG<<>>aaa...RRRZZZBBB===FYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRFPP;;;000BBBFFFYYYAAAFYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRY``>>>aaa...&&''&&&&UU22""_RRYYYYYYY22Y''Փ;;~iiibbr==z,,T++Z''Փ;;~iiibbr==z,,TՎ..tPPϤz,,TYNHYs{mHHJJZkYFRr]FFJLT\UPLHFFFFFFPuo\LPRJFFHJHNTnbTNHFFL\HFFFHLJFFHJPJFFHPW`e`U]bftzgUb`w|fLFFYf]R]\]m`TLJHFFFFFFFJ]szmecefeHHHFFFFFFFFFFFFFFFHNTYYYYZc}TRPNNPPNNRRPNLJHFJ`w`ZURNNLLLJHFFFLYb{nf]TJNtFFFFFFDDDD{m|NZ7=VVVBBBJJJPPPGGGD{m|NZ7=DDD;;;@@@@@@D{m|NZ7=@@@222;;;999;{m|NZ7=OOOGGG53EEE;;;888===@@@5,}:::<<>>DDDZZZCCC===BRRHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT5@@YYY444EEE555NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;bbbHHHBBBCCC===FUUHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT8BB@@@VVVTTT+++!!!???NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;&&V''x&&V&&{{gHHYYYYBBYT}}zzTTfggn55kkuu~HHxBB}}zzTTfggn55kkuu~HHx''88YY{{TTxnNTjsgHFJLRHFJb`HFLPv}WNHFFFFFFFR`YJHRRHFFHHJPZTHFFLPFFFHLNNHFFFFFFFFHLUTT]fvuPbzfHFFL`ZNYYbUNJHHFFFFFFJT`]RUepvvnYHFHRZ_`_\HHg}uP{N~LHHFFFFFFFFFFFFFHJJHHHHJn{gYZbsUTT\bZPLHFFRw}\{PLJT\YLHJU`fjwxbWURLZLLLFFF@@@tZgBLBBBtZgBLGGGMMMPPP===tZgBLDDD555<<<tZgBL&D<<<bbb===GGGBBB555&;<<<;;;SSSeeeDDDPPPEEE888GGG&D111AAAOOOUUUEEE777&D888222SSSBBBIIIZZZB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..---%%%AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))"""QQQGGG;;;B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD---AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))"""]]]\\\BBBBBBDDD@BBDRRDYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BYY@UU=HHFHH888]]]@@@...:::NNNTTTAAADDDDRRBYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BZZFYY;FFbdd]]]000rrr===DDDZZZ999HHH;==R]]BYYUggB\\B\\B\\B\\B\\B\\B\\D\\B\\B\\B\\B\\B\\B\\B\\D\\BZZ]kk=HH\]]RRR---CCC>>>NNNTTTAAADDDDRRBYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BZZFYY;FFbdd]]]000rrr===''a''ss}''a&&{{iLLYBBYT""Լ''..rrrrrzRR""Լ''..rrrrrzRR;;JJffȤUNHJZeYHFHHHHFFHPsTHHNTY}`RNHFFFFFFFFHHFHRPHFFFJLRT]TLHFFHHFFFTbe]NJHFFHHHHJLUWfgYLTfPieFFFFUUJPUbTTUUTPLJHHFFFFHHFFHbzw_HFFHJRZWJHFFFZ~}f\RNLJHHHHHHFHHHHFFFFFFFF\~jg``e|rZNLRYZWWZjUuP~LHFFJiwtw}{rxjWn}ZTNJHJUUJHPUZ]`erwfbnx\JJHHRRRRFFF@@@xesHQDDD444xesHQKKK;;;OOO;;;xesHQHHH888EEENNN???MMMxesHQ>>>:::EEE777BBB111;;;===GGG>>>TTT888<<<...;;;<<<>>>III555DDDRRR555MMM>>>000999AAA>>>>>>@@@eeeUggHccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22{{{FFF###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999@@@BBBDDDB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22===---###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999DDDHHHZZZGGG@@@DDD;;;DDD;;;BBBDDD777BBB@@@999DDD999@@@DDD777BBB@@@999DDD;;;FFF999HHH888AAA===BBBDDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000GGG\\\DDD<<>>aaa222000DDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000'' qBB33~'' q&&mm++c;;YVєꍍbbv|||HHp;;BBєꍍbbv|||HHp;;''""vvZZ==nNJHLRJFFHHHHFFFHr]JFHUYPHFFFFFFFFFFFHRPFFFHJW\|THFFFFFFHe{iUNHFHJLLPZ_LbRxbFHFFJPHWgZZWTLJHHHHFFFFNbki]LFFFFF\onZHFFHft]TPPLJJHJHHFFFFFFFHb{jZLFJm]\_jcPHFHL`xupmjgfiotx{|{vgNFPcTLLJHHFFHJNRU]fnu{t\Tu~xwgNFFFNFFFEEE}jzJUDDD}jzJU888PPP888}jzJU;;;FFF@@@}jzJUKKK;;;BBB222333;;;lll999```DDD===QQQ222...:::<<>>>>>ooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGG>>>[[[;;;III]]]@@@444rrrrrrTTT@@@444rrrrrrTTT@@@444iii)))DDDvvvooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGG''BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBPP''&&ZRR;;rrr__sWW\\sUUpRR;;rrr__sWW\\s""__\\sUNJHHHFFFFFHFFFFF\|pJFFHRY_eZTRJFFFFFFFFFFFHPNFFFHLRYW_UNJHHFFFFJosWPHFHLPP~PRT\iZN\R_HNHFHHFJZtm]]_YUTRRNLJHHHLRRJHFFFFFR]]UJFFTz]ZWUTRRPLJHHHFFFFFFHZw~mg]PJUsb_ZURNJHP]is{|wpjijjge`_]\\\ZYTJFHRt_TRPNNLJJJPY]_`bbb`]\YTJFHZvziWHFFJUVVVDDD.L;n~LWGGG+++.L;n~LWBBBJJJJJJ888.L;n~LWcccBBBJJJFFF.L;n~LW<<<888ccc===;;;999888999;;;@@@UUU===BBB777***000777<<>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***NNNLLLBBBDDDDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HH5;;BBB<<<%%%>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***RRRDDDUUUFFF@@@GGGFFFEEECCCEEEFFF@@@GGGFFFEEECCCEEEFFF@@@KKKBBB@@@EEE999TTTLLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<KKK999BBB>>>III888NNNGGG111DDD:::LLL888MMMGGG111DDD:::LLL888NNNDDD666LLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<''%%''%%&&s Y++ֺDDzz~BB++ֺDDzz~''YYvv''ȅpNLLJHFFFFFFFFFFL\UFFFH\u]RNHFFFFFFFFFFHPLFFFHLW_WNJJHFFFJkuULHFHNTZ~Y]W}L~YHLHLJFJWb}xrm_YTLLLLLJJHFFFFFHHHHFF]}k_WUYRNLJHHHFFNpweZUPLsg\TLWbfb\YWUUZ]ZUPJHHFFFFFHJxiZWWWZU\]TNLHFFFFFNfu{uj]PJHJ{NNNZϒv2pKVJJJZϒv2pKVIII===JJJZϒv2pKVEEELLLBBBZϒv2pKV;;;AAA......888LLLLLL;;;DDDGGG<<<...999NNNLLL;;;///>>>...>>>;;;DDDuuu```999;;;888;==HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB222===NNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$UUUZZZ@@@@BBHbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB888888)))***NNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$LLLDDDHHHBBBKKKDDDHHHBBBKKKDDD>>>TTTNNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBBVVVIII>>>GGGOOONNN666DDDOOONNN666DDDLLLNNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBB''%%''%%&& Z""ԠYYrrDŽEECC""ԠYYrrDŽEE''==шEEYPNRYTNHFFFFFFFFFHHHFFFJUbRRNJHHHLHFFFFFHPLFFFHPTUbUTNPHFFFF`oLHFFHPgZ`PxiHoTHNNJYUHL\g`\UTRPNLJJJJHHHHHHJJJHHHU{bYUWUTTTRRRPNNLJWttcTJHJPgb_WUY`geWPNNLLJLLLJLLLJHHHHJPf]WWWZ`c]`\UTRPNLLLJJJ`sxtg]WUUeRRRIII&{ToHRPPPGGG&{ToHRNNN<<<PPPGGG&{ToHRPPPGGGJJJ<<<&{ToHR===>>>DDD222???@@@???<<<EEE777LLLEEE000+++;;;???WWWNNNIII<<<111<<<000JJJGGGMMMVVVVVVKKK[[[HHHHHHFUUJffNjjxTkkJccFbbF``D]]@YY8NNY]]TTT,,,999%%%>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###DDDDDDGGGDDDBRRJffNjjxTkkJccFbbF``D]]@YY8NN;BBHHHHHH666&&&NNN>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###NNNQQQTTTNNNQQQTTTNNNOOONNNAAAGGG???AAAGGG???AAAHHHAAAIIIbbbIIIIIIbbbIIIIIINNNAAAGGG???AAAGGG???AAAHHH''%%f''ՉPPggzz{==KKBBJJ''ՉPPggzz{==KK'']]FF}xss==KKT\YJFFFHHHHFFFFFFFHJcmcPLHHRHFFFFFPNFFFHPWb\WPHFFFFRp}eHFFFH_m`_u\LpRFZLHN\UHW\xtmn{~mZTPNNNRTRPne~__ZYWWUTezNJNYj`]\WT\RPRRPPPPTcf`\YZ_ge`]Z\ci`Rrxuncvem|#CKvem|#CKYYYBBBMMMvem|#CKFFFvem|#CK;;;999lllAAA;;;HHH<<>>JJJBBBLLL```;;;...===<<<999===FYYJffJggUoo]ttRkkHeeFbbD__BZZ;RR@JJ888333555BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...RRRZZZBBB===FYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRFPP;;;000BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...sssQQQsssQQQssssssQQQsssQQQsssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr'';;pp22""ttίLLcccc;;pp22""ttίLLcc22igiTT|vvزLLccgY\b\NHFFHHHHFFFFFFFHL_RPPLHJPRUJHHHHNNHFFHPUWZg_WPHFFFFH]eNFFFFHRenYJfunHFLzHHNNLTJJNWWjfc`__`bjcbp{_`kgecgc`cnimjnunHͯYcrHͯYcrGGG<<<HͯYcrNNN???HͯYcrBBB;;;VVV;;;DDDGGG***555???FFFJJJLLL;;;@@@GGG@@@@@@FFFFFFFFFHHH<<<888"""===OOO>>>DDDZZZCCC===BRRHbbHeeHeeHccFbbD__BZZ=TT5@@YYY444EEE555NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;bbbHHHBBBCCC===FUUHbbHeeHeeHccFbbD__BZZ=TT8BB@@@VVVTTT+++!!!???NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;,,}DDHH55vvUU..BB..DDHH55vvUU..''''`ZiiȯUU..eijRJHLJHHFFFFFFFPoogPLNU]LJHJJHFFRZxg]NFFFFFJJFFFFFFNcgnewTZgUFHFgu_FHNLJLUY5N_2{5N_2{NNN:::5N_2{5555N_2{GGG888888;;;===@@@TTT???IIIFFFJJJTTTIIIAAAFFFNNNGGG888===BBBRRRQQQIIIDDDFFFFFFFFFFFFNNN[[[GGG444///999***...555@@@]]]\\\BBBBBBDDD@BBDRRDYYB\\BYY@UU=HHFHH888]]]@@@...:::NNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===DDDZZZ999HHH;==R]]BYYUggBZZ]kk=HH\]]RRR---CCC>>>NNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===''''''''''''''''''''''''''''''''''..++55ee}}''++55ee}}''}}''_UPJLPNJHFFFFFFHLT]TPRPNPRZ\RNNJHHHFFLTZjmZNJHHFFFFFFFFFFFN`co`PJNPHHLJLTHFHNNNJJLRWYn~n~ZZZBBB333n~FFF***n~PPPJJJJJJPPPOOOPPP^^^PPPKKKRRRNNNPPPHHHPPPPPP\\\RRRNNNRRRLLLPPPJJJJJJGGGBBBBBBDDDGGGDDDHHHZZZGGG@@@DDD;;;DDD;;;FFF999HHH888AAA===BBBDDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000GGG\\\DDD<<>>aaa222000DDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000vvBB''VVBB''VVvvBB''VV''++ѴǕBB''VVncYNPJHFFFFFFHUuwiRNPU_ZPHHHFHWccPLJJHFFHHFFFFFHW]v{rcwNJHFHLPLLHHLPLPWZ{Mgn{MgnGGG{MgnNNNAAA{MgnGGGbbbDDDZZZBBBQQQBBB___ZZZ;;;>>>>>>ooo\\\FFF>>>YYYHHH888IIIfff999888GGG>>>[[[;;;III]]]@@@444iii)))DDDvvvooo\\\FFF>>>YYYHHH888IIIfff999888GGG''++PPBBssPP''++PPmm{{{{UU;;++PPebWURRPJHHFHHFHJT_UUTNPTWZ_\NHHHFHRcYPPPNJHHLLHHHHJJPTWc\sTLJHHJPUTWNLPTRPTWZZiPPPGGGRRRIIIRRRDDDUUUFFF@@@KKKBBB@@@EEE999TTTLLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<KKK999BBB>>>III888OOODDD666LLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<''''''''''&&&&'';;'''''''';;''''''''''&&&&'';;''''&&&&&&&&&&&&&&'';;r`WZRNJHHHPJJLWz}bTWPW``UNJHHFJoszRUPPNNJLLNNR\_uT}LLLNYZZUUT]`]H"!H"!H"!H"!LLLDDD>>>TTTNNN>>>KKKBBBVVVIII>>>GGGLLLNNN>>>KKKBBBbWUURNHFFH_PLNWgYUZURU\biPJHFFLegW\UZUPPPNNRRNNTYWzR~TNPRRT|WW\WWZef`NNNOOONNNAAAHHHAAAIIINNNAAAHHHoWYTHFFb]R\`\]WWcpeJHFHN~|]~isYRRWPTffWZ]WUYe_YtvbssssssUY]PFFFLYUTr]oZvW|ZpRJHFHP{vYUUWYUPRU]bi\YRRNTZn\jpWYWHFFNefWYfsizTwfJFFHTxi\Z{\UTrsrjWPNP_c]iYTWfeNFFHRWYUWTxHFFJfTwfTTU\Z{\]c_PNPRWrTYfLFFFP]UinHFHJRpZZveo]x}]RUWUYmvtzpnj\nZNR\sib\UR]JFFHNTZYWN~HFHJPecZWWZ]\Z`fZTPPRWRRRRYi]~btYZ_eZYUTW]\ZWZ}""""""fWL_HFFNUUbm}eFFHPib\UUZYkYNNRNNPPZ\Wgk`feZWk\WWRPTWzNNN######))) ###WLJJPPHHHJNRZWW`JFHHJNU``WTPTWWTb\RNNNLLJLNNPRPTURR]`]TUUUUYZZWYU|NLLLLRT}_u-NWR]P\LWDM9A-NWR]P\LWDM9A-NWR]P\LWDM9A-NWR]P\LWDM9A***;;;$$$555""";;;$$${_TJHFHHFHHJPRWbe}cRHFHHHN\_ZTNUUcWPJHHHHLLHHJNPYiZWTRTLWUPJHHJT\sOekhvsusm|`oPZEOGGGKbhhvsusm|`oPZEOOdkhvsusm|`oPZEOOekhvsusm|`oPZEO@@@???&&&%%%+++"""333***999)))***%%%222###+++333***999)))***?NTTVZ\\>hxr?NTTVZ\\?NT\ZZZTTTwUPHFFFFFFHJPPPNYnWNHFHHHLPYZ_ZUPNNRRU]ZWPHFFFFFHHFFHJJLPcZWWPNLNPPLHHLLRPLHFHJNcwRpxw}vkzWcFPGGG***Jiqw}vkzWcFPKjsw}vkzWcFPRpxw}vkzWcFP111--->>>!!!666)))<<G<<<777)}wiwNZ>G0wiwNZ>G3wiwNZ>G<<<&&&BBB,,,!!!222[[[TTT"""''''''+++000444@@@OOOJJJ""",,,444000&&&+++111@@@555&&&""""""""""""'''***@@@@@@HHH'''***555555222222<<<DDD000CCCTTT000HHH8885;;'55"22".."+++..+++@@@DDD---<<<===,,,>>>zzz-00BFF'22"22".."++'++-00@@@***888...>>>...EEETTT222moo'22"22"..'.."++8;;555@@@===<<<===,,,>>>zzz-00BFF'22"22".."++'++-00@@@***888...,,m%%^ ^ ]\ZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYQvw\\|||YYc;;jhvw\\|||YYc;;jvwooвÍ]]tYYYYYYYYYHH]fe`_````Y{p_HFFFFFFFHHHHFFH\b\gZUHFFHNNHHHHJUPHPRncenRHFFFFNe]HFFFFHW_gjWNJJTLNHHzLFHnufJ~xb`__`cefmw~`_{pbccejskc`cfgecceegjks{nucznijtxrmiijntt_mFR"***t_mFR"t_mFR"t_mFR"111000444%%%<<<UUUDDD}}}]]]...&&&+++111<<<,,,"""'''444BBBeee777...FFFGGG222VVV;;;;BB2BB5HH5JJ5JJ2FF.BB'88++'++...777==="""<<<rrrxxxMSS2BB5HH5JJ5JJ2FF.BB'88++!**000DDD888TTT>>>===@@@444888Y]]2BB5HH5JJ5JJ2FF.BB'88++"''===777---""" <<<rrrxxxMSS2BB5HH5JJ5JJ2FF.BB'88++!**000DDD888--~b`````````````````````````````````Y@@u]]i""7h@@u]]i""7BBwȶ``eeoooooooooffptric`````YmJHFFFFFFFHHHHFFFJTY\RTbYWPHFFFNPFFFFFHPRJHHLNPR__m_RHFFFHe}pRFFFFHPRWY\\ZWNHU\LNNHLZFRpL\nPPRRTTRNNLNNNPPPTWZnmYRNJNZz{eRTUUWWWYZZ__e~TPPPPPPPPRRRRRPRRU\TUW\]`ccnuxwr_R`c]\ZZ]`g_ZYY\]`f?{m|NZ7=WWW222NNN;{m|NZ7=;{m|NZ7=D{m|NZ7=+++DDD^^^NNN<<<sss```~~~<<<666'''+++000777000+++TTT000777IIIMMMDDDIIIBBBLLLaaaRRR@@@FPP8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++===@@@###BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""AAA]]]YYY@JJ8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++...DDD666BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777""""""%%%###"""``n66M ?777777777777777777777``n66M ?777777777777777777777&&e````````````````````````````````_YTJJvBBggjTTmIIzJJvBBggjTTmJJvBBffeexxxxxxxxxttw++ug``````YbUJFFFHHHFFFFFFFFFHNYNYUTPHFFFLPHFFFFFHHHHNR|j`ZgPHFFHLo`FFFFHNUbo\LHUYJNNToHixP{UHHJJJHHHHHJJJLNRW\`guxPHJTctWJLNRRTUUYbpPHHHJLLJLLJLLNPWgYW_bgUW]gtxs`JJLLNPT\`]c`ZWW]fuBBBtZgBL@@@<<<tZgBLEEEtZgBL@@@tZgBL777&&&FFF|||>>>sss888IIIJJJ>>>BBBDDDIII###III???666)))>>>8BB;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22"''555888)))GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***```999;;;8888885@@;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22'++@@@!!!GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***NNN######)))   ###]]v]]v&&r````````````````````````````````]YTBB``ȳff7CChBB``ȳff7BB``||HHZZpb``````Y\THFFFU\LFFFFFFFFFFHJLLJNU_WRLHFFFLPHFFFFFFFFFFHNRR]]YUZ~UuTNHFHLUukJFFFHJJNPWbWJFJLHLPHY}L}UW]FFHHHHFFFFFHJJJLLLLLLPTUY_WLPUZewpNFFHHHHJLNPRWYUWW_RJHFFFFFHHJPUZ]ZUUWY\bffbWLLPT\gWJHJP]juzufNFFFFFHJLNT]]\YUWZWWWWWZi999 xesHQ***222EEE000xesHQEEE&&&xesHQ444xesHQ000...AAA===:::DDD&&&222wwwJJJ~~~ccc===NNN===###GGGAAA@@@>>>HHHBBB""")))444HHH@@@JJJ@@@iii888\]]=TTBZZD]]D__D__F``F``F``F__D]]@YY;PP.BB++8;;HHH666 HHHBBB@@@999<<>>BBB___FFF@UUD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++222777"""FFFQQQFYYD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<>>>!!!666)))<<>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888...>>>...EEETTT222moo'22"22"..".."..".."..".."..".."..".."..".."..".."..".."..'.."++8;;555@@@===<<<===,,,>>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888...''V''r''V''ʀžub````````````````````bgpurfLLYBBYZ]]FFh]]FF]]Ȏkk{`````````YTJFF]rRFYkZJJHHm{sYHYnTHJHFFJRPL\ouPFFFFFFHP\e`WPHFFJPJHFFJLHFFFH\LFFHNbm]]R]fYFFLf|w`bUiztfb]U`efecemzs]JFFFFFFFHJT`}cZYYYYTNHFFFFFFFFFFFFFFFHHHw`JFHJNRNPNPTtJT]fn{bYLFFFHJLLNU`sTTT"""[[[vem|AHIII""""""___FFF999vem|AH<<<qqq===...vem|AH"""@@@vem|AH~~~HHHFFF)58crm|opn~jzesZgNZFR>GTTT;;;###pppsss%26crm|opn~jzesZgNZFR>GHHHBBB333AAAHHH)58crm|opn~jzesZgNZFR>GBBB<<GDDDTTT222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..bbb222>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFQQQ999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222@@@+++>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222VVV;;;;BB2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++'++...777==="""<<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888TTT>>>===@@@444888Y]]2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++"''===777---""" <<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888''''""''''ɀ¿wf````````````````ckwtHH]YYYBB`JJNN7hJJNN7JJ~ȍ88p`````````YbRLHFFRzUJkwcJJHHgzpUHNnYRLHHHFHPRNTggHFFFFFHJRRtWgb]LJR`eYPR_meLFFFYnLFFJPW`__U`jbFFPfseZe\_ncZWPNR\pUHFFFFFFJPcsgc`]\UPJHHFFFFFHHHHHHFFFF}wvvwvtoePFFHHHHHHFFHJNNPPUL_{YFFFFFHLNNNNNPTUW\JJJ@@@HͯYcr777***YYYDDD<<<HͯYcr222(((III555---HͯYcrDDDTTTGGG444,,,HͯYcrBBBJJJLLL...$375@B.2EEE<<<IRn~{}xtm|_mNZEODDD...$375AC3>B%*<<<@@@IRn~{}xtm|_mNZEOIIIrrrvvvB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..888###QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222NNNKKK999@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBAAA%%%QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222LLLaaaRRR@@@FPP8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++===@@@###BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""AAA]]]YYY@JJ8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++...DDD666BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""''xT''''x''xT''ccſ¶LLxkc````````cgo{++ffpYYYYYY22}\ů¿++cmmů¿++cmmů¿++cDDƾg`````````YuPHFHU{TNoxbLHFWieLHZgRHHHFNUUNZrzPULHFFFJNWcei`iwwob_s`HJZ~NFFLUji_`]ew{YHU`_RTc]]fWLJLYx`z~|\HFFFFFHPefucYUUUURRRPPNLLNNJHHHHHHFp_PTZ]Z_bYJFFFFFFFFFFFJNRWWvWcn|cHFFFFHNPNNNPUZZBBB;;;TTT1N_2{000555QQQBBBMMM4N_2{222;;;---vvv*N_2{```[[[444&N_2{JJJ-DG`mgvgv_mT_+;?uuuHR{{tiwUbFP===?G`mgvgv_mT_38WWWHR{{tiwUbFP666@@@#BI`mgvgv_mT_+;?FFFHR{{tiwUbFPCCC)DI`mgvgv_mT_6>@;;;HR{{tiwUbFPbbb111666EEEB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..sssjjj)))GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@EEEWWWBBBB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH".....GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@666)))>>>8BB;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22"''555888)))GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***```999;;;8888885@@;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22'++@@@!!!GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***''kT''++q''kT''ǎ˄ZZttwoooYYYbbbgg|TBBȨ==o..7hBBȨ==o..7BBȨgiiþc`````````YWNLHNbezRPor\JLFFHRPHFNWRHFFFHT\UPb\rZRFFHJLNTUWfsxt_eT`PFHP]ZZbfrc`ZULL\\_eUFFHLPPT`||r\LHFFFFFHP_czm`YRPNNPRRRPPPPNJHHHJJJJJn}oc\Z_e_PHFHHHHFFFFFFHLRWYno`UPLHFFHHHHHHHLPZbIII===@@@n~)58DDDTTT,,,OOO===OOOn~+7:555!!!HHH\\\333JJJn~)59DDD|||sssUUU---555n~&36LLL@@@/_i~~vgvNZ:@!&wm|WcEO@@@-]f~~vgvNZ ;A!&wm|WcEO@@@Lmv~~vgvNZ:@!&wm|WcEO@@@Inw~~vgvNZ7>!&wm|WcEOGGGrrr888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..&&&???... ???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""BBBCCCCCC777B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..;;;DDD000???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""iii888\]]=TTBZZD]]D__D__F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__D]]@YY;PP.BB++8;;HHH666 HHHBBB@@@999<<>>>>>000JJJ777HR***WWW>>>OOOAAA555666HRFFFddd'''!!!HRsssiiiLLLBBB555n}o"IQ~iwCLv`oDMLLLBBB555n}o"IQ~iwCLv`oDMLLLBBB555n}o"IQ~iwCLv`oDMLLLBBB555n}o"IQ~iwCLv`oDMDDD888444777B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..^^^sss...DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%HHHFFFTTT@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..***777"""DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%GGG888444FFF]kkD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB'..WWWPPP+++IIIQQQFYYD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<>>>BBB___FFF@UUD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++222777"""IIIQQQFYYD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<++vv88i\?==>++vv88i\?++ŀԿ׸ո҄zz``ffuuÃxxxeeb?Ͳ""\Ͳ""\Ͳ""\mȩuu``````````YeJRiv_]cRHFFFFFFFFFWcNHFFFHYcY`uonTJPUPHPcNYwvZ\}fFHLTptR`{fcjiicWLFFJ]ib]YWPNHFFFFFFFHHHHHHFFFFoYHFFFFFHJY`}|r}~mJN]isuoeNFFFHLRZeLRewuTL\ZWEEE@@@9!&AAAHHH@@@@@@KKKGGG888<!&'''"""VVVKKK===<<<6!&uuuAAA+++"""AAA3!&^^^ppp,,,qqq8iu'^kwR]}m|LWqqq8iu'^kwR]}m|LWqqq8iu'^kwR]}m|LWqqq8iu'^kwR]}m|LWSSSLLLZZZB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..---%%%AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))QQQGGG999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@DDD---AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))IIIZZZBZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..222555(((AAA;;;888888BZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..555888)))"""OOOKKKBBB;;;BYYFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..BBBDDD---AAA;;;888888BZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..555888)))"""ϪTT`_LLϪTT`_ϻΡ22bԿ׸شռʯeeIJè_rrϹĶY7rrhrrϹĶY7rrϹĶYgȚff``````````YPJJJ]wnfbeRHFHHHFFJHFLUULFFFFHYgcmgkZYPUYRHJRRLWpvTcrgvFFJR]]PJ]xkjfmtwiRJYnef}jecejookYHFFFFFHHHJJJJHHFH`HFFFFFHLR]fogeLNe}eJFHLNPRUgLLTZ`zgLLTZYTPJJJBBB555\gZgR]CL*0<<>>HHH[fZgR]CL*0WWW###"Wb]lz"rw5~Zg2YeT2sP\"Wb]lz"rw5~Zg2YeT2sP\"Wb]lz"rw5~Zg2YeT2sP\"Wb]lz"rw5~Zg2YeT2sP\666:::@@@iiiD\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..wwwFFF###GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999@@@BBBDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..;;;'''GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999AAA>>>>>>@@@eeeUggHccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22{{{FFF###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999@@@BBBDDDB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22===---###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999""͠||;;jYYi^""TT""͠||;;jYYi^""͠м_```Ӿ׸شռʯHHЃ^УY||++++hУY||++УYbȘʻ``..``````````YcJJHL_YzvijWHHPURHHPPHJUbJFFFFHZsuzfLH`\YZRHJRfLUjwPo|oLFHP{NH\oj`mtjz{icWRRZirxwkRHHFFFHHJPNNRuRFFFFFFJT]_gui`LHLb{p]JFHNT\xfNR\cebbix~oZLFJRWTNNNNGGG;;;)Ze{~wiwPZ:@FFFEEE???AAAGGGDDD)Yc{~wiwPZ7>;;;@@@DDDFFFHHHHHHIIIJJJIII...@@@zzzQQQ\\\VVVAAA555%Yd{~wiwPZ:@uuuuuu222KKKFFFBBB===;;;888555...333)Ze{~wiwPZ ;A,,,iii2225555Z6nz+Ŷk[g_Ҳv;uR]iii2225555Z6nz+Ŷk[f_Ҳv;uR]iii2225555Z6nz+Ŷk\g_Ҳv;uR]iii2225555Z6mz+Ŷk \g_Ҳv;uR]DDDTTT222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..bbb222>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFQQQ999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222@@@+++>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..qqqBBB]]]===BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22555bbb222DDD777BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, FFFQQQ;;;DYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'55@@@BBB+++DDD777BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, bb֦FF""YYc88jSDD@@gbb֦FF""YYc88jSbb֍UUrY_88׷شռʯkk''``JJuSrrѶ""`ǕLL7rr55hrrѶ""`ǕLL7rrѶ""`\ȰzzZZ``````````YNHHFFHHm}cJJ\b]JHUTHJiRWNHFFHciFHij\ZNHLiRJUiu}_}{z]HHLZgLFY|~iYgkj]JHHHJT\bcZLHHHFFHHLPPRRRTWzgPFFFFFFHU]]_bcLb}oTHFFHTeok`RHFFFHPU]x~okcZY\]\UPPRRLHFFHLPUYZRP<]f~n}NZ+;?!!!??????FFF<_g~n}NZ6>@<<<666---111XXX@`i~n}NZ+;?222EEELLL>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***NNNLLLBBBDDDDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HH5;;BBB<<<%%%>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***Լɬ55]]i||njjԼɬ55]]i||nԾ˧YYsxxΚزջʫ``ȶnѲ55\Ȫgg55DDѲ55\Ȫgg55Ѳ55\YnȞ՗υ``````````YbNHFFFFFe]JbjbLFJNHRbetpZHFJ}oHJv{]WJHTgLZjpp}|~mZPJuLFTnrYZk_JJHFFFHJJJJHFFFFFHPUZ]}xoifgorj\PHFFFFFFPWZ\ZZJLg}{v`JFFFFHJJFFFFFFHR_}Njrijjjgc_]_gu}iRHFLU|TRDDD}gv??????BBB}gv@@@DDD777\\\}gv222LLL555777[[[}gv444III1%YdHv{Z.hvaefIII6)ZeHv{Z.hvaefIII4)ZeHv{Z.hvaefIII*|)YcHv{Z.hv_cdbbb111666EEEB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..sssjjj)))GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@EEEWWWBBBB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH".....GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@```999;;;888;==HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB222===NNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$UUUZZZ@@@@BBHbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB888888)))***NNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$''ϖĠTTn\\|''pp++''ϖĠTTn\\|''ϖLLr`_zLLvvTTƞΰ͘ʚ˩ǕYYiiDDffoorrǗZZwRRp\\ww7RRhrrǗZZwRRp\\ww7rrǗZZwYbTTƲ``````````YLHFFFFHc_ezgJFFFFHRg{wb\nxLN`NHHLURL]jmw{pg]LRfLFJtconNjg{eb\PHFFHLLJJJHHFFFFFHJNUZYix\LHFLkrUFFFFFFFLRRUUUWYWW|TwPJ]z{|ZFFFFFFFFFFFFHJPUNbwnYY`fiigefnznUHHJN~T|WYDDD&&&vT_.2AAA???444999 vT_999AAAFFFHHHIIIMMMXXXNipvT_!!!---OOOEEE===888111<<>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###DDDDDDGGGDDDBRRJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NN;BBHHHHHH666&&&NNN>>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###==Ϸffggjx--Y88xx++a==Ϸffggjx--Y==ww\Ybx--Y55]]ͤHHk==Ҥ55JJHHh55]]ͤHHk==Ҥ55]]ͤYZuvvظssc`````````Y`HFFFHRe{UFFFFHP}{~\UgHFHLWeLZgjtj__L_JFF\WwTzis\NJzjbUHFFFFHHHFFFFFFFHJUWUUY]sUNJHHZnskZLFFFFFFFHJRTTUizYYgu~z~YHFFFFFFFFFHJTmYrfTNZgmmibZUWctugPFHLZZbbb...EEE555~_m5@B+++EEEEEE~_m3>BDDDHHHIIIIII[[[Pjr~_m(49***TTTBBB===555-W`~_m%58---"""iiihhhTTTYu}PjrNipAAA///~Lkseee;aj-W`lLLL...~Rpx===4]fRxJJJGGG555~Rpx777555AAA>>aaa...RRRZZZBBB===FYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRFPP;;;000BBBFFFYYYAAAFYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRY``>>>aaa...Ё55""""pp@@uvЊ;;Ё55""""pp@@uvЁֿgg{Y\o||BBwv""22]Ρ7""zzh""22]Ρ7""22]Y]LL8855k`````````YNHFFFJZfuHFFFHNcsfJFHLrPJUegwuUJPJLWJFHTftgfUZbgovgb]RHFFFFFHHHHFFFHJNRUYWWWWLW}ui_YTRRRHFFFFFFFHHJNPPPPR_gwn\PHFFFFFFFHJPU\otcTHFLZfvxpfZNHHLRf===)))...0002228884]f;k5gv/<>III===<<<@@@BBB>>DDDZZZCCC===BRRHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT5@@YYY444EEE555NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;bbbHHHBBBCCC===FUUHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT8BB@@@VVVTTT+++!!!???NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;55ڼbb'']]YYUU55ڜ55ڼbb'']]YYUU55ڼ55_cZnHHìшvv]]w__YYсFFшvv]]w__YYшvvYYiȚ88""x`````````Y_HFR\R_eNFFFFL{\HFH_bLP`f}`HFFFUiJNZuspfbwwuUJLJHFFFFHWgmgYJFHT`cbfkHH_rnw{j\PJHFFFFFFFFFFHHHJNNTZxtTLP`uvfYRPNLLLHFFHHHHJLR_}ZP\ioR]wWHFFJWbffb\ULJJJJL\+++<<<555888>>>WWWiwgv!16TTT"""EEEBBB:::@@@BBBDDDKKKiwgv$37444iwgv$37GGGHHHBBB:::<<<BBBBBBiwgv"37DDDwww<<<HHHnnn\\\HHHQQQ!;WWWNNN===III\\\888HHH"D888222JJJWWW"?;;;777FFF@@@JJJ<<>>NNNTTTAAADDDDRRBYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BZZFYY;FFbdd]]]000rrr===..̗\\__⡡ww55FFBB}..}}..̗\\__⡡ww55FFBB}..~~YYYs""BB}ZZ;;RRx\\]]7ZZ;;۝hZZ;;RRx\\]]7ZZ;;RRxY\s׆`````````YTJH]oZ`UJHFFJ`jgwNFFHTPLJ_iPFFFFHP_`fvxccnfeRiwtspk_UUNHFFFHHFFFFRiz{seRHJTYfi`ffLFFJ_ibTJFFHN\fg`]\YUPJFFFFFFFFFHJLLLPNTYfwiLFFFHUjpm]LFFFFFFFFFFFHJPPPNNPPRW{]NHFHRkzwfRRiLFFHHP]]TLN\YTPNLLNEEE888888222B˶r`mNNNBBBDDDKKKTTTB˶r`m)))###B˶r`mSSS===FFFNNN444===B˶r`m~~~}}}JJJLLLHHHFFF[[[XXX===666SSSYYYBBB<<<;;;GGG666>>>000EEE777fff888KKK<<<KKK===MMMAAA>>>>>>@@@eeeUggHccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22{{{FFF###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999@@@BBBDDDB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22===---###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999DDDHHHZZZGGG@@@DDD;;;DDD;;;BBBDDD777BBB@@@999DDD999@@@DDD777BBB@@@999DDD;;;FFF999HHH888AAA===BBBDDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000GGG\\\DDD<<>>aaa222000DDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000ԣ丸§͘==\\ggLL++..mmpp``Ԭ]]ԣ丸§͘==\\ggLL++..mmpp``ԣ丸 Y]\i~""``''ӃϮ||̵''""''Ӈ~~h''ӃϮ||̵''""''ӃϮ`]Ynxxױf````````Y_JH]nW_UTLFFJggYnHFFJb`LH]oLFFFHLNisu~w]Rfkcki]RU\eknmg_TJFFFFJUPJFFFRepsjZLHL_miexYJFJY]THFFFFFHJHNWZZYUNHHFHHHHHNNRRWczjLFFFFFJ_gZHFFHHHHFFFFFFHJRZY]pUJHFF]zxfxtRFHLLNUTLPmkWRW^^^RRR'''[[[QQQ0al+"~aaa/ly+"~)DI...III>>@@@;;;888...@@@888DDD===OOOBBB<<<qqqBBB]]]===BYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'22555bbb222DDD777BYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, FFFQQQ;;;DYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'55@@@BBB+++DDD777BYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, GGGbbbDDDZZZBBBQQQBBBTTT<<>>>>>ooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGG>>>[[[;;;III]]]@@@444rrrrrrTTT@@@444rrrrrrTTT@@@444iii)))DDDvvvooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGG''ض˜||­̝Ǖ||]]ȅJJv''ؿRRIIz''ض˜||­̝Ǖ||]]ȅJJv''ض˜`YY]uȅJJv֯雛bb7ֳ]]h֯雛bb7֯雛YYZo;;w````````YTJHWZJ\w__THFJ_Zt`ZrFFFHRPJH\tTFFFJ]Wewx{xfRRxwimne]PJNW\_]ZTLHFFFFNTPHFFFHLUYTJHHLR`nUP]geUHFFFFFFFFHJNRRPLHJJJLNNPRRRPPPPRRTUetu]HFFFFFP_]PHHJLPRPLJHHHHJNTZ`jULHH`tz}|wkcjJFHLPRTTYYzT}R~f...222;;;666888;;;===@@@4Lmv@@@BBB555*|InwCCCDDDBBB@@@888<<<;;;"""IIITTTzzz1/_iJJJLLLHHHDDD;;;===444OOO+++???BBBYYYWWWeeeeee```6-]f===KKKHHHGGGzzzJJJVVVAAA222^^^???TTT888BBB<<<@@@222[[[QQQ555III777@@@IIIBBBQQQDDD999IIIXXXR]]HeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHmoo\\\###""")))>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***NNNLLLBBBDDDDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HH5;;BBB<<<%%%>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***RRRDDDUUUFFF@@@GGGFFFEEECCCEEEFFF@@@GGGFFFEEECCCEEEFFF@@@KKKBBB@@@EEE999TTTLLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<KKK999BBB>>>III888NNNGGG111DDD:::LLL888MMMGGG111DDD:::LLL888NNNDDD666LLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<88۷ٛRRxYYu˨DZNN]]88]]88۷ٛRRxYYu˨DZNN]]88۷ٛRRxYYZbn~~]]..ڷ˧55..RR..ڷ˧55..ڷˠYe\bzԃb```````Y`HHJHHkgZHFJ_Nc`FFFH`fHF\xLFFTjbwxtuwbf|nstbPLJJHHFFFFFFHHHFFFFFHHHHJJJRicb\JHHHJHHHHHHHHHHHJLRPTRRRUWZb_iu||n]TJHFFJLLLPRY\PNLLNPYeuUNJTepsniccszYJHJP\cpuWvZ}j@@@@@@GGG[[[r777BBB555<<<iIIIHHHEEEBBBhhhXXX_+++KKKNNNZZZAAAdddccc^^^kkkSSS\\\r===IIIHHHIIIwwwOOO;;;JJJccc+++===FFF777...'''222dddDDD@@@CCC<<<TTT@@@SSSYYYFFF;;;```999;;;888;==HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB222===NNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$UUUZZZ@@@@BBHbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB888888)))***NNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$LLLDDDHHHBBBKKKDDDHHHBBBKKKDDD>>>TTTNNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBBVVVIII>>>GGGOOONNN666DDDOOONNN666DDDLLLNNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBB..گvv22]HHkRRpJJw==n++cBBJJ..ڳ~~JJ..گvv22]HHkRRpJJw==n++cBBJJ..گvv22]YYYZbgmmmg++cBBJJ88۶ڸ—Dz @88ۿ]]h88۶ڸ—Dz @88۶ڸ~~55_YY_s88u```````ZRHFFFFpm]JHLbJTweJFFHNPHF\{iLH]mbcugjznw}szxjTPJHFFFFFHHHJJJLLLLNNNNNNNNNPTY\URPNNPRRTRLLLLLJJJJLNPRUYYZ`eifb`}YU\eimj]LHHLPRW\]]\WTTTTUY`Zbov{zsmknptz{n`LLTbb{6nzlz^k"IQ666GGG333FFF5557776mzlz^k"IQZZZhhh6nzlz^k"IQ6nzlz^k"IQDDD;;;RRRKKK>>>===333dddEEE===BBBEEE777KKK111RRR888<<<RRR===TTTOOOGGGKKK:::___JJJ::::::VVVKKK[[[HHHHHHFUUJffNjjxTkkJccFbbF``D]]@YY8NNY]]TTT,,,999%%%>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###DDDDDDGGGDDDBRRJffNjjxTkkJccFbbF``D]]@YY8NN;BBHHHHHH666&&&NNN>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###NNNQQQTTTNNNQQQTTTNNNOOONNNAAAGGG???AAAGGG???AAAHHHAAAIIIbbbIIIIIIbbbIIIIIINNNAAAGGG???AAAGGG???AAAHHHփړŤZZx55\""`YY""Z..Yjj~HHև띝FFփړŤZZx55\""`YY""Z..Yjj~HHփړŤZZx55\""`YY""Z..Yjj~HH''أ̼''ج}}h''أ̼''أ̼gg{\`Y_``Äf``````ZiHFFFFHwsn_JJPjJe~|bTHHHb|HFZ|{j]niZm]]iozzp{|wULJJJLNRTUWZYWUU\ocbb`ZUTRRTY_bv{gTbbWP\jzwnkg]]`cpw{xnfgjkeRf}8oEEEBBB???GGGIIIZZZ7778888o{{{8o8o<<<:::nnn222WWW;;;\\\------,,,OOO555EEE222888III;;;DDDeee;;;222000NNN<<<999===FYYJffJggUoo]ttRkkHeeFbbD__BZZ;RR@JJ888333555BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...RRRZZZBBB===FYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRFPP;;;000BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...sssQQQsssQQQssssssQQQsssQQQsss'';;ۈ͗ºȯJJ'';;ہzzHH'';;ۈ͗ºȯJJ'';;ۈ͗ºȯJJ5566M蜜;;h5566MڿwwLLrYY`LLb`````\PU]THFHtk\LPRHZmsbTUJPYHFY{ru|eTcWPWgxxikztevj__bejmnnvogjigreefii^kHHH<<<OOOCCC@@@888888;;;^knnnHHH^k^kGGG555&&&>>>\\\HHH;;;555...''',,,[[[LLL222222888AAA^^^EEE+++)))EEEBBB@@@[[[aaaBBBEEETTTEEE<<<222***777MMM>>>DDDZZZCCC===BRRHbbHeeHeeHccFbbD__BZZ=TT5@@YYY444EEE555NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;bbbHHHBBBCCC===FUUHbbHeeHeeHccFbbD__BZZ=TT8BB@@@VVVTTT+++!!!???NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;""]]rrDzҶϣIJˢeeBB""JJRRDD55++""]]rrDzҶϣIJˢeeBB""]]rrDzҶϣIJˢeeBB..55ځĬFF..55ڊxx++..55ځĬFF..55ځǧUUr_22bƶ}b```` ]{zfZgweWL`JUgji]eTeJFTvx|UUJHN\b\R]`TvZϐlzGGGdddfffZϐlz[[[LLLZϐlzZϐlzXXXEEEIII===888555222+++&&&ppp;;;"""!!!555555,,,===...&&&JJJ""""""))) NNN""" WWWGGG<<<222***]]]\\\BBBBBBDDD@BBDRRDYYB\\BYY@UU=HHFHH888]]]@@@...:::NNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===DDDZZZ999HHH;==R]]BYYUggBZZ]kk=HH\]]RRR---CCC>>>NNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===55dd55dd55dd55ddrr==֖ڼɦ||JJ]rr88ppjj@@hrr==֖ڼɦ||JJ]rr==֖ھˍže``` ^~v\NPZPP]Zr_Yg\UPHJguUuUHFFJWnPHFHJb5]'n}3bl@@@0005]'n}3blCCCFFFHHH5]'n}3bl5]'n}3blIIIGGGRRREEEEEEaaa+++''''''---444444@@@DDDDDDTTTIIIEEEEEE===999BBBTTTIIIEEE999BBBWWWGGGGGGDDDHHHZZZGGG@@@DDD;;;DDD;;;FFF999HHH888AAA===BBBDDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000GGG\\\DDD<<>>aaa222000DDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000''bb֠Ъvv''DDTTLL==''j''bb֠Ъvv''bb֠лŖ22reb%%^JoUJU\LPLZJJ]b\JFNjieJFFJUfZFFHNlll555"Wb8iu555@@@lll555"Wb8iu555GGGHHHHHHlll555"Wb8iu555lll555"Wb8iu555GGGbbbDDDZZZBBBQQQBBB___ZZZ;;;>>>>>>ooo\\\FFF>>>YYYHHH888IIIfff999888GGG>>>[[[;;;III]]]@@@444iii)))DDDvvvooo\\\FFF>>>YYYHHH888IIIfff999888GGG""++++``n""''..++''""77w""++++``n""++TTԏ΄ccŀ€rr~,,m}~NgRPWJFN_FFPcRHFW_WJFHR]}HHLUBBB222BBB999@@@###BBB222BBB999IIIHHHJJJBBB222BBB999BBB222BBB999RRRDDDUUUFFF@@@KKKBBB@@@EEE999TTTLLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<KKK999BBB>>>III888OOODDD666LLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<PP;;''''''''''''''&&PP;;''''''''@@PP;;''''''''''''''&&PP;;''''''''''''''&&&&&&--}uz|\biPUJL}HFJ{RPnzuxUNHLT{NJ{555<<<LLL555iii===555<<<LLL555iiiKKKHHHKKK555<<<LLL555iii555<<<LLL555iiiLLLDDD>>>TTTNNN>>>KKKBBBVVVIII>>>GGGLLLNNN>>>KKKBBB|sZbRWRWHLYi}}g]gwtwz]RJJ_]UIII555@@@@@@NNNIIIIII555@@@@@@RRRIIIIII555@@@@@@III555@@@@@@NNNOOONNNAAAHHHAAAIIINNNAAAHHHURmx]LPbLJYg]sNLvjbrXXXpppXXXpppXXXpppXXXpppssssss``z}ifiLJPpZWnrwxNN|}frerrgl5BOrgl8BQrgl8BQrgl8BQ=J+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2iZhzjxjr}@M^;J\9EViZhzjxjr}>M];J\9GWiZhzjxjr}@M^;J\9GWiZhzjxjr}>M];J\9GWZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5m_wgmUfyvg~@Pb;HX6DT8FY6EU:J\:J[m_wgmUfyvg~@Pb;HX8DT8FY6EU:J\:J[m_wgmUfyvg~@Pb;HX8DT8FY6EW:L\:J[m_wgmUfyvg~@Pb;HX8DT8FY6EU:J\:J[Zm`uTfL\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5777777xxmej{BDE;@G7CT;HZ5DU5DU5DUxxmej{DEGBFL7ET;HZ5DU5DU5DUxxmej{DGGHLR7ET;HZ5DU5DU5DUxxmej{DEGBFL7ET;HZ5DU5DU5DUZm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5888...***zvif[oC44+.8.5'.'."+''*&-7//.144@P5BR8FW5DU6BSzvif[oC44+.8.5'.'."+''-!)>664@P5BR8FW5DU6BSzvif[oC44+.8.5'.'."+''-%)A::4BP5BR8FW5DU6EUzvif[oC44+.8.5'.'."+''-!)>664@P5BR8FW5DU6BSZm`ucx8p@n~ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkTeL\=J+5;;;mmmBBB###888222++++++###888222++++++###888222++++++###888222++++++###???222.......................................###???222.......................................###???222.......................................###???222.......................................###_u\rg3@B*:='.5+2H"+='2@.=".&*!!!29B5BT2@P2@P+7E_u\rg3@B*:='.5+2H"+='2@.=".&*%!!4;D5BT2@P2@P+7E_u\rg3@B*:='.5+2H"+='2@.=".&*%!!9@H5BT2@P2@P.9E_u\rg3@B*:='.5+2H"+='2@.=".&*%!!4;D5BT2@P2@P+7EZm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5UUUBBB AAABBB888...+++***AAABBB888...+++***AAABBB888...+++***AAABBB888...+++***JJJLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***JJJLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***JJJLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***JJJLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***__55}++g58D.;D'.H";@2;H'5B.8F"8D8=+2"'%,/01&)DFF__55}++g58D.;D'.H";@2;H'5B.8F"8D8=+2"'%,>??&,FFF__55}++g58D.;D'.H";@2;H'5B.8F"8D8=+2"' ),CDD),GFF__55}++g58D.;D'.H";@2;H'5B.8F"8D8=+2"'%,>??&,FFFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5S_\\\\\\\\P22UUUBBBHZZZZZZ\\ZLBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++AAAH@@`i]N2''***AAAH@@`i]N2''***AAAH@@`i]N2''***AAAH@@`i]N2''***TTTYYYZZZWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888***TTTYYYZZZWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888***TTTYYYZZZWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888***TTTYYYZZZWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888***55x++e//L/HW=F"@F.HW'=J.=J5=J5=N"5@'5@".5"+2!!*"%, DFF<55x++e//L/HW=F"@F.HW'=J.=J5=J5=N"5@'5@".5"+2!!* FFF!!>55x++e//L/HW=F"@F.HW'=J.=J5=J5=N"5@'5@".5"+2!!* FFF%%B55x++e//L/HW=F"@F.HW'=J.=J5=J5=N"5@'5@".5"+2!!* FFF!!>Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5++++++++++++++++++zg22UUUBBB`wnmnpw|}Z++++++++++++++++++BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++???T@@jW5''???T@@jW5''???T@@jW5''???T@@jW5''YYY```bbb___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZTTTHHH888YYY```bbb___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZTTTHHH888YYY```bbb___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZTTTHHH888YYY```bbb___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZTTTHHH888(3-6'VV^@@~22t''Z!!GTV['=P.=N5FY.NU2@L'@HBTg5H\.5J.5F".B++='5'EFF B@@~22t''Z!!GTV['=P.=N5FY.NU2@L'@HBTg5H\.5J.5F".B++='5'EFFB@@~22t''Z!!GTV['=P.=N5FY.NU2@L'@HBTg5H\.5J.5F".B++='5'EFF B@@~22t''Z!!GTV['=P.=N5FY.NU2@L'@HBTg5H\.5J.5F".B++='5'EFFBZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5888888888888888888z22UUUBBBowxzf888888888888888888BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++7+=1$77+=1$77+=1$7===777===777===777===777===777???DDDgU+++***???DDDgU+++***???DDDgU+++***???DDDgU+++***]]]eee````````````````````````````````````___ZZZTTTHHH888***]]]eee````````````````````````````````````___ZZZTTTHHH888***]]]eee````````````````````````````````````___ZZZTTTHHH888***]]]eee````````````````````````````````````___ZZZTTTHHH888***D_@Y.B#',1=JEMVoxCPY@Y=T2F(7!!GF!!G^aeFFT&&IFF&&G=DP>?AVV[::H%%EFFEC/1=08AFFT&&IFF&&G=DP>?A55}22p''YF+@P.BD+BP.FJ;Uc2DT5HW@L+8F+=J'5@+;@'58'+%&&.FFFF55}22p''YF+@P.BD+BP.FJ;Uc2DT5HW@L+8F+=J'5@+;@'58'+**-!!+FFFF55}22p''YF+@P.BD+BP.FJ;Uc2DT5HW@L+8F+=J'5@+;@'58'+!!'..6FFFF55}22p''YF+@P.BD+BP.FJ;Uc2DT5HW@L+8F+=J'5@+;@'58'+**-!!+FFFF@@J88D..96AN>Na9AI..;((7 .6AN>Na4=E--;--;""06AN>Na6=F..;((7 .6AN>Na4=EZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5==================22UUUBBBuz}v==================BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7QITREWRBYP=YP;YP;YP=YRBYPEW777TTTWWWYYYWUYTJYR@YP;YP;YN9W1$7M:TN9WYYYYYYYYYYYYYYYYYYN9W1$7M:TN9WP;YP;YR@YTJYWUYYYYWWW647QITREWRBYP=YP;YP;YP=YRBYPEW777CCCJJJiDD];''+++***CCCJJJiDD];''+++***CCCJJJiDD];''+++***CCCJJJiDD];''+++***fffvvv```````````````````````````````````````___ZZZTTTHHH888***fffvvv```````````````````````````````````````___ZZZTTTHHH888***fffvvv```````````````````````````````````````___ZZZTTTHHH888***fffvvv```````````````````````````````````````___ZZZTTTHHH888***RpRpLi@Y*<:HX7EV4AQ2@P+19M\p2@PTezJ]tJfJgF`;R2D!0""L""P""PH"'H2@P8DR77W""PHFFFFF+5L2@P2@P4?L;;Y//RFFFFFFFFFF"'H5BT2BP2@P1=J/5?77W""PHFFFFF+5L2@P2@P4?L8888~..mJPPZENX'@N+@N';J=Wi;L]28PF`w8LU=FY5@P+;H+8"+"+"%FFFF""08888~..mJPPZENX'@N+@N';J=Wi;L]28PF`w8LU=FY5@P+;H+8"+"+"%FFFF""08888~..mJPPZENX'@N+@N';J=Wi;L]28PF`w8LU=FY5@P+;H+8"+"+FFFF..98888~..mJPPZENX'@N+@N';J=Wi;L]28PF`w8LU=FY5@P+;H+8"+"+"%FFFF""0**U""NFFFFFFFF B%%B+.<2AO5DU8FY7ET9DPFFV&&S""NFFFFFFFFB!!>&*92AO5DU8FY7ET9CP33F&&S""NFFFFFFFF B<&*92AO5DU8FY7ET7COFFV&&S""NFFFFFFFFB!!>&*92AO5DU8FY7ET9CPZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5BBBBBBBBBBBBBBBBBB22UUUBBBx}BBBBBBBBBBBBBBBBBBBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=VTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=SLVXU[___bbbccc_TcYBbU=_R;\P;YP;YP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBccccbbb___\\\YYYYYYP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBcY@cW@bU=_R;\R=YULYYYYYYYYYYSPW8-=VTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=JJJTTTWWWFFpF''222+++***JJJTTTWWWFFpF''222+++***JJJTTTWWWFFpF''222+++***JJJTTTWWWFFpF''222+++***bbbfffeee``````````````````````````````````````````___ZZZTTTHHH888***bbbfffeee``````````````````````````````````````````___ZZZTTTHHH888***bbbfffeee``````````````````````````````````````````___ZZZTTTHHH888***bbbfffeee``````````````````````````````````````````___ZZZTTTHHH888***VvY{WwPoHc5J(:HY2@P3>KPe~>M^WnTbqPoNkF`@W5J*<BBk22u;;88..n""P+8L4AQ;;88..k""NFFFF+8L2@P2@P;;88..j""LFFFFFFFF""F8FY8FW5BT;;88..k""NFFFF+8L2@P2@Phh==;;22v""TRST5DR"BL2;H8NRD]nfz2=R2FP2JW.DP5;B+8B"8;".5#$$>FFFFhh==;;22v""TRST5DR"BL2;H8NRD]nfz2=R2FP2JW.DP5;B+8B"8;".5#9FFFFhh==;;22v""TRST5DR"BL2;H8NRD]nfz2=R2FP2JW.DP5;B+8B"8;".5$$>FFFFhh==;;22v""TRST5DR"BL2;H8NRD]nfz2=R2FP2JW.DP5;B+8B"8;".5#9FFFF>>e88;;88~++fHFFFFFFFFF+2L5BT2BP8FY;>A::b88;;88~++fHFFFFFFFFF+2L5BT2BP8FY<>A00]88;;88~++fHFFFFFFFFF+2L5BT2BP8FY69=::b88;;88~++fHFFFFFFFFF+2L5BT2BP8FY<>AZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5DDDDDDDDDDDDDDDDDD22UUUBBBx{DDDDDDDDDDDDDDDDDDBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++YFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;YYFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;YYFa`FkiLtnPzs_|ug|ukzupwpkskgnebg]T`UJZRBYP;YP;YP;Y]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=YYIajgktttzzz|||tb|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;YYFa`FkiLtnPzoP|oP|zzzwwwsssnnnggg```R;ZP;YP;YP;YP;YYFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`UHZYYYYYYYYYWTY]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=YJJJUUU\\\___++Y;;;222...JJJUUU\\\___++Y;;;222...JJJUUU\\\___++Y;;;222...JJJUUU\\\___++Y;;;222...oooaaa]]]`````````````````````````````````````````````___ZZZTTTHHH888oooaaa]]]`````````````````````````````````````````````___ZZZTTTHHH888oooaaa]]]`````````````````````````````````````````````___ZZZTTTHHH888oooaaa]]]`````````````````````````````````````````````___ZZZTTTHHH888[jw\_\TtJg;P .8HY5DT1?OYpYpVj8VjRrLjF`@W8N.@>>~==@@==88..i"'J2@P?HR@@~==BB==88~++gHFE-3J4?K0@N2@P0..63589CS;H\:HVAP`$ 7,++b22s==FFHHDD@@55wF55$$>&&.&(+6AQ;H\8FTAP`##BFFBMZEKV?Ob!%(2@P2@PIIiJFFFFFF:*BMZEKV?Ob!%(2@P2@PDDBB==55x''_J2'*E*DDBB==55x''_J2'DDBB==55x''_J2'DDBB==55x''_J2'88..o55|55{55w55w25t+=+FJ+DY.=R"8J.;L;L+8P'BP'+B'8B';J'8+;""T22t55w..o''ZHF88..o55|55{55w55w25t+=+FJ+DY.=R"8J.;L;L+8P'BP'+B'8B';J'8+;""T22t55w..o''ZHF88..o55|55{55w55w25t+=+FJ+DY.=R"8J.;L;L+8P'BP'+B'8B';J'8+;""T22t55w..o''ZHF88..o55|55{55w55w25t+=+FJ+DY.=R"8J.;L;L+8P'BP'+B'8B';J'8+;""T22t55w..o''ZHF&D&8""BJ""N..j==FFDD@@22tB?Ob!C!8""BJ""N..j==FFDD@@22tB?ObB8""BJ""N..j==FFDD@@22tB?Ob!C!8""BJ""N..j==FFDD@@22tB?ObZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFr22UUUBBBHY`{FFFFFFFFFFFFFFFFFF++sgcir|\{^cimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;Y{^cimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;Y|czzzmmm```YYYYYYWTYvcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;Y{^cppoomkigc`\xWnPzbFmW@`P;YP;YP;Y{^cimnppppo`\xWnPzbFmW@`P;YP;YP;Y{^cimnppppoomkigc`\xWr`zmmm```YYYWUYP;Yvcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;YJJJTTTZZZ]]]___```___22T222ZZZZZZTTTHHH888JJJTTTZZZ]]]___```___22T222ZZZZZZTTTHHH888JJJTTTZZZ]]]___```___22T222ZZZZZZTTTHHH888JJJTTTZZZ]]]___```___22T222ZZZZZZTTTHHH888`````````````````````````````````````````````````````````___ZZZTTTHHH888`````````````````````````````````````````````````````````___ZZZTTTHHH888`````````````````````````````````````````````````````````___ZZZTTTHHH888`````````````````````````````````````````````````````````___ZZZTTTHHH888^e^FFFFFFF--5FFFCDUj=N`FZpAOO"B2F(F,IPI B$F=+.)2>L2@P2@P9AN99e""RHFFFFFFFFDUj=N`FZpAOO"B2F(F,IPI B$F=+.)2>L2@P2@P9AN4:F$/<+4?AFKGGe@@==.2k"'L"2BC#4:F$/<+4?AFKGGe@@==.2k"'L"2?&6 41'!!O@@==.2k"'L"24:F$/<+4?AFKGGe@@==.2k"'L"2?88~@@BB@@@@@@@@2P.@;F.8Y'8J=Wo.BZD`s'8B'8R+;="5B2F+@88~@@@@==55|++fF88~@@BB@@@@@@@@2P.@;F.8Y'8J=Wo.BZD`s'8B'8R+;="5B2F+@88~@@@@==55|++fF88~@@BB@@@@@@@@2P.@;F.8Y'8J=Wo.BZD`s'8B'8R+;="5B2F+@88~@@@@==55|++fF88~@@BB@@@@@@@@2P.@;F.8Y'8J=Wo.BZD`s'8B'8R+;="5B2F+@88~@@@@==55|++fF9?G+4?$/<$/<$/< 0;'...;88@F..i@@BB55}""T5""+%)!*!%CQdAJV9?G+4?$/<$/<$/< 0;'...;88@F..i@@BB55}""T5""+%)$-(*,AQb>GS(4$3 2 22 0+...;88@F..i@@BB55}""T5""+ %,$-#AQbGSZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFmW22UUUBBBFYYZmFFFFFFFFFFFFFFFFFF++miic\YYZmwZckortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP;Yckortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP;Yutsrpnkifbnu{x{mmm___YYYYYYWTYgkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=Ycuuutsrpnkifb]zYoP{bFmU=_P;YP;YP;Yckortuuuutfb]zYoP{bFmU=_P;YP;YP;Yckortuuuutsrpnkifb]zY{x{mmm___YYYRDYP;Ygkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=YJJJTTTZZZ]]]___``````___22FF''U222]]]___ZZZTTTHHH888***JJJTTTZZZ]]]___``````___22FF''U222]]]___ZZZTTTHHH888***JJJTTTZZZ]]]___``````___22FF''U222]]]___ZZZTTTHHH888***JJJTTTZZZ]]]___``````___22FF''U222]]]___ZZZTTTHHH888***``````````````````````````````````````````````````````___]]]ZZZUUULLL@@@...***``````````````````````````````````````````````````````___]]]ZZZUUULLL@@@...***``````````````````````````````````````````````````````___]]]ZZZUUULLL@@@...***``````````````````````````````````````````````````````___]]]ZZZUUULLL@@@...***-T-"L"F=5J+"H.'@2+"2", 9$(FFFEjx_xNc{>M^5N:F=5J+"H.'B--0*--%%2+"2+"'5F2:A2@P2@P4AO44t..n""UFFFTZ>@V,2R27/2,"5++"2."2+"'5FFCjx_xNc{>M^5N:F=5J+"H.'B--0*--%%2+"2+"'5F2:A2@P2@P4AO2U2T.P.N'@;'._'2F+.'2"28"."+'.BB'FF:*.@.@.@*<!02U2T.P.N'@;'._'2F+.'2"28"."+'.BB'[\\2U2T.P.N'@;'._'2F+.'2"28"."+'.BRRW2U2T.P.N'@;'._'2F+.'2"28"."+'.BB'@@FFFFFFDDDDDD+8n.B.D.2e8;w2@nBTk.Fj+;W;B;@5H5H+NBBDDDDBB==88~""N@@FFFFFFDDDDDD+8n.B.D.2e8;w2@nBTk.Fj+;W;B;@5H5H+NBBDDDDBB==88~""N@@FFFFFFDDDDDD+8n.B.D.2e8;w2@nBTk.Fj+;W;B;@5H5H+NBBDDDDBB==88~""N@@FFFFFFDDDDDD+8n.B.D.2e8;w2@nBTk.Fj+;W;B;@5H5H+NBBDDDDBB==88~""N1Q2R2R2R2R2R2R2R2R2T2U.P'B55D'+]+N+@+;2='5='.5'.".+2"+(/@AA1Q2R2R2R2R2R2R2R2R2T2U.P'B55D'+]+N+@+;2='5='.5'.".+2"+$,:;;[\\1Q2R2R2R2R2R2R2R2R2T2U.P'B55D'+]+N+@+;2='5='.5'.".+2"+$,.001Q2R2R2R2R2R2R2R2R2T2U.P'B55D'+]+N+@+;2='5='.5'.".+2"+$,:;;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFw22UUUBBBNs_YYeFFFFFFFFFFFFFFFFFF++u_YYepZmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YN9Wmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YN9Wxzzxxwutrpmjfc]zYr`zjgk]]]YYYYYYSPWmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIWmzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YN9Wmruvxxzzxxjfc]zYnPz`FkT=]P;YP;YN9Wmruvxxzzxxwutrpmjfc]uzzzkkk]]]UPYP;YN9Wmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIWJJJTTTZZZ]]]___`````````___22++RRW555___```___ZZZTTTHHH888***JJJTTTZZZ]]]___`````````___22++RRW555___```___ZZZTTTHHH888***JJJTTTZZZ]]]___`````````___22++RRW555___```___ZZZTTTHHH888***JJJTTTZZZ]]]___`````````___22++RRW555___```___ZZZTTTHHH888***333<<<ggg```___NNN@@@555555555555555555555555555555555555555555555222222222222555222+++***333<<<ggg```___NNN@@@555555555555555555555555555555555555555555555222222222222555222+++***333<<<ggg```___NNN@@@555555555555555555555555555555555555555555555222222222222555222+++***333<<<ggg```___NNN@@@555555555555555555555555555555555555555555555222222222222555222+++***:^:"R""J'@+="!94-CA*=L'8@.5&4A6>H??N2 (RRW DFFFFRg;H`EMX)E)B'@+="!94-EA*=L'8@.5&4A*A<&<7'"@+B'?5;D*4K+8L2@P8855w++`F//JVV^J(/EET@JS*=L'8@.5&4A*A<&<7'"@+B'B*E*Rg;H`EMX)E)B'@+="!94-EA*=L'8@.5&4A*A<&<7'"@+B'?5;D*4K+8L2@PIRa=e@i=g;c;b5Y.H"8F+2=8B.5'58'8.5"'.';@+FFF=85J8N5J2D(7IRa=e@i=g;c;b5Y.H"8F+2=8B.5'58'8.5"'.';@+F.)4M=e@i=g;c;b5Y.H"8F+2=8B.5'58'8.5"'.';IRa=e@i=g;c;b5Y.H"8F+2=8B.5'58'8.5"'.';@+F.)FFJJJJHHHHHHHH;B.B+='P'+b'+_''Y''\++b++e+U+@2F'+]@@FFHHFF@@;;&&SFFJJJJHHHHHHHH;B.B+='P'+b'+_''Y''\++b++e+U+@2F'+]@@FFHHFF@@;;&&SFFJJJJHHHHHHHH;B.B+='P'+b'+_''Y''\++b++e+U+@2F'+]@@FFHHFF@@;;**UFFJJJJHHHHHHHH;B.B+='P'+b'+_''Y''\++b++e+U+@2F'+]@@FFHHFF@@;;&&S:_=e=e=e=e=e=e=e=e=e@i@i;c5Z+H'@22F5H2D;@'5@'5@.2=5=2=.."+8"'":_=e=e=e=e=e=e=e=e=e@i@i;c5Z+H'@22F5H2D;@'5@'5@.2=5=2=.."+8"'":Q8_=e=e=e=e=e=e=e=e=e@i@i;c5Z+H'@22F5H2D;@'5@'5@.2=5=2=.."+8"'":_=e=e=e=e=e=e=e=e=e@i@i;c5Z+H'@22F5H2D;@'5@'5@.2=5=2=.."+8"'"Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF22UUUBBBviYYmFFFFFFFFFFFFFFFFFF++iYYmznZjrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP;Y1$7jrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP;Y1$7|}}}||{xwutpnkgc]xWkPwbYgZZZYYYYYY647nrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777jr}}||{xwutpnkgc]xWkNw]DgR;ZP;YP;Y1$7jrvx{|}}}||nkgc]xWkNw]DgR;ZP;YP;Y1$7jrvx{|}}}||{xwutpnkgcnwwwgggZYZP;YP;Y1$7nrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777JJJTTTZZZ]]]___````````````___DD;;ꁁR++555`````````___ZZZTTTHHH888***JJJTTTZZZ]]]___````````````___DD;;ꁁR++555`````````___ZZZTTTHHH888***JJJTTTZZZ]]]___````````````___DD;;ꁁR++555`````````___ZZZTTTHHH888***JJJTTTZZZ]]]___````````````___DD;;ꁁR++555`````````___ZZZTTTHHH888***]YHHHDDD@@@;;;```PPPJJJFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDH;;R++WUTRJ""@55;;;222+++***eWHHHDDD@@@;;;```PPPJJJFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDH;;R++WUTRJ""@55;;;222+++***m\HHHDDD@@@;;;```PPPJJJFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDH;;R++WUTRJ""@55;;;222+++***kvHHHDDD@@@;;;```PPPJJJFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDH;;R++WUTRJ""@55;;;222+++****&'F'+F""82=P'@L";F"=F'2B5@+;F+5J"5=@'(* DFFFFEE\FFq{%)'F'+F""82=P'@L";F"=F'2B5@+;F+5J"5=@!#%-6KFF-6L;;55{''WF//J ),'F'+F""82=P'@L";F"=F'2B5@+;F+5J"5=@@BCEE\FFq{%)'F'+F""82=P'@L";F"=F'2B5@+;F+5J"5=@!#%-6KFF-6L,FgDrFtDrBoBn=c2L+=N'2=+2D'2B"5@".@"=@"'...5'"'5FFF@J@W@W=T2F',FgDrFtDrBoBn=c2L+=N'2=+2D'2B"5@".@"=@"'...5'"'5=+0@LDjDrFtDrBoBn=c2L+=N'2=+2D'2B"5@".@"=@"'...52 (,FgDrFtDrBoBn=c2L+=N'2=+2D'2B"5@".@"=@"'...5'"'5=+HHJJJJHHHHJJ=B+H+H'D'D'D'D'D'D'D'D";2D..j==FFFF@@8833FHHJJJJHHHHJJ=B+H+H'D'D'D'D'D'D'D'D";2D..j==FFFF@@88FFVHHJJJJHHHHJJ=B+H+H'D'D'D'D'D'D'D'D";2D..j==FFFF@@88MM\HHJJJJHHHHJJ=B+H+H'D'D'D'D'D'D'D'D";2D..j==FFFF@@88FFVX`mBnDpDpDpDpDpDpDpDpDpFtDsBn=f5Y.P";+@5H5D'5F+5D'8J'5B+.;".;';H"2@.5'+!%%A;;X`mBnDpDpDpDpDpDpDpDpDpFtDsBn=f5Y.P";+@5H5D'5F+5D'8J'5B+.;".;';H"2@.5'+!%%>660@LNnBnDpDpDpDpDpDpDpDpDpFtDsBn=f5Y.P";+@5H5D'5F+5D'8J'5B+.;".;';H"2@.5'+!!%7//X`mBnDpDpDpDpDpDpDpDpDpFtDsBn=f5Y.P";+@5H5D'5F+5D'8J'5B+.;".;';H"2@.5'+!%%>66Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFUUUBBBiYZFFFFFFFFFFFFFFFFFF++iYZ{}xmZmpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YG3Ompv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YG3O}~¯¯¯­~}|{xvtrnkfb\uUfJrZL`YYYYYYOOOpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDOmp¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YG3Ompv{}~¯¯¯­~rnkfb\uUfJrW@`P;YP;YG3Ompv{}~¯¯¯­~}|{xvtrnkfbrrr```RBYP;YG3Opv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDOJJJTTTZZZ]]]___```````````````___{ZZ88H;;555````````````___ZZZTTTHHH888JJJTTTZZZ]]]___```````````````___{ZZ88H;;555````````````___ZZZTTTHHH888JJJTTTZZZ]]]___```````````````___{ZZ88H;;555````````````___ZZZTTTHHH888JJJTTTZZZ]]]___```````````````___{ZZ88H;;555````````````___ZZZTTTHHH888TRUUUUUUUUUTTTZZZRRRRRRPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLZFFz''{pfYF'';''+++PnUUUUUUUUUTTTZZZRRRRRRPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLZFFz''{pfYF'';''+++Y|UUUUUUUUUTTTZZZRRRRRRPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLZFFz''{pfYF'';''+++c~UUUUUUUUUTTTZZZRRRRRRPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLZFFz''{pfYF'';''+++HQ]>KXLRP"2'5.D+5D'FH'@H+=F"@H'=J";D"8B"5@2;".8"+2CFFF%%E11d''YF!!GNUR"2'5.D+5D'FH'@H+=F"@H'=J";D"8B"5@2;".8"+2#*(99?EFF&&G@@''ZFF))IRTV"2'5.D+5D'FH'@H+=F"@H'=J";D"8B"5@2;".8"+2HNV8DPXZ_11d''YF!!GNUR"2'5.D+5D'FH'@H+=F"@H'=J";D"8B"5@2;".8"+2#*(99?EFF&&G%GmFvHxFvFtDs@c2=H2@H2HJ2LW+=="@D'BL".B+;@"2;+5H&<72+"FFFF8FbFbF`=T-6%GmFvHxFvFtDs@c2=H2@H2HJ2LW+=="@D'BL".B+;@"2;+5H&<75+"F!%)%G\HpFvHxFvFtDs@c2=H2@H2HJ2LW+=="@D'BL".B+;@"2;+5H??N9$(%GmFvHxFvFtDs@c2=H2@H2HJ2LW+=="@D'BL".B+;@"2;+5H&<75+"F!%)HHHHFFHHHH8b8_8\5W5W5W5W5W5W5W5W.P'@5F..j==BB;;00]HHHHFFHHHH8b8_8\5W5W5W5W5W5W5W5W.P'@5F..j==BB;;::bHHHHFFHHHH8b8_8\5W5W5W5W5W5W5W5W.P'@5F..j==BB;;>>eHHHHFFHHHH8b8_8\5W5W5W5W5W5W5W5W.P'@5F..j==BB;;::bDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D+U;@2=b+8N.;D.;F2BH2JJ+HT'88=@"8B'8"&**!!DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D+U;@2=b+8N.;D.;F2BH2JJ+HT'88=@"8B'8"&**!!%G\UxDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D+U;@2=b+8N.;D.;F2BH2JJ+HT'88=@"8B'8"&**!!DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D+U;@2=b+8N.;D.;F2BH2JJ+HT'88=@"8B'8"&**!!Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFBB22_YrFFFFFFFFFFFFFFFFFF++_Y`rvv{|{wnZmu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YN9Wmu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YN9W~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjUHZYYYWWWu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWmu¼ųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YN9Wmu{~±IJųƳdzƲűurnjf`|ZpR|_DjR;ZP;YN9Wmu{~±IJųƳdzƲűįî}|zwurnjf|||jjjUJZP;YN9Wu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWJJJTTTZZZ]]]___``````````````````___bbb22""텅z''DDD555```````````````___ZZZTTTHHH888***JJJTTTZZZ]]]___``````````````````___bbb22""텅z''DDD555```````````````___ZZZTTTHHH888***JJJTTTZZZ]]]___``````````````````___bbb22""텅z''DDD555```````````````___ZZZTTTHHH888***JJJTTTZZZ]]]___``````````````````___bbb22""텅z''DDD555```````````````___ZZZTTTHHH888***gb\\\]]]]]]]]]WWWWWWYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTgLLp]U5''***jNo\\\]]]]]]]]]WWWWWWYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTgLLp]U5''***Tt\\\]]]]]]]]]WWWWWWYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTgLLp]U5''***kg\\\]]]]]]]]]WWWWWWYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTgLLp]U5''***:HX;J\EIV'@+=8L.5@2=J5BJ5@L28R.;P2BT'=P"2D+;@"+2"+."'CFFFF55x..iJF11L'@+=8L.5@2=J5BJ5@L28R.;P2BT'=P"2D+;@"+2"+."')1<FFFFddjPP|++b""PFF'@+=8L.5@2=J5BJ5@L28R.;P2BT'=P"2D+;@"+2"+."';@I8DP4AQ2@P55x..iJF11L'@+=8L.5@2=J5BJ5@L28R.;P2BT'=P"2D+;@"+2"+."')1<FFFFddj%GmFvHxFvFtDs";T.=U'=L'@H.@J5JP2DN'=L"@B.8@'5="8D*A<2."FFFHDLjNmJg@YKNP%GmFvHxFvFtDs";T.=U'=L'@H.@J5JP2DN'=L"@B.8@'5="8D*A<.+" B$FoFvHxFvFtDs";T.=U'=L'@H.@J5JP2DN'=L"@B.8@'5="8D6@H%GmFvHxFvFtDs";T.=U'=L'@H.@J5JP2DN'=L"@B.8@'5="8D*A<.+" B$FFFFFF8B;c=e;b8_8_8_8_8_8_8_8_5Y+H5@""N22s8811iFFFFFF8B;c=e;b8_8_8_8_8_8_8_8_5Y+H5@""N22s88;;mFFFFFF8B;c=e;b8_8_8_8_8_8_8_8_5Y+H5@""N22s88??oFFFFFF8B;c=e;b8_8_8_8_8_8_8_8_5Y+H5@""N22s88;;mZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++e=@+;N".B';J.8J"=J+@H.=J2JU2@J"2@25"'.'ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++e=@+;N".B';J.8J"=J+@H.=J2JU2@J"2@25"'.'W{DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++e=@+;N".B';J.8J"=J+@H.=J2JU2@J"2@25"'.'ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++e=@+;N".B';J.8J"=J+@H.=J2JU2@J"2@25"'.'Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFuYiFFFFFFFFFFFFFFFFFF++sYYfxwZpz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YP;Ysss```YYYYYY~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`ULYYYYz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBYpzżɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YP;Ypz~óƴȶɶʶʶʶɴwtpmic]wWgJsW@`P;YP;Ypz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmisss]T`P;YP;Yz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBYKKKTTTZZZ]]]___`````````````````````___bbbZZTTJJZFFDDD555``````````````````___ZZZTTTHHH888***KKKTTTZZZ]]]___`````````````````````___bbbZZTTJJZFFDDD555``````````````````___ZZZTTTHHH888***KKKTTTZZZ]]]___`````````````````````___bbbZZTTJJZFFDDD555``````````````````___ZZZTTTHHH888***KKKTTTZZZ]]]___`````````````````````___bbbZZTTJJZFFDDD555``````````````````___ZZZTTTHHH888***U]]]]]]]]]\\\WWW\\\\\\ZZZWWWWWWWWWWWWWWWWWWWWWWWWWWW''gW2''***###]]]]]]]]]\\\WWW\\\\\\ZZZWWWWWWWWWWWWWWWWWWWWWWWWWWW''gW2''***###\]]]]]]]]]\\\WWW\\\\\\ZZZWWWWWWWWWWWWWWWWWWWWWWWWWWW''gW2''***###i]]]]]]]]]\\\WWW\\\\\\ZZZWWWWWWWWWWWWWWWWWWWWWWWWWWW''gW2''***###Wn;Fc+._''\''Y+L5B+@NBJ+HJ+8N'BD5@N+8H2=L'=P'DF+;F"+2"'."."2JJHFF::H88~''Y""P''\''\''Y+L5B+@NBJ+HJ+8N'BD5@N+8H2=L'=P'DF+;F"+2"'."."2JJHFFF22r''W''\''\''Y+L5B+@NBJ+HJ+8N'BD5@N+8H2=L'=P'DF+;F"+2"'."."2J""L&&K+8L2@P=GS88~''Y""P''\''\''Y+L5B+@NBJ+HJ+8N'BD5@N+8H2=L'=P'DF+;F"+2"'."."2JJHFFF%GmFvHxFvFtFp+=P2;L.DJ8Jb;D_+DR2FU2@N2@L25N'@H5@&7H++"FFJ8RnRrPoJfCPY%GmFvHxFvFtFp+=P2;L.DJ8Jb;D_+DR2FU2@N2@L25N'@H5@&7H-%%ChFvHxFvFtFp+=P2;L.DJ8Jb;D_+DR2FU2@N2@L25N'@H5@&7H, %GmFvHxFvFtFp+=P2;L.DJ8Jb;D_+DR2FU2@N2@L25N'@H5@&7H-%%DDFF'@zBmDpBo@k@k@k@k@k@k@k@k=f5Z'B8J++b++^DDFF'@zBmDpBo@k@k@k@k@k@k@k@k=f5Z'B8J++b66bDDFF'@zBmDpBo@k@k@k@k@k@k@k@k=f5Z'B8J++b;;dDDFF'@zBmDpBo@k@k@k@k@k@k@k@k=f5Z'B8J++b66bDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++c5Bt.BW.;H+.DNbv.DNF_v5;U.FR"8B.;J.8F"';'.DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++c5Bt.BW.;H+.DNbv.DNF_v5;U.FR"8B.;J.8F"';'.%IbDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++c5Bt.BW.;H+.DNbv.DNF_v5;U.FR"8B.;J.8F"';'.DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++c5Bt.BW.;H+.DNbv.DNF_v5;U.FR"8B.;J.8F"';'.Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF\cFFFFFFFFFFFFFFFFFF++vNFH\ktxzuo`H ###***u|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP;Y777{{{gggYYYYYY777ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgR=YWUY777x|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777u|ï͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP;Y1$7u|ôǶʸ˸͹͹͹͸̷zvtpkgb}ZoP{]DgP;YP;Y1$7u|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpk{{{ebgP;YP;Y1$7x|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777TTTYYYZZZ]]]___````````````````````````___bbbccc\\..''gLLLLLDDD555`````````````````````___ZZZTTTHHH888###TTTYYYZZZ]]]___````````````````````````___bbbccc\\..''gLLLLLDDD555`````````````````````___ZZZTTTHHH888###TTTYYYZZZ]]]___````````````````````````___bbbccc\\..''gLLLLLDDD555`````````````````````___ZZZTTTHHH888###TTTYYYZZZ]]]___````````````````````````___bbbccc\\..''gLLLLLDDD555`````````````````````___ZZZTTTHHH888###XXXXXX___YYY___```]]]\\\\\\\\\\\\\\\\\\\\\\\\vTTjN++++++XXXXXX___YYY___```]]]\\\\\\\\\\\\\\\\\\\\\\\\vTTjN++++++XXXXXX___YYY___```]]]\\\\\\\\\\\\\\\\\\\\\\\\vTTjN++++++XXXXXX___YYY___```]]]\\\\\\\\\\\\\\\\\\\\\\\\vTTjN++++++Xdy2;c88;;8888~55z2F"8L"=N2DY5Rb+BR.;H;HZ@D\'@J2@J.8B'2='.;"."H''\++c++g""LF<<..n88;;8888~55z2F"8L"=N2DY5Rb+BR.;H;HZ@D\'@J2@J.8B'2='.;"."H''\++c..i""NF&&Igg22v88;;8888~55z2F"8L"=N2DY5Rb+BR.;H;HZ@D\'@J2@J.8B'2='.;"."H''\++c..j""P"'H.;N<<..n88;;8888~55z2F"8L"=N2DY5Rb+BR.;H;HZ@D\'@J2@J.8B'2='.;"."H''\++c..i""NF&&I%GmFvHxFvFtDn+=W2@P55P;F_;Rf@Ug=HYBTi+5D2@U';F"=H"2;"2"FJX`8Vj%GmFvHxFvFtDn+=W2@P55P;F_;Rf@Ug=HYBTi+5D2@U';F"=H"2;-**%GmFvHxFvFtDn+=W2@P55P;F_;Rf@Ug=HYBTi+5D2@U';F"=H"2;$( %GmFvHxFvFtDn+=W2@P55P;F_;Rf@Ug=HYBTi+5D2@U';F"=H"2;-**=@"@zFuHxFvDsDsDsDsDsDsDsDsBn;c.P8B 7,=@"@zFuHxFvDsDsDsDsDsDsDsDsBn;c.P8B3C;=@"@zFuHxFvDsDsDsDsDsDsDsDsBn;c.P8B=KE=@"@zFuHxFvDsDsDsDsDsDsDsDsBn;c.P8B3C;ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+]BRj.;T=N+=N5@N22J2=U@Wo5FTBUi8BR'2B'.B'+ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+]BRj.;T=N+=N5@N22J2=U@Wo5FTBUi8BR'2B'.B'+ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+]BRj.;T=N+=N5@N22J2=U@Wo5FTBUi8BR'2B'.B'+ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+]BRj.;T=N+=N5@N22J2=U@Wo5FTBUi8BR'2B'.B'+Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFcgFFFFFFFFFFFFFFFFFF++22BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB...777~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\R@Y777nnn\\\YYY777~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\TJY777w~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777w~¸ƲϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y1$7w~ƶʸ̺λϼϼмϼϻ|xurnic]tTcHnR;\P;Y1$7w~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnkgnR;\P;Y1$7w~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777YYY```bbb``````````````````````````````___bbbccceeeiii``HHFFvTTWWWTTTLLLDDD555````````````````````````___ZZZRRRDDD...YYY```bbb``````````````````````````````___bbbccceeeiii``HHFFvTTWWWTTTLLLDDD555````````````````````````___ZZZRRRDDD...YYY```bbb``````````````````````````````___bbbccceeeiii``HHFFvTTWWWTTTLLLDDD555````````````````````````___ZZZRRRDDD...YYY```bbb``````````````````````````````___bbbccceeeiii``HHFFvTTWWWTTTLLLDDD555````````````````````````___ZZZRRRDDD...ZZZbbbcccbbb________________________FF]...+++ZZZbbbcccbbb________________________FF]...+++ZZZbbbcccbbb________________________FF]...+++ZZZbbbcccbbb________________________FF]...+++11n;;DDDDBB@@@@5=b.DP2DJ.HU8Wc2HT.DR;BR+BN.5H.=N'5J52F'28"...'']22s55{88..kF;;DDDDBB@@@@5=b.DP2DJ.HU8Wc2HT.DR;BR+BN.5H.=N'5J52F'28"...'']22s55{88..nHFFT;;BBDDBB@@@@5=b.DP2DJ.HU8Wc2HT.DR;BR+BN.5H.=N'5J52F'28"...'']22s55{88..oH"F;;DDDDBB@@@@5=b.DP2DJ.HU8Wc2HT.DR;BR+BN.5H.=N'5J52F'28"...'']22s55{88..nHFFT%GmFvHxFvFtFi+DZ8@J.DP;R_+JT8Rf2FW=@W=J]2@R'@N'2B2;572%GmFvHxFvFtFi+DZ8@J.DP;R_+JT8Rf2FW=@W=J]2@R'@N'2B2;402%GmFvHxFvFtFi+DZ8@J.DP;R_+JT8Rf2FW=@W=J]2@R'@N'2B2;"5"F> . .(%GmFvHxFvFtFi+DZ8@J.DP;R_+JT8Rf2FW=@W=J]2@R'@N'2B2;402XX"NH"@vHzJ|J{HwHwHwHwHwHwHwHwDs@i2U8""$>$TT"NH"@vHzJ|J{HwHwHwHwHwHwHwHwDs@i2U8""7I7TT"NH"@vHzJ|J{HwHwHwHwHwHwHwHwDs@i2U8""DSDTT"NH"@vHzJ|J{HwHwHwHwHwHwHwHwDs@i2U8""7I7DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D''Z.FjD`t'8P5F\5=H5FTBUe2HN@N5H\2;J8@R'2@'2GIJDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D''Z.FjD`t'8P5F\5=H5FTBUe2HN@N5H\2;J8@R'2@'2GIIDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D''Z.FjD`t'8P5F\5=H5FTBUe2HN@N5H\2;J8@R'2@'2EFHDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D''Z.FjD`t'8P5F\5=H5FTBUe2HN@N5H\2;J8@R'2@'2GIIZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF''..isFFFFFFFFFFFFFFFFFF++''..BBUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUmmm888µȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_TJY¾sss___YYYµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_R@Yzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;YzĻȴѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;Yzµȸ̺ϼѽѾҾƗɛ¬}{wtpkf`zYgJsU=_P;Yzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtppksU=_P;Yzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;Y\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccvvvbbbbbbbbbbbbbbbbbbbbbbbbHHJJ텅ꁁRR''i888222\\\cccvvvbbbbbbbbbbbbbbbbbbbbbbbbHHJJ텅ꁁRR''i888222\\\cccvvvbbbbbbbbbbbbbbbbbbbbbbbbHHJJ텅ꁁRR''i888222\\\cccvvvbbbbbbbbbbbbbbbbbbbbbbbbHHJJ텅ꁁRR''i88822255}@@HHHHFFFFFF@F2DT2BN+;N.DH=T`;R`H\p.J].;L2=L+;H'8=.;+2'H55w;;====88//RyyBBHHHHFFFFFF@F2DT2BN+;N.DH=T`;R`H\p.J].;L2=L+;H'8=.;+2'H55w;;====88""PHHHHFFFFFF@F2DT2BN+;N.DH=T`;R`H\p.J].;L2=L+;H'8=.;+2'H55w;;====88""PFVV^yyBBHHHHFFFFFF@F2DT2BN+;N.DH=T`;R`H\p.J].;L2=L+;H'8=.;+2'H55w;;====88""P@fFvHxFvFtDr.FU.BT.=U.HT8BP2@R.8J.FR'BU'@T+=J8D*:F%GmFvHxFvFtDr.FU.BT.=U.HT8BP2@R.8J.FR'BU'@T+=J8D*:FB0-IPI%GmFvHxFvFtDr.FU.BT.=U.HT8BP2@R.8J.FR'BU'@T+=J8D*:F@2+FFB';N;P5J*<%GmFvHxFvFtDr.FU.BT.=U.HT8BP2@R.8J.FR'BU'@T+=J8D*:FB0-IPI5zB;`HwJ|J{HxHxHxHxHxHxHxHxFt@i2T.8$7$5{B;`HwJ|J{HxHxHxHxHxHxHxHxFt@i2T.8JTJ5{B;`HwJ|J{HxHxHxHxHxHxHxHxFt@i2T.8V^V5{B;`HwJ|J{HxHxHxHxHxHxHxHxFt@i2T.8JTJ%:QDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+_.=Z+=J+HU.DT+@R.;T@Wb@J\.@N.5H';H'=L"8F.;ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+_.=Z+=J+HU.DT+@R.;T@Wb@J\.@N.5H';H'=L"8F.;ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+_.=Z+=J+HU.DT+@R.;T@Wb@J\.@N.5H';H'=L"8F.;ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+_.=Z+=J+HU.DT+@R.;T@Wb@J\.@N.5H';H'=L"8F.;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF==eeiFFFFFFFFFFFFFFFFFF++==ee22w22W22r22222222222222z22g22P22;;;ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwYBbWUY===wwwbbbYYY===zĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP;Y===ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===zƽʶ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP;Y7+=zĶʺμѾҿ˜Į|xurmgb|ZkNwW@bP;Y7+=zĶʺμѾҿ˜̠޼з˴ȲĮ|xurupwW@bP;Y7+=ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...333<<<jjj]]]eeejjjjjjjjjjjjjjjjjjjjjjjj``TTFF`BBB888333<<<jjj]]]eeejjjjjjjjjjjjjjjjjjjjjjjj``TTFF`BBB888333<<<jjj]]]eeejjjjjjjjjjjjjjjjjjjjjjjj``TTFF`BBB888333<<<jjj]]]eeejjjjjjjjjjjjjjjjjjjjjjjj``TTFF`BBB888??BBJJJJHHHHHHDH'FP'FP8=R@Zj=Rb5BY8Pe.HR5BP5;L.@L'8D"8;+..2m==BBDDBB;;;;YLLJJJJHHHHHHDH'FP'FP8=R@Zj=Rb5BY8Pe.HR5BP5;L.@L'8D"8;+..2m==BBDDBB;;77WTTJJJJHHHHHHDH'FP'FP8=R@Zj=Rb5BY8Pe.HR5BP5;L.@L'8D"8;+..2m==BBDD@@;;""P!!GLLJJJJHHHHHHDH'FP'FP8=R@Zj=Rb5BY8Pe.HR5BP5;L.@L'8D"8;+..2m==BBDDBB;;77W9DOBjFvHxFvFtDs'BY.JN;N@ZmBNc5BT5DW;HU'JL"5H'@H2DP@HQR/2%GmFvHxFvFtDs'BY.JN;N@ZmBNc5BT5DW;HU'JL"5H'@H2DP-CAH.'(F,%GmFvHxFvFtDs'BY.JN;N@ZmBNc5BT5DW;HU'JL"5H'@H2DP-CAH.'FFFFBJgHc@Y.B%GmFvHxFvFtDs'BY.JN;N@ZmBNc5BT5DW;HU'JL"5H'@H2DP-CAH.'(F,AE;bFvHzHxFuFuFuFuFuFuFuFuDp=e2R.BBD;bFvHzHxFuFuFuFuFuFuFuFuDp=e2R.!C!@B;bFvHzHxFuFuFuFuFuFuFuFuDp=e2R.&D&BD;bFvHzHxFuFuFuFuFuFuFuFuDp=e2R.!C!9DOJjDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+b;B5Hc.8N.HN;Ti.BY@Zm=FY8L]2;N.=F'FJ+;'25DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+b;B5Hc.8N.HN;Ti.BY@Zm=FY8L]2;N.=F'FJ+;'25DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+b;B5Hc.8N.HN;Ti.BY@Zm=FY8L]2;N.=F'FJ+;'25DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+b;B5Hc.8N.HN;Ti.BY@Zm=FY8L]2;N.=F'FJ+;'25Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..DDmFFFFFFFFFFFFFFFFFF++..DDm\Ÿ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPz_TcYYYþzzzcccYYYzŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cP;YŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBYzïŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cP;YzŸ˻ϾŒ٭Ưì}{wsoic~\nPzY@cP;YzŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsukzY@cP;YŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBY\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH..._UHHHDDD@@@;;;]]]fffiiiiiiiiiiiiiiiiiiiiiiiiiii..""88;;++H@@AAA_HHHDDD@@@;;;]]]fffiiiiiiiiiiiiiiiiiiiiiiiiiii..""88;;++H@@AAAk]HHHDDD@@@;;;]]]fffiiiiiiiiiiiiiiiiiiiiiiiiiii..""88;;++H@@AAApiHHHDDD@@@;;;]]]fffiiiiiiiiiiiiiiiiiiiiiiiiiii..""88;;++H@@AAAee@@FFJJHHHHHHHH8Bj8DR2BR8JN5P];Pf;F_2FP'BL.HT2;@+5F"+2"2@==DDFFFF@@MMJJHHHHHHHH8Bj8DR2BR8JN5P];Pf;F_2FP'BL.HT2;@+5F"+2"2@==DDFFFF==MMJJHHHHHHHH8Bj8DR2BR8JN5P];Pf;F_2FP'BL.HT2;@+5F"+2"2@==DDFFFF==22u""LMMJJHHHHHHHH8Bj8DR2BR8JN5P];Pf;F_2FP'BL.HT2;@+5F"+2"2@==DDFFFF==%GZHpFvHxFvFtDs"D]'FN.BP8BJ8HY.BP;Pj2;H2BP.DJ';H5BYEETV,2%GmFvHxFvFtDs"D]'FN.BP8BJ8HY.BP;Pj2;H2BP.DJ';H5BY!94J+"F%GmFvHxFvFtDs"D]'FN.BP8BJ8HY.BP;Pj2;H2BP.DJ';H5BY!94J+"FFFJBTtRpLj@Y(3%GmFvHxFvFtDs"D]'FN.BP8BJ8HY.BP;Pj2;H2BP.DJ';H5BY!94J+"FbbYbFvHzHwFuFuFuFuFuFuFuFuDp=e2R+.]]YbFvHzHwFuFuFuFuFuFuFuFuDp=e2R'.QQYbFvHzHwFuFuFuFuFuFuFuFuDp=e2R'.]]YbFvHzHwFuFuFuFuFuFuFuFuDp=e2R'.%GZUxDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'P.2k2DJ2DP'FN+@P5DR5@D2BR+;F.BY+8B+;F!4?B-4ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'P.2k2DJ2DP'FN+@P5DR5@D2BR+;F.BY+8B+;F!4?B-0ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'P.2k2DJ2DP'FN+@P5DR5@D2BR+;F.BY+8B+;F!4?D-3ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'P.2k2DJ2DP'FN+@P5DR5@D2BR+;F.BY+8B+;F!4?B-0Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFDDFFFFFFFFFFFFFFFFFF++DD\̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\tb|cccWWW|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9W|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9WŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREW|ŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9W|Ÿ̼пŽŒگȱĭ~|xtoje\oP|ZBcN9W|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtug|ZBcN9WŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREW\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...bUUUUUUUUUTTT```fffiiikkkeeeeeeeeeeeeeeeeeeeeeeeeeee\\T@@AAANoUUUUUUUUUTTT```fffiiikkkeeeeeeeeeeeeeeeeeeeeeeeeeee\\T@@AAATtUUUUUUUUUTTT```fffiiikkkeeeeeeeeeeeeeeeeeeeeeeeeeee\\T@@AAAgUUUUUUUUUTTT```fffiiikkkeeeeeeeeeeeeeeeeeeeeeeeeeee\\T@@AAAOOIIDDDDDDFF;@.BR.FU2=F.DT+DH8;R.BN'5L5J+;H''=.@'._@@BBDDBB==}MMDDDDDDFF;@.BR.FU2=F.DT+DH8;R.BN'5L5J+;H''=.@'._@@BBDDBB@@~MMDDDDDDFF;@.BR.FU2=F.DT+DH8;R.BN'5L5J+;H''=.@'._@@BBDDBB>>~BBkMMDDDDDDFF;@.BR.FU2=F.DT+DH8;R.BN'5L5J+;H''=.@'._@@BBDDBB@@~0DSLuHzJ{HzFvFuBm+FZ85T5@T2@R5HR=;T5BN8BN5=D'5B'5J(/Z>@,JoHzJ{HzFvFuBm+FZ85T5@T2@R5HR=;T5BN8BN5=D'5B'5@"=5"B2,JoHzJ{HzFvFuBm+FZ85T5@T2@R5HR=;T5BN8BN5=D'5B'5@"=5FFF"]t]WwRrD_,JoHzJ{HzFvFuBm+FZ85T5@T2@R5HR=;T5BN8BN5=D'5B'5@"=5"B2%NhFvHzHwFuFuFuFuFuFuFuFuDp=e2R 0%NhFvHzHwFuFuFuFuFuFuFuFuDp=e2R 0;%NhFvHzHwFuFuFuFuFuFuFuFuDp=e2R 0;%NhFvHzHwFuFuFuFuFuFuFuFuDp=e2R 0;0DSY~FvHwHwHwHwHwHwHwHwHxJ{J{FvBo;b8\+H+=.B.DT+DR.@R88R.8U5DP.;N;JW85L2=F.8B--0FvHwHwHwHwHwHwHwHwHxJ{J{FvBo;b8\+H+=.B.DT+DR.@R88R.8U5DP.;N;JW85L2=F.8B--0FvHwHwHwHwHwHwHwHwHxJ{J{FvBo;b8\+H+=.B.DT+DR.@R88R.8U5DP.;N;JW85L2=F.8B--0FvHwHwHwHwHwHwHwHwHxJ{J{FvBo;b8\+H+=.B.DT+DR.@R88R.8U5DP.;N;JW85L2=F.8B--0Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFee..FFFFFFFFFFFFFFFFFF++ee..\çѿŽÎŐϠƗټϸ̶ɲůª|xupkep|||bbbTTTŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xus_|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQIT\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...TR\\\]]]]]]]]]```fffgggfffccccccccccccccccccccccccccccccZZ22++FFiDDDDD???Pn\\\]]]]]]]]]```fffgggfffccccccccccccccccccccccccccccccZZ22++FFiDDDDD???kY|\\\]]]]]]]]]```fffgggfffccccccccccccccccccccccccccccccZZ22++FFiDDDDD???nc~\\\]]]]]]]]]```fffgggfffccccccccccccccccccccccccccccccZZ22++FFiDDDDD???8e5T'@_8DR+;R8@U.@P2;D+=L";@8@"5H.H;!!O8e5T'@_8DR+;R8@U.@P2;D+=L";@8@"5H.H;GGe8e5T'@_8DR+;R8@U.@P2;D+=L";@8@"5H.H;GGe8e5T'@_8DR+;R8@U.@P2;D+=L";@8@"5H.H;GGeHhHxJ}J{HxHwBo5T+=P2BL+FH'=L2DL2=H.5D2BL8D"@VV^LZpHxJ}J{HxHwBo5T+=P2BL+FH'=L2DL2=H.5D2BL8D"@@+FAOOLZpHxJ}J{HxHwBo5T+=P2BL+FH'=L2DL2=H.5D2BL8D"@@+FFFWfe_YzPoLZpHxJ}J{HxHwBo5T+=P2BL+FH'=L2DL2=H.5D2BL8D"@@+FAOOFvHzHwFuFuFuFuFuFuFuFuDp=e2R2FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<SrHvHzHzHzHzHzHzHzHzHzJ|J|HxDp=e8_+H.B.B2F2B"DP;BN.=J+FL"5B5HR'2B17C0AMHuHzHzHzHzHzHzHzHzHzJ|J|HxDp=e8_+H.B.B2F2B"DP;BN.=J+FL"5B5HR'2B17C0AMHuHzHzHzHzHzHzHzHzHzJ|J|HxDp=e8_+H.B.B2F2B"DP;BN.=J+FL"5B5HR'2B17C0AMHuHzHzHzHzHzHzHzHzHzJ|J|HxDp=e8_+H.B.B2F2B"DP;BN.=J+FL"5B5HR'2B17C0AMZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..==''FFFFFFFFFFFFFFFFFF++..==''\˺’ŽÏσϠگ٭˜ռϹͶʳƯ«}zupozzz___ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_ð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_ï·ʨσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_ï·˼пŽÏσϠگʳƯ«}zupke\nPzU=_ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}znPzU=_ð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...{Y]]]]]]]]]\\\```cccfffeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{ZZDD22222222DDvZZ___WWWJJJ???W]]]]]]]]]\\\```cccfffeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{ZZDD22222222DDvZZ___WWWJJJ???\]]]]]]]]]\\\```cccfffeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{ZZDD22222222DDvZZ___WWWJJJ???v]]]]]]]]]\\\```cccfffeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{ZZDD22222222DDvZZ___WWWJJJ???DRf@kBoBm@c'@Y+@T"8N+@T';H;P@Y=c5Y'@'DRf@kBoBm@c'@Y+@T"8N+@T';H;P@Y=c5Y'@AFKDRf@kBoBm@c'@Y+@T"8N+@T';H;P@Y=c5Y'@AFKDRf@kBoBm@c'@Y+@T"8N+@T';H;P@Y=c5Y'@AFK,LpHxHxFvFu@k8e;@5F_'=H"=H2@B'5F.;L".8'B"'F1NrHxHxFvFu@k8e;@5F_'=H"=H2@B'5F.;L".8'B"'FB'5N:1NrHxHxFvFu@k8e;@5F_'=H"=H2@B'5F.;L".8'B"'F"J'"L"FQTc`\~Vu1NrHxHxFvFu@k8e;@5F_'=H"=H2@B'5F.;L".8'B"'FB'5N:%EjFvHzHwFuFuFuFuFuFuFuFuDp=e2R 2%EjFvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<%EjFvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<%EjFvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<5JaHvFvFvFvFvFvFvFvFvHwHzFuBm;c8b=B;B+8n2P+='DJ+@L'BJ.=H"5B.;B+5@=@IHvFvFvFvFvFvFvFvFvHwHzFuBm;c8b=B;B+8n2P+='DJ+@L'BJ.=H"5B.;B+5@=@IHvFvFvFvFvFvFvFvFvHwHzFuBm;c8b=B;B+8n2P+='DJ+@L'BJ.=H"5B.;B+5@=@IHvFvFvFvFvFvFvFvFvHwHzFuBm;c8b=B;B+8n2P+='DJ+@L'BJ.=H"5B.;B+5@=@IZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF++\ʬÏÏÏŐŒŒ־ҼйͶʳǯ«}zutttXU[~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[~ȺϾÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[~ɻϾŽÏÏÏŐŒʳǯ«}zupke~\iLtR<[~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}z~iLtR<[ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...XXXXXX___``````bbb```____________________________________________________________\\\TTTCCCXXXXXX___``````bbb```____________________________________________________________\\\TTTCCCXXXXXX___``````bbb```____________________________________________________________\\\TTTCCCXXXXXX___``````bbb```____________________________________________________________\\\TTTCCCFuHwFuDsDsDoDnBfDpDsDsBn;b.N1FuHwFuDsDsDoDnBfDpDsDsBn;b.N+4?FuHwFuDsDsDoDnBfDpDsDsBn;b.N+4?FuHwFuDsDsDoDnBfDpDsDsBn;b.N+4?[dv%EiDRfFFHHBH5B|';\2D5B+;'5'ghi[dv%EiDRfFFHHBH5B|';\2D5B+;'5')E)[dv%EiDRfFFHHBH5B|';\2D5B+;'5'"R"-T-^e^Xbl[jw[dv%EiDRfFFHHBH5B|';\2D5B+;'5')E)FvHzHwFuFuFuFuFuFuFuFuDp=e2R 2FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<,Hk%Ej%Ej%NhYb;b;`"@v"@z'@z8BHHJJHHDD@@25t'D'55DKQU\``d|,Hk%Ej%Ej%NhYb;b;`"@v"@z'@z8BHHJJHHDD@@25t'D'55DKQU\``d|,Hk%Ej%Ej%NhYb;b;`"@v"@z'@z8BHHJJHHDD@@25t'D'55DKQU\``d|,Hk%Ej%Ej%NhYb;b;`"@v"@z'@z8BHHJJHHDD@@25t'D'55DKQU\``d|Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF++\»ϾʨΎԾҼϹͶʳƯ°jgkSLVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTVĿÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}x~j`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTV\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...```````````````````````````````````````````````````````````````___]]]ZZZUUUJJJ```````````````````````````````````````````````````````````````___]]]ZZZUUUJJJ```````````````````````````````````````````````````````````````___]]]ZZZUUUJJJ```````````````````````````````````````````````````````````````___]]]ZZZUUUJJJ%EiFvHxFvFtFtFtFtFtFtFtFtBo;c.P 4%EiFvHxFvFtFtFtFtFtFtFtFtBo;c.P$/<%EiFvHxFvFtFtFtFtFtFtFtFtBo;c.P$/<%EiFvHxFvFtFtFtFtFtFtFtFtBo;c.P$/<DDHHHHFF@@55z+L'@"2 ),DDHHHHFF@@55z+L'@"2%)DDHHHHFF@@55z+L'@"2*&:^:DDHHHHFF@@55z+L'@"2%),HkFvHzHwFuFuFuFuFuFuFuFuDp=e2R$3,HkFvHzHwFuFuFuFuFuFuFuFuDp=e2R+4?,HkFvHzHwFuFuFuFuFuFuFuFuDp=e2R+4?,HkFvHzHwFuFuFuFuFuFuFuFuDp=e2R+4?QQ@B5{B"NH=@FFFFHHHHHHDD@@55wD".'8RSTd|]]BD5{B"NH=@FFFFHHHHHHDD@@55wD".'8RSTd|bbAE5zB"NH=@FFFFHHHHHHDD@@55wD".'8RSTd|]]BD5{B"NH=@FFFFHHHHHHDD@@55wD".'8RSTd|Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF++\ſʶȴƲïż¼}zYIaȻϾŽŽŽտԽѻϸͶɲů|xtni`sTYFaȻϾŽŽŽտԽѻϸͶɲů|xtni`sTYFaȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]UaʬŽŽտԽѻϸͶɲů|xtni`sTYFaȻϾŽŽŽɲů|xtni`sTYFaȻϾŽŽŽտԽѻϸͶɲů|sTYFaȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]Ua\\\cccffffff``````````````````````````````eeefffkkkǀbbb]]]ZZZUUUPPPFFF@@@```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````eeefffkkkǀbbb]]]ZZZUUUPPPFFF@@@```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````eeefffkkkǀbbb]]]ZZZUUUPPPFFF@@@```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````eeefffkkkǀbbb]]]ZZZUUUPPPFFF@@@```````````````````````````]]]UUUHHH...````````````````````````````````````````````````````````````___]]]ZZZTTTJJJ````````````````````````````````````````````````````````````___]]]ZZZTTTJJJ````````````````````````````````````````````````````````````___]]]ZZZTTTJJJ````````````````````````````````````````````````````````````___]]]ZZZTTTJJJHxJ{HzFvFvFvFvFvFvFvFvDr=g2T&6HxJ{HzFvFvFvFvFvFvFvFvDr=g2T4:FHxJ{HzFvFvFvFvFvFvFvFvDr=g2T4:FHxJ{HzFvFvFvFvFvFvFvFvDr=g2T4:FDDHHHHFF@@88~''YRTVDDHHHHFF@@88~''YNURDDHHHHFF@@88~''YLRPDDHHHHFF@@88~''YNURFvHzHwFuFuFuFuFuFuFuFuDp=e2R(4FvHzHwFuFuFuFuFuFuFuFuDp=e2R9?GFvHzHwFuFuFuFuFuFuFuFuDp=e2R9?GFvHzHwFuFuFuFuFuFuFuFuDp=e2R9?GTTDDFFFFHHHHDD@@55wH8'BPPZ^uZnpjuTTDDFFFFHHHHDD@@55wH8'BPPZ^uZnpjuXXDDFFFFHHHHDD@@55wH8'BPPZ^uZnpjuTTDDFFFFHHHHDD@@55wH8'BPPZ^uZnpjuZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF++\źeOo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\eKo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\eKo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gTo½’ԾҼѺθ˴ȱĭ~{vrme~\eKo·ʻϾȱĭ~{vrme~\eKo·ʻϾԾҼѺθ˴ȱĭ~neKo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gTo\\\cccffffff```````````````````````````bbbfffgggiiivvvccc```\\\YYYRRRJJJNNN```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````bbbfffgggiiivvvccc```\\\YYYRRRJJJNNN```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````bbbfffgggiiivvvccc```\\\YYYRRRJJJNNN```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````bbbfffgggiiivvvccc```\\\YYYRRRJJJNNN```````````````````````````]]]UUUHHH...`````````````````````````````````````````````````````````___]]]ZZZTTTJJJ`````````````````````````````````````````````````````````___]]]ZZZTTTJJJ`````````````````````````````````````````````````````````___]]]ZZZTTTJJJ`````````````````````````````````````````````````````````___]]]ZZZTTTJJJHxJ}J{HxHxHxHxHxHxHxHxFt@i2U68>HxJ}J{HxHxHxHxHxHxHxHxFt@i2UHxJ}J{HxHxHxHxHxHxHxHxFt@i2UHxJ}J{HxHxHxHxHxHxHxHxFt@i2UDDHHHHFFBB88''\F))I//J//JFFTHSbimtDDHHHHFFBB88''\11LPW_DDHHHHFFBB88''\WX`QW^DDHHHHFFBB88''\11LPW_HvHzHwFuFuFuFuFuFuFuFuDp=e1QHvHzHwFuFuFuFuFuFuFuFuDp=e1QHvHzHwFuFuFuFuFuFuFuFuDp=e1QHvHzHwFuFuFuFuFuFuFuFuDp=e1QFFHHJJHHFF@@55{""N""P""U""TJF!!G//LCJ_jb}kr|FFHHJJHHFF@@55{""N""P""U""TJF!!G//LCJ_jb}kr|FFHHJJHHFF@@55{""N""P""U""TJF!!G//LCJ_jb}kr|FFHHJJHHFF@@55{""N""P""U""TJF!!G//LCJ_jb}kr|Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF++䂂TT_½½sqQ|·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`qQ|·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`qQ|·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`s^|ź˺ԿԿӾҼѺϸ̶ʳƯ«}xuoi`qQ|·ʻϽѾӿԿԿƯ«}xuoi`qQ|·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}qQ|·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`s^|\\\cccffffff``````````````````````````````cccfffffffffeeecccbbb___\\\WWWRRRPPP___```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````cccfffffffffeeecccbbb___\\\WWWRRRPPP___```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````cccfffffffffeeecccbbb___\\\WWWRRRPPP___```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````cccfffffffffeeecccbbb___\\\WWWRRRPPP___```````````````````````````]]]UUUHHH...``````````````````````````````````````````````````````___]]]ZZZTTTJJJ``````````````````````````````````````````````````````___]]]ZZZTTTJJJ``````````````````````````````````````````````````````___]]]ZZZTTTJJJ``````````````````````````````````````````````````````___]]]ZZZTTTJJJ1NrHxHzFvFvFvFvFvFvFvFvDr=e1J1NrHxHzFvFvFvFvFvFvFvFvDr=e0>S,LpHxHzFvFvFvFvFvFvFvFvDr=e0>S1NrHxHzFvFvFvFvFvFvFvFvDr=e0>SMMJJJJHHDD;;''\FFFFFFVV^@N`bm|QgMMJJJJHHDD;;''\F!!GW\bIYkBTisuxIIJJJJHHDD;;.._=JZDO]MMJJJJHHDD;;''\F!!GW\bIYkBTisux[ewHuFvDsDsDsDsDsDsDsDsBn8_[ewHuFvDsDsDsDsDsDsDsDsBn:_5JaHvFvDsDsDsDsDsDsDsDsBn:_[ewHuFvDsDsDsDsDsDsDsDsBn:_HHJJJJFFBB55|''Y..m22u22v..m''Y''Z++e++gmikim]oHHJJJJFFBB55|''Y..m22u22v..m''Y''Z++e++gmikim]oHHJJJJFFBB55|''Y..m22u22v..m''Y''Z++e++gmikim]oHHJJJJFFBB55|''Y..m22u22v..m''Y''Z++e++gmikim]oZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFzSµȿȺÿcwYµȹͻϼмѼлϺθ̶ʴǰí~{vrkcwYµȹͻϼмѼлϺθ̶ʴǰí~{vrkcwYµȹͻϼмѼлϺθ̶ʴǰí~{vrkczcſçѼлϺθ̶ʴǰí~{vrkcwYµȹͻϼмѼí~{vrkcwYµȹͻϼмѼлϺθ̶ʴǰí~x]µȹͻϼмѼлϺθ̶ʴǰí~{vrkczc\\\cccffffff```````````````````````````````````````]]]]]]\\\ZZZYYYWWWWWWZZZ`````````````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````````````````]]]]]]\\\ZZZYYYWWWWWWZZZ`````````````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````````````````]]]]]]\\\ZZZYYYWWWWWWZZZ`````````````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````````````````]]]]]]\\\ZZZYYYWWWWWWZZZ`````````````````````````````````]]]UUUHHH...```````````````````````````````````````````````````___]]]ZZZTTTJJJ```````````````````````````````````````````````````___]]]ZZZTTTJJJ```````````````````````````````````````````````````___]]]ZZZTTTJJJ```````````````````````````````````````````````````___]]]ZZZTTTJJJLZp,Jo%Gm%Gm%Gm%Gm%GmChFoHpDj4MLZp,Jo%Gm%Gm%Gm%Gm%Gm%Gm%Gm%Gm,FgHhLuHpBj@f%Gm%Gm%Gm%Gm%Gm,FgLZp,Jo%Gm%Gm%Gm%Gm%Gm%Gm%Gm%Gm,FgMMJJHHBB88''W""PF''W++`""UHF"FPf~YpRg~BMYMMJJHHDD88""PJFF4?VFYnJ]thpzOOFFJJHHDD885B]?OaMMJJHHDD88""PJFF4?VFYnJ]thpzZcsZcs%IbW{UxNn:QZcsZcsX`mSrY~UxJj%:QZcsX`mZcsZcsX`mHHJJFF@@..o55}====;;88~22p22t55x55}vvtWmY_gHHJJFF@@..o55}====;;88~22p22t55x55}vvtWmY_gHHJJFF@@..o55}====;;88~22p22t55x55}vvtWmY_gHHJJFF@@..o55}====;;88~22p22t55x55}vvtWmY_gZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5JJJJJJJJJJJJJJJJJJTTJJJJJJJJJJJJJJJJJJBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++ĵɷ˽ïƽϏƾörmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmgv»̸˶ʵȲƯí~{vrmc{^ĵɷ˸̸ÿ{vrmc{^ĵɷ˸̸̸˶ʵȲƯí~|cĵɷ˸̸̸˶ʵȲƯí~{vrmgv]]]eee___WWWJJJ222\\\]]]TTT;;;\\\]]]TTT;;;]]]eee___WWWJJJ222]]]eee___WWWJJJ222\\\]]]TTT;;;\\\]]]TTT;;;]]]eee___WWWJJJ222]]]eee___WWWJJJ222\\\]]]TTT;;;\\\]]]TTT;;;]]]eee___WWWJJJ222]]]eee___WWWJJJ222\\\]]]TTT;;;\\\]]]TTT;;;]]]eee___WWWJJJ222???222````````````````````````````````````````````````___]]]ZZZTTTJJJ???222````````````````````````````````````````````````___]]]ZZZTTTJJJ???222````````````````````````````````````````````````___]]]ZZZTTTJJJ???222````````````````````````````````````````````````___]]]ZZZTTTJJJ%G\jlm0DS%GZ9DOTT;;22v22r++b''Z55{55w..n""RJBLouZs@Pc8FYLLBB;;..n''Y..i''YFTj`z8FY2@Poo@@BB@@;;2;cWn8FWLLBB;;..n''Y..i''YFTj`z8FY2@P%G\jlm0DS%GZ9DOFF@@88~88BBBB@@==8855}@@~__zxc|FF@@88~88BBBB@@==8855}@@~__zxc|FF@@88~88BBBB@@==8855}@@~__zxc|FF@@88~88BBBB@@==8855}@@~__zxc|Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5RRRRRRRRRRRRRRRRRR䂂++++++++++++++++++++++++++++++++++++++++RRRRRRRRRRRRRRRRRRBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++~²ŲŲŲį­~|zupjp~²ŲŲŲį­~|zupjp~²ŲŲŲį­~|zupjp²ŲŲŲį­~|zupnżŲį­~|zupjp~²Ųupjp~²ŲŲŲį­~v²ŲŲŲį­~|zupnfffvvvbbbZZZLLL???___]]]]]]UUU@@@___]]]]]]UUU@@@fffvvvbbbZZZLLL???fffvvvbbbZZZLLL???___]]]]]]UUU@@@___]]]]]]UUU@@@fffvvvbbbZZZLLL???fffvvvbbbZZZLLL???___]]]]]]UUU@@@___]]]]]]UUU@@@fffvvvbbbZZZLLL???fffvvvbbbZZZLLL???___]]]]]]UUU@@@___]]]]]]UUU@@@fffvvvbbbZZZLLL???JJJLLLJJJ`````````````````````````````````````````````___]]]ZZZTTTJJJJJJLLLJJJ`````````````````````````````````````````````___]]]ZZZTTTJJJJJJLLLJJJ`````````````````````````````````````````````___]]]ZZZTTTJJJJJJLLLJJJ`````````````````````````````````````````````___]]]ZZZTTTJJJPP|@@;;8844t99eJNoqg[s]oVV<<88~55x11dYojZqXh{??55}58r_vcxY`gVV<<88~55x11dYojZqXh{mme{mme{mme{mme{Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5JJJJJJJJJJJJJJJJJJ++JJJJJJJJJJJJJJJJJJBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++|zzzwupmm|zzzwupmm|zzzwupmmzwxupmm|mm|zzzwxbbbfffeee```YYYJJJXXX]]]]]]UUUDDD<<<XXX]]]]]]UUUDDD<<<bbbfffeee```YYYJJJbbbfffeee```YYYJJJXXX]]]]]]UUUDDD<<<XXX]]]]]]UUUDDD<<<bbbfffeee```YYYJJJbbbfffeee```YYYJJJXXX]]]]]]UUUDDD<<<XXX]]]]]]UUUDDD<<<bbbfffeee```YYYJJJbbbfffeee```YYYJJJXXX]]]]]]UUUDDD<<<XXX]]]]]]UUUDDD<<<bbbfffeee```YYYJJJTTTYYYZZZWWW``````````````````````````````````````````___]]]ZZZTTTJJJTTTYYYZZZWWW``````````````````````````````````````````___]]]ZZZTTTJJJTTTYYYZZZWWW``````````````````````````````````````````___]]]ZZZTTTJJJTTTYYYZZZWWW``````````````````````````````````````````___]]]ZZZTTTJJJZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++oooaaa]]]YYYTTTXXX]]]\\\UUUHHH333XXX]]]\\\UUUHHH333oooaaa]]]YYYTTToooaaa]]]YYYTTTXXX]]]\\\UUUHHH333XXX]]]\\\UUUHHH333oooaaa]]]YYYTTToooaaa]]]YYYTTTXXX]]]\\\UUUHHH333XXX]]]\\\UUUHHH333oooaaa]]]YYYTTToooaaa]]]YYYTTTXXX]]]\\\UUUHHH333XXX]]]\\\UUUHHH333oooaaa]]]YYYTTTYYY```bbb___```````````````````````````````````````___]]]ZZZTTTJJJYYY```bbb___```````````````````````````````````````___]]]ZZZTTTJJJYYY```bbb___```````````````````````````````````````___]]]ZZZTTTJJJYYY```bbb___```````````````````````````````````````___]]]ZZZTTTJJJZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++YUUYWW\]\\v~ii~v]]]eeeffffffffffffffffffffffffffffffffffff```]]]ZZZTTTJJJ]]]eeeffffffffffffffffffffffffffffffffffff```]]]ZZZTTTJJJ]]]eeeffffffffffffffffffffffffffffffffffff```]]]ZZZTTTJJJ]]]eeeffffffffffffffffffffffffffffffffffff```]]]ZZZTTTJJJZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5BBBBBBBBBBBBBBBBBB==BBBBBBBBBBBBBBBBBBBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++R_R]no_one|tkt|mcpckfffvvvffffffffffffffffffffffffffffffffffffbbbZZZTTTJJJfffvvvffffffffffffffffffffffffffffffffffffbbbZZZTTTJJJfffvvvffffffffffffffffffffffffffffffffffffbbbZZZTTTJJJfffvvvffffffffffffffffffffffffffffffffffffbbbZZZTTTJJJZm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5TbbTPNNPYTTYggbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYKKKbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYKKKbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYKKKbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYKKKZm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5ogvjkrnkoooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTTZm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5Zm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5Zm`t`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`uJZ+5WjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=J=J+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2ZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5Zm`uTfL\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5Zm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5Zm`ucx8p@n~ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkTeL\=J+5.888222.......................................###888222.......................................###888222.......................................###888222.......................................###Zm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5'H;D."8|+u8='{n;JGGGLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***GGGLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***GGGLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***GGGLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5S_\\\\\\\\\\\\\\\\\\\\ZLBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888++++{z+'Y\YWjb;`j5H8HJJJTTTYYYWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888###JJJTTTYYYWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888###JJJTTTYYYWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888###JJJTTTYYYWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888###Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5++++++++++++++++++z}Z++++++++++++++++++BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++x"sis'"mB\JJJTTTZZZ]]]___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZRRRDDD...JJJTTTZZZ]]]___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZRRRDDD...JJJTTTZZZ]]]___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZRRRDDD...JJJTTTZZZ]]]___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZRRRDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5888888888888888888f888888888888888888BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++7+=1$77+=1$77+=1$7===777===777===777===777===777???222...666GGG^^^nnn```TTT999]]]nnn```TTT999111222...###???222...666GGG^^^nnn```TTT999]]]nnn```TTT999111222...###???222...666GGG^^^nnn```TTT999]]]nnn```TTT999111222...###???222...666GGG^^^nnn```TTT999]]]nnn```TTT999111222...###JJJTTTZZZ]]]___```````````````````````````````````````___WWWJJJ222JJJTTTZZZ]]]___```````````````````````````````````````___WWWJJJ222JJJTTTZZZ]]]___```````````````````````````````````````___WWWJJJ222JJJTTTZZZ]]]___```````````````````````````````````````___WWWJJJ222LXh:J[FVjGGe..a++`''Y--RCCROOYzFVkPf9Ea--]'']""R&&IMMTW`lJ]w""NFE//?zFVkPf9Ea--]'']""R&&IMMTdzsuxVV^SS\mmqdzsuxVV^SS\mmqdzsuxVV^SS\mmqdzsuxVV^SS\mmqZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5==================v==================BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7QITREWRBYP=YP;YP;YP=YRBYPEW777M:TN9WP;YP;YR@YTJYWUYYYYWWW647M:TN9WYYYYYYYYYYYYYYYYYYN9W1$7TTTWWWYYYWUYTJYR@YP;YP;YN9W1$7QITREWRBYP=YP;YP;YP=YRBYPEW777JJJLLLJJJDDD888***@@@TTTiii___PPPLLLccc___PPPGGGLLLJJJDDD888***JJJLLLJJJDDD888***@@@TTTiii___PPPLLLccc___PPPGGGLLLJJJDDD888***JJJLLLJJJDDD888***@@@TTTiii___PPPLLLccc___PPPGGGLLLJJJDDD888***JJJLLLJJJDDD888***@@@TTTiii___PPPLLLccc___PPPGGGLLLJJJDDD888***JJJTTTZZZ]]]___``````````````````````````````````````````\\\ZZZLLL111JJJTTTZZZ]]]___``````````````````````````````````````````\\\ZZZLLL111JJJTTTZZZ]]]___``````````````````````````````````````````\\\ZZZLLL111JJJTTTZZZ]]]___``````````````````````````````````````````\\\ZZZLLL111[\]&-$$*0(qpinuHP;;88====;;++g''Z""RJ""P,,O22Kmeze}55};;88''_J""P""L++Ie}@Ju""RJFF''6meze}55};;88''_J""P""L++I[\]&-$+04(Vg}:J[2@P6BRWWoHHp==u22p22s22v22r..m++g''W""N""N&&JVg}:J[2@P6BRWWoHHp==u22p22s22v22r..m++g''W""N""N&&JVg}:J[2@P6BRWWoHHp==u22p22s22v22r..m++g''W""N""N&&JVg}:J[2@P6BRWWoHHp==u22p22s22v22r..m++g''W""N""N&&JZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=VTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=RIVR<[U=_Y@bZBcY@cW@bU=_R;\R=YULYYYYYYYYYYSPW8-=RIVR<[U=_Y@bZBccccbbb___\\\YYYYYYP;YP;YP;YN9W6'=SLVXU[___bbbccc_TcYBbU=_R;\P;YP;YP;YP;YP;YN9W6'=VTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=TTTYYYZZZWWWRRRHHH888...\\\\\\FFF NNNTTTDDD ???WWWZZZWWWRRRHHH888###TTTYYYZZZWWWRRRHHH888...\\\\\\FFF NNNTTTDDD ???WWWZZZWWWRRRHHH888###TTTYYYZZZWWWRRRHHH888...\\\\\\FFF NNNTTTDDD ???WWWZZZWWWRRRHHH888###TTTYYYZZZWWWRRRHHH888...\\\\\\FFF NNNTTTDDD ???WWWZZZWWWRRRHHH888###JJJTTTZZZ]]]___`````````````````````````````````````````````JJJWWWGGGJJJTTTZZZ]]]___`````````````````````````````````````````````JJJWWWGGGJJJTTTZZZ]]]___`````````````````````````````````````````````JJJWWWGGGJJJTTTZZZ]]]___`````````````````````````````````````````````JJJWWWGGGikl.A'="8"5022 2 2 ,'1?$/<$/<$/< (9(9(7+17+4A$/<$/>$/<&6"5"5"5.'1?$/<$/<$/< (9(9(7+17mtFH@@BBDDFFDD55{22r++g55{88~22t'']%%G~txbv==BB==++c55}88~22t''\%%Gug88~8822s''ZF~txbv==BB==++c55}88~22t''\%%Gikl:M.B'8'8(!(STXMPTJLOCEJ?BFSTXMPTKMQ 2<+='8'8!1STXMPTJLOCEJ?BFwGXlJ_v8HY5DUBBBBBB@@@@@@==;;55{..j55z55w..j""NwGXlJ_v8HY5DUBBBBBB@@@@@@==;;55{..j55z55w..j""NwGXlJ_v8HY5DUBBBBBB@@@@@@==;;55{..j55z55w..j""NwGXlJ_v8HY5DUBBBBBB@@@@@@==;;55{..j55z55w..j""NZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++YFa`FkiLtnPzs_|ug|ukzupwpkskgnebg]T`UJZRBYP;YP;YP;YYFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;YYFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;Y]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=YYFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`UHZYYYYYYYYYWTYYFa`FkiLtnPzoP|oP|zzzwwwsssnnnggg```R;ZP;YP;YP;YP;YYIajgktttzzz|||tb|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;Y]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=YYYY```bbb___ZZZNNN888+++222WWW555......PPP555...222JJJ\\\___ZZZRRRDDD...YYY```bbb___ZZZNNN888+++222WWW555......PPP555...222JJJ\\\___ZZZRRRDDD...YYY```bbb___ZZZNNN888+++222WWW555......PPP555...222JJJ\\\___ZZZRRRDDD...YYY```bbb___ZZZNNN888+++222WWW555......PPP555...222JJJ\\\___ZZZRRRDDD...JJJTTTZZZ]]]___````````````````````````````````````````````````222???JJJTTTZZZ]]]___````````````````````````````````````````````````222???JJJTTTZZZ]]]___````````````````````````````````````````````````222???JJJTTTZZZ]]]___````````````````````````````````````````````````222???+;Q5W5W2T2T.P.N+J+H+F'D'@5&20>T5W5W2T2T.P.N+J+H+F'D'@5#20>T5W5W2T2T.P.N+J+H+F'D'@5.0>T5W5W2T2T.P.N+J+H+F'D'@5#2t}rOOBBFFHHHH;;22p88==;;55{..i""R$$Fu{\lDD8888==;;55{++g""P Duu?D@@;;55{++g""PCu{\lDD8888==;;55{++g""P D9DP.L+H'D'D'D'D'D'D'D'D";1')..K+H'D'D'D'D'D'D'D'D";!4359.K+H'D'D'D'D'D'D'D'D";2!.K+H'D'D'D'D'D'D'D'D";!4359rLbzH\sRgPe}Pe~HHHHHHFFDDDDBBBB55{55z888855w++f""L33KrLbzH\sRgPe}Pe~HHHHHHFFDDDDBBBB55{55z888855w++f""L55LrLbzH\sRgPe}Pe~HHHHHHFFDDDDBBBB55{55z888855w++f""L00IrLbzH\sRgPe}Pe~HHHHHHFFDDDDBBBB55{55z888855w++f""L55LZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF==vfZLeKosT~j~{{{sssjjj```ZYZUPYRDYP;YN9W+0eKosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YN9W+0eKosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YN9W+0gTosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YPCW000eKosTzY~\\]\~\|ZzYtToP{gJs_DjZL`ZZZYYYYYYWTYN>~''Y88==8822t++b""UHAAv88==8822t++b""UHMP`88==8822t++b""UHAAv88==8822t++b""UH7[5W.P+J+J+J+J+J+J+J+J'@51/137[5W.P+J+J+J+J+J+J+J+J'@51'),7[5W.P+J+J+J+J+J+J+J+J'@51 7[5W.P+J+J+J+J+J+J+J+J'@51'),RW_\rRi]wOOJJHHDDDDBB@@..n22r88~8888~22v++bHRW_\rRi]wOOJJHHDDDDBB@@..n22r88~8888~22v++bHRW_\rRi]wOOJJHHDDDDBB@@..n22r88~8888~22v++bHRW_\rRi]wOOJJHHDDDDBB@@..n22r88~8888~22v++bHZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}ZqQ|n|||rrrggg]]]YYYWUYRDYO:X+0qQ|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YO:X+0qQ|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YO:X+0s^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000qQ|~\`beeeecb`]}ZwWoP|fJrbYg]]]YYYYYYWPYO:X+0qQ|~\`beeeeoP|fJr]DgT=]P;YP;YP;YO:X+0qQ|eecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YO:X+0s^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000\\\cccffffff```````````````````````````___NNNLLLLLLLLLLLLJJJFFFDDD===555...222YYY```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___NNNLLLLLLLLLLLLJJJFFFDDD===555...222YYY```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___NNNLLLLLLLLLLLLJJJFFFDDD===555...222YYY```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___NNNLLLLLLLLLLLLJJJFFFDDD===555...222YYY```````````````````````````]]]UUUHHH...JJJTTTZZZ]]]___``````````````````````````````````````````````````````JJJTTTZZZ]]]___``````````````````````````````````````````````````````JJJTTTZZZ]]]___``````````````````````````````````````````````````````JJJTTTZZZ]]]___``````````````````````````````````````````````````````5KhDrFtDsBm=f8_5Y.L+H'D'B'@";5"15KhDrFtDsBm=f8_5Y.L+H'D'B'@";5.5KhDrFtDsBm=f8_5Y.L+H'D'B'@";5,5KhDrFtDsBm=f8_5Y.L+H'D'B'@";5.MQV..J""T..n..o++g''YJFMSU""T..n..o++g''YJF>GH""T..n..o++g''YJFMSU""T..n..o++g''YJF:J`8\5W.P+J+J+J+J+J+J+J+J'@52$0:J`8\5W.P+J+J+J+J+J+J+J+J'@52!0:J`8\5W.P+J+J+J+J+J+J+J+J'@52*:J`8\5W.P+J+J+J+J+J+J+J+J'@52!0Xk^ixa{kffUU+.f++b"'U''_..n55w55x22p++e""RF7F=3H3?A?Xk^ixa{kffUU+.f++b"'U''_..n55w55x22p++e""RF;I@8K8Xk^ixa{kffUU+.f++b"'U''_..n55w55x22p++e""RF#9,"<"Xk^ixa{kffUU+.f++b"'U''_..n55w55x22p++e""RF;I@8K8Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF''\x]wwwkkk___YYYYYYWPYNP<9Ph'DR'BL5;T@LZ@L]2FU2LZ5;U.@T";@"."2+F5Y;`8]2R$/<T7>Ph'DR'BL5;T@LZ@L]2FU2LZ5;U.@T";@"."2+F5Y;`8]2R0P<9Ph'DR'BL5;T@LZ@L]2FU2LZ5;U.@T";@"."2+F5Y;`8]2R$/<88S""P''\=kHzJ|J{HwHwHwHwHwHwHwHwDs@i2U;FF88S""P''\=kHzJ|J{HwHwHwHwHwHwHwHwDs@i2U;FF88S""P''\=kHzJ|J{HwHwHwHwHwHwHwHwDs@i2U;FF88S""P''\=kHzJ|J{HwHwHwHwHwHwHwHwDs@i2U;FFrw{'HT2=YFUj;HZ'DP@Tb5=YHb{.HR.=H+.B+5D"5F.H"'Y=gHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'Drw{'HT2=YFUj;HZ'DP@Tb5=YHb{.HR.=H+.B+5D"5F.H"'Y=gHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'Drw{'HT2=YFUj;HZ'DP@Tb5=YHb{.HR.=H+.B+5D"5F.H"'Y=gHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'D(rw{'HT2=YFUj;HZ'DP@Tb5=YHb{.HR.=H+.B+5D"5F.H"'Y=gHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'DZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF==eeiFFFFFFFFFFFFFFFFFFTTTLLL........5522............@@bbi\zĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP;Y===wwwbbbYYY===ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwYBbWUY===ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===zĶʺμѾҿ˜̠޼з˴ȲĮ|xurupwW@bP;Y7+=zĶʺμѾҿ˜Į|xurmgb|ZkNwW@bP;Y7+=zƽʶ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP;Y7+=ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===fffwww൵ccc`````````````````````___bbbcccw\\..~''WJJLLLDDD555````````````````````````___]]]YYYLLL888fffwww൵ccc`````````````````````___bbbcccw\\..~''WJJLLLDDD555````````````````````````___]]]YYYLLL888fffwww൵ccc`````````````````````___bbbcccw\\..~''WJJLLLDDD555````````````````````````___]]]YYYLLL888fffwww൵ccc`````````````````````___bbbcccw\\..~''WJJLLLDDD555````````````````````````___]]]YYYLLL888eee88TTFFz``jjjjjjjjjjjjjjjjjjjjjjjj```YYYLLL222 999eee88TTFFz``jjjjjjjjjjjjjjjjjjjjjjjj```YYYLLL222 999eee88TTFFz``jjjjjjjjjjjjjjjjjjjjjjjj```YYYLLL222 999eee88TTFFz``jjjjjjjjjjjjjjjjjjjjjjjj```YYYLLL222 999BBDD@@;;EE8Z5J.=J8HR8BJ2FN';N'BU=Pc2@T28P5BL2BH28F"'2".'8+@YjwlZpDDFFBB88<GHknFFDD@@ss{5H5H;U'HW8H]8Pb5L].FU'BR.FW'@J+=D'DR"BB+5B'5Z+=+=MSUDDBB;;--]`ky5H5H;U'HW8H]8Pb5L].FU'BR.FW'@J+=D'DR"BB+5B'5Z+=+=MQV>>~;;55{++g--RFFDD@@ss{5H5H;U'HW8H]8Pb5L].FU'BR.FW'@J+=D'DR"BB+5B'5Z+=+=MSUDDBB;;--]`bc`5T====;;|wn?pi\p5R`8FN+;R2N\"BH.DH+DJ+=='.5+5=2R=eBmBn=e2T88{vk?kg\p5R`8FN+;R2N\"BH.DH+DJ+=='.5+5=2R=eBmBn=e2Trw\p5R`8FN+;R2N\"BH.DH+DJ+=='.5+5=2R=eBmBn=e2T"8$88{vk?kg\p5R`8FN+;R2N\"BH.DH+DJ+=='.5+5=2R=eBmBn=e2TDDn55z22u22r22v8;FwJ|HzHwHwHwFvFtDrDrDrBm;b+L"'W''_++c++c""LDDn55z22u22r22v8;FwJ|HzHwHwHwFvFtDrDrDrBm;b+L"'W''_++c++c""LDDn55z22u22r22v8;FwJ|HzHwHwHwFvFtDrDrDrBm;b+L"'W''_++c++c""LDDn55z22u22r22v8;FwJ|HzHwHwHwFvFtDrDrDrBm;b+L"'W''_++c++c""L5FJ+8R.LZ'FH8PW2LW5HL.=D.8D2@H".="+B"'T"2bDsHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'D5FJ+8R.LZ'FH8PW2LW5HL.=D.8D2@H".="+B"'T"2bDsHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'D5FJ+8R.LZ'FH8PW2LW5HL.=D.8D2@H".="+B"'T"2bDsHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'D'8$5FJ+8R.LZ'FH8PW2LW5HL.=D.8D2@H".="+B"'T"2bDsHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'DZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFDD..++FFFFFFFFFFFFFFFFFF++DD\|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9W|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9W̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\tb|cccWWWŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREW|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtug|ZBcN9W|Ÿ̼пŽŒگȱĭ~|xtoje\oP|ZBcN9W|ŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9WŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREWqqqdddgggxxx൵ccc```````````````___bbb22W@@@555]]]```````````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```````````````___bbb22W@@@555]]]```````````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```````````````___bbb22W@@@555]]]```````````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```````````````___bbb22W@@@555]]]```````````````___]]]ZZZTTTJJJpppaaa|ZZ""w\\eeeeeeeeeeeeeeeeeeeeeeeeeeebbbZZZLLL@@@555\\\___```{H2pppaaa|ZZ""w\\eeeeeeeeeeeeeeeeeeeeeeeeeeebbbZZZLLL@@@555\\\___```\"2pppaaa|ZZ""w\\eeeeeeeeeeeeeeeeeeeeeeeeeeebbbZZZLLL@@@555\\\___```b8pppaaa|ZZ""w\\eeeeeeeeeeeeeeeeeeeeeeeeeeebbbZZZLLL@@@555\\\___```N5DDHHDD;;55\TX] 8G2F28p=B_R]sWr"@N2BW8Ug'@L8ReDP{F=p8;u8;+;17[m@@;;8@^TX]@G2F28p=B_R]sWr"@N2BW8Ug'@L8ReDP{F=p8;u8;+;0;^q==55}GGaTX]JE2F28p=B_R]sWr"@N2BW8Ug'@L8ReDP{F=p8;u8;+; 3?KKHHDD;;''Y[m@@;;8@^TX]@G2F28p=B_R]sWr"@N2BW8Ug'@L8ReDP{F=p8;u8;+;0;^q==55}GGa^re"kҡ8z~@@@@@@Jm.b`UNJx'LN8BP'BDDYt2L\+5H+5F+8D"5D2LBmDsFvDs@i5W(1A8]He+b]UNJx'LN8BP'BDDYt2L\+5H+5F+8D"5D2LBmDsFvDs@i5W'1?\>@jP]NJx'LN8BP'BDDYt2L\+5H+5F+8D"5D2LBmDsFvDs@i5W'=&-8]He+b]UNJx'LN8BP'BDDYt2L\+5H+5F+8D"5D2LBmDsFvDs@i5W'1?88@@==;;;;@@8@BkFuDsBn=g;`5Y2R2R2U2U+H"N++b..m..o22v++f""N88@@==;;;;@@8@BkFuDsBn=g;`5Y2R2R2U2U+H"N++b..m..o22v++f""N88@@==;;;;@@8@BkFuDsBn=g;`5Y2R2R2U2U+H"N++b..m..o22v++f""N88@@==;;;;@@8@BkFuDsBn=g;`5Y2R2R2U2U+H"N++b..m..o22v++f""N`II;FH8DN5P]2DU.BR.=N5;H.=P';J+2B'=N+5+=.DFuHzJ{J{FvBo;c2R.P.P.P.P.P.P.P.P+HSTX`II;FH8DN5P]2DU.BR.=N5;H.=P';J+2B'=N+5+=.DFuHzJ{J{FvBo;c2R.P.P.P.P.P.P.P.P+HSTX`II;FH8DN5P]2DU.BR.=N5;H.=P';J+2B'=N+5+=.DFuHzJ{J{FvBo;c2R.P.P.P.P.P.P.P.P+H.B&-`II;FH8DN5P]2DU.BR.=N5;H.=P';J+2B'=N+5+=.DFuHzJ{J{FvBo;c2R.P.P.P.P.P.P.P.P+HSTXZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFbb@@@555FFFFFFFFFFFFFFFFFF++ee..\Ÿ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TçѿŽÎŐϠƗټϸ̶ɲůª|xupkep|||bbbTTTŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xus_|Y@bM:TŸ̼ѿŽÎŐϠɲůª|xupke]oP|Y@bM:TŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITdddgggxxx൵ccc````````````___vZZf@55555\\\````````````___]]]ZZZTTTJJJdddgggxxx൵ccc````````````___vZZf@55555\\\````````````___]]]ZZZTTTJJJdddgggxxx൵ccc````````````___vZZf@55555\\\````````````___]]]ZZZTTTJJJdddgggxxx൵ccc````````````___vZZf@55555\\\````````````___]]]ZZZTTTJJJ___cccYYPP..22vZZcccccccccccccccccccccccccccccc```YYYLLLRRRWWWx+'___cccYYPP..22vZZcccccccccccccccccccccccccccccc```YYYLLLRRRWWWsY"___cccYYPP..22vZZcccccccccccccccccccccccccccccc```YYYLLLRRRWWWҍj8___cccYYPP..22vZZcccccccccccccccccccccccccccccc```YYYLLLRRRWWWmHnDDHHFF;;55\jP]f}Pe~+HT.@L?UlG|eCebeU=U;F.o2wi~FU}CG@N=Yb]U?kgQv{Pe~+HT.@L?UlGxcAzebbU;|T8xD3e6ugYkOOBDDP@Zb`U?piS{|Pe~+HT.@L?UlVWhhiklHHFF==++`wi~FU}CG@N=Yb]U?kgQv{Pe~+HT.@L?UlGxcAzebbU;|T8xD3e6ugYk%dg;tP~f.~nBB@@BB@ZBD2=N+5B"BL;N.@F.=J";F+5=+52RJ{HzHxFt@j5W===YBD2=N+5B"BL;N.@F.=J";F+5=+52RJ{HzHxFt@j5WBD2=N+5B"BL;N.@F.=J";F+5=+52RJ{HzHxFt@j5W.A[\]===YBD2=N+5B"BL;N.@F.=J";F+5=+52RJ{HzHxFt@j5W??DDDDDDBBBBDD8=+=.F.\+2k"'U"JDBD8""B++`..n55x55|55w..j&&J??DDDDDDBBBBDD8=+=.F.\+2k"'U"JDBD8""B++`..n55x55|55w..j&&J??DDDDDDBBBBDD8=+=.F.\+2k"'U"JDBD8""B++`..n55x55|55w..j&&J??DDDDDDBBBBDD8=+=.F.\+2k"'U"JDBD8""B++`..n55x55|55w..j&&J58H"BJ.@P.DF+@N"@J28B';D'2@5;.B.@+=BkJ|J|J|HxDr=e5W5W5W5W5W5W5W5W5W.K58H"BJ.@P.DF+@N"@J28B';D'2@5;.B.@+=BkJ|J|J|HxDr=e5W5W5W5W5W5W5W5W5W.K58H"BJ.@P.DF+@N"@J28B';D'2@5;.B.@+=BkJ|J|J|HxDr=e5W5W5W5W5W5W5W5W5W.L:M[\]58H"BJ.@P.DF+@N"@J28B';D'2@5;.B.@+=BkJ|J|J|HxDr=e5W5W5W5W5W5W5W5W5W.KZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@@@555zFFFFFFFFFFFFFFFFFF++..==''\ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_˺’ŽÏσϠگ٭˜ռϹͶʳƯ«}zupozzz___ð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}znPzU=_ï·˼пŽÏσϠگʳƯ«}zupke\nPzU=_ï·ʨσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_ð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_qqqdddgggxxx൵ccc`````````___DDpJ""222ZZZ`````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc`````````___DDpJ""222ZZZ`````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc`````````___DDpJ""222ZZZ`````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc`````````___DDpJ""222ZZZ`````````___]]]ZZZTTTJJJooo___cccfffeee{ZZDD22222222DDvZZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___WWWNNN```222\\\iiinnnooo___cccfffeee{ZZDD22222222DDvZZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___WWWNNN```222\\\iiinnn'ooo___cccfffeee{ZZDD22222222DDvZZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___WWWNNN```222\\\iiinnnooo___cccfffeee{ZZDD22222222DDvZZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___WWWNNN```222\\\iiinnn5FFHHDD;;\>@rx^IPT7>BOBFe=uvbZbDLT2@r5@@;;3o3p{Zr[ajIQ==He+|vmUTFP<9EDGQDFwobY_DJN.=g.88?lCt`{QV]IIDDBBJm.|woUTFJB5+=+H><hjbLQQ/2N?AYYFFDD==..ap{Zr[ajIQ==He+|vmUTFP<9EDGQDFwobY_DJN.=g.88?lCt`{QV]=gcc`]4}ZBBDDDP25u";R2F';J5H.@L.;H"=F+5R'+\DrHzHwFvDr=e0>TIQ@N25u";R2F';J5H.@L.;H"=F+5R'+\DrHzHwFvDr=e0>T25u";R2F';J5H.@L.;H"=F+5R'+\DrHzHwFvDr=e+;QIQ@N25u";R2F';J5H.@L.;H"=F+5R'+\DrHzHwFvDr=e0>TBBHHHHHHFFFFFF+8o.@+;''Y'.Z"5.B"+5'="@=2""R++f55w888855w""NBBHHHHHHFFFFFF+8o.@+;''Y'.Z"5.B"+5'="@=2""R++f55w888855w""NBBHHHHHHFFFFFF+8o.@+;''Y'.Z"5.B"+5'="@=2""R++f55w888855w""NBBHHHHHHFFFFFF+8o.@+;''Y'.Z"5.B"+5'="@=2""R++f55w888855w""Neij/GV+@U+=J'@N2BN.8D'8@5B2D2U+8o8=8@FwHxHzFvBn;`8\8\8\8\8\8\8\8\7[eij/GV+@U+=J'@N2BN.8D'8@5B2D2U+8o8=8@FwHxHzFvBn;`8\8\8\8\8\8\8\8\7[eij/GV+@U+=J'@N2BN.8D'8@5B2D2U+8o8=8@FwHxHzFvBn;`8\8\8\8\8\8\8\8\7[9DPeij/GV+@U+=J'@N2BN.8D'8@5B2D2U+8o8=8@FwHxHzFvBn;`8\8\8\8\8\8\8\8\7[Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@555JFFFFFFFFFFFFFFFFFF++\~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[ʬÏÏÏŐŒŒ־ҼйͶʳǯ«}zutttXU[ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}z~iLtR<[~ɻϾŽÏÏÏŐŒʳǯ«}zupke~\iLtR<[~ȺϾÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[dddgggxxx൵ccc``````___22{R222ZZZ``````___]]]ZZZTTTJJJdddgggxxx൵ccc``````___22{R222ZZZ``````___]]]ZZZTTTJJJdddgggxxx൵ccc``````___22{R222ZZZ``````___]]]ZZZTTTJJJdddgggxxx൵ccc``````___22{R222ZZZ``````___]]]ZZZTTTJJJ___bbb```____________________________________________________________]]]YYY___```TTT^^^___bbb```____________________________________________________________]]]YYY___```TTT^^^___bbb```____________________________________________________________]]]YYY___```TTT^^^___bbb```____________________________________________________________]]]YYY___```TTT^^^LLDD@@22sootͽ@@FFDDDDBB==5w51C1yio8]88=rCHN==5wUEe^zkTjBB@@@@;;5}5.o."L"BBBB8899ayio8]88=rCHN==5wUEe^zkTj]n~IIBD2F5H8L5F5J2;b;@;@88~'']ADV,Hk5KhCG2F5H8L5F5J2;b;@;@88~'']ADV,Hk5Kh2F5H8L5F5J2;b;@;@88~'']ADV,Hk5KhCG2F5H8L5F5J2;b;@;@88~'']ADV,Hk5KhBBJJJJJJHHHHHH2U.B'8F'5;.='2"5;'8'8".2"'F''W..n55}8855{""NBBJJJJJJHHHHHH2U.B'8F'5;.='2"5;'8'8".2"'F''W..n55}8855{""NBBJJJJJJHHHHHH2U.B'8F'5;.='2"5;'8'8".2"'F''W..n55}8855{""NBBJJJJJJHHHHHH2U.B'8F'5;.='2"5;'8'8".2"'F''W..n55}8855{""NqTcwSW_6FO5J2F'5e@BHHFFDD@@8;';r=k;j8b5U5UDU%A^%A^%A^:J`qTcwSW_6FO5J2F'5e@BHHFFDD@@8;';r=k;j8b5U5UDU%A^%A^%A^:J`qTcwSW_6FO5J2F'5e@BHHFFDD@@8;';r=k;j8b5U5UDU%A^%A^%A^:J`qTcwSW_6FO5J2F'5e@BHHFFDD@@8;';r=k;j8b5U5UDU%A^%A^%A^:J`Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@555WvFFFFFFFFFFFFFFFFFF++\ĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIV»ϾʨΎԾҼϹͶʳƯ°jgkSLVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTVĹͽÎÏÏΎԾҼϹͶʳƯ«}x~j`FkRIVĹͽÎÏÏΎʳƯ«}xupjbzY`FkRIVĿÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTVqqqdddgggxxx൵ccc```___22T222\\\```___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```___22T222\\\```___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```___22T222\\\```___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```___22T222\\\```___]]]ZZZTTTJJJooo___cccsss൵ccc````````````````````````````````````````````````````````````ooo___cccsss൵ccc````````````````````````````````````````````````````````````ooo___cccsss൵ccc````````````````````````````````````````````````````````````ooo___cccsss൵ccc````````````````````````````````````````````````````````````UVBB==??mKKDDFFDD@@88!O1`zmwvxdz4}ZBB@@==;;.m.#B#OO@@;;GGe`zmwvxdzOOJE5H8Z.=vDFHHDD@@55}""T@G5H8Z.=vDFHHDD@@55}""T 8G5H8Z.=vDFHHDD@@55}""T@G5H8Z.=vDFHHDD@@55}""TDDFFJJHHHHHH@B2D+="5B"2;"+=";D'=2@+5B'5"."+""@F++`22s55z..j''WDDFFJJHHHHHH@B2D+="5B"2;"+=";D'=2@+5B'5"."+""@F++`22s55z..j''WDDFFJJHHHHHH@B2D+="5B"2;"+=";D'=2@+5B'5"."+""@F++`22s55z..j''WDDFFJJHHHHHH@B2D+="5B"2;"+=";D'=2@+5B'5"."+""@F++`22s55z..j''W]rLT`+=+;;HHHHFFBB;;22v++g''\"N@5+e54o7]rLT`+=+;;HHHHFFBB;;22v++g''\"N@5+e51o4]rLT`+=+;;HHHHFFBB;;22v++g''\"N@5+e5.p2BkB]rLT`+=+;;HHHHFFBB;;22v++g''\"N@5+e51o4Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFF++\ȻϾŽŽŽտԽѻϸͶɲů|xtni`sTYFaȻϾŽŽŽտԽѻϸͶɲů|xtni`sTYFaſʶȴƲïż¼}zYIaȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]UaȻϾŽŽŽտԽѻϸͶɲů|sTYFaȻϾŽŽŽɲů|xtni`sTYFaʬŽŽտԽѻϸͶɲů|xtni`sTYFaȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]Uadddgggxxx൵ccc___22FF''U222]]]___]]]ZZZTTTJJJdddgggxxx൵ccc___22FF''U222]]]___]]]ZZZTTTJJJdddgggxxx൵ccc___22FF''U222]]]___]]]ZZZTTTJJJdddgggxxx൵ccc___22FF''U222]]]___]]]ZZZTTTJJJdddgggxxx൵ccc`````````````````````````````````````````````````````````dddgggxxx൵ccc`````````````````````````````````````````````````````````dddgggxxx൵ccc`````````````````````````````````````````````````````````dddgggxxx൵ccc`````````````````````````````````````````````````````````qLU===RBBBB;;"cW8N#].~n@@==88'Y.##hrJPDJTX]VfDDHHHHDD@@55}""TTX]UcDDHHHHDD@@55}""TTX]EEDDHHHHDD@@55}""TTX]UcDDHHHHDD@@55}""TppHHHHDD@@;;;;'5e@H5@+8F"=D'@B"5F+8F".='.='5'.8'2"'".@""U..m55|55{++gppHHHHDD@@;;;;'5e@H5@+8F"=D'@B"5F+8F".='.='5'.8'2"'".@""U..m55|55{++gppHHHHDD@@;;;;'5e@H5@+8F"=D'@B"5F+8F".='.='5'.8'2"'".@""U..m55|55{++gppHHHHDD@@;;;;'5e@H5@+8F"=D'@B"5F+8F".='.='5'.8'2"'".@""U..m55|55{++gLYi8FWnnsCCZ'F"B;;HHHHFFBB;;22r++`""PIiMazaLYi8FWnnsCCZ'F"B;;HHHHFFBB;;22r++`""PIiMb|bLYi8FWnnsCCZ'F"B;;HHHHFFBB;;22r++`""PIiM\{\LYi8FWnnsCCZ'F"B;;HHHHFFBB;;22r++`""PIiMb|bZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFF++\·ʻϾԾҼѺθ˴ȱĭ~{vrme~\eKo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\eKoźeOo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gTo·ʻϾԾҼѺθ˴ȱĭ~neKo·ʻϾȱĭ~{vrme~\eKo½’ԾҼѺθ˴ȱĭ~{vrme~\eKo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gToqqqdddgggxxx൵___22++RRW555]]]]]]ZZZTTTJJJqqqdddgggxxx൵___22++RRW555]]]]]]ZZZTTTJJJqqqdddgggxxx൵___22++RRW555]]]]]]ZZZTTTJJJqqqdddgggxxx൵___22++RRW555]]]]]]ZZZTTTJJJqqqdddgggxxx൵ccc``````````````````````````````````````````````````````qqqdddgggxxx൵ccc``````````````````````````````````````````````````````qqqdddgggxxx൵ccc``````````````````````````````````````````````````````qqqdddgggxxx൵ccc``````````````````````````````````````````````````````p|TjCRd@awf8c;YfoTs@Y%,`f8z~5T.sTFZ#0xoz_wQV]\rDDHHHHFFBB88''Y^w<K.;D'@D5DN5@F;Tc5P].DN2;U+@P'=H2FH+.;5='.%,0RSTDDDD@@22vVV^HHJJFF88CCZ3>K.;D'@D5DN5@F;Tc5P].DN2;U+@P'=H2FH+.;5='.%,0RSTDDDD@@22vVV^HHJJFF88CCZ3>K.;D'@D5DN5@F;Tc5P].DN2;U+@P'=H2FH+.;5='.%,0RSTDDDD@@22vVV^HHJJFF88CCZ3>K.;D'@D5DN5@F;Tc5P].DN2;U+@P'=H2FH+.;5='.%,0RSTDDDD@@22vVV^O[hDWk]wPf~LYHHHHHHHHJJJJJJJJHHFFJJHHDD88DDnO[hDWk]wPf~LYHHHHHHHHJJJJJJJJHHFFJJHHDD88DDnO[hDWk]wPf~LYHHHHHHHHJJJJJJJJHHFFJJHHDD88DDnO[hDWk]wPf~LYHHHHHHHHJJJJJJJJHHFFJJHHDD88DDnZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5JJJJJJJJJJJJJJJJJJTT22@@@555JJJJJJJJJJJJJJJJJJBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++ĵɷ˸̸̸˶ʵȲƯí~{vrmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmc{^ĵɷ˽ïƽϏƾörmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmgvĵɷ˸̸̸˶ʵȲƯí~|cĵɷ˸̸ÿ{vrmc{^»̸˶ʵȲƯí~{vrmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmgvdddccc```eee..""텅|""FFF;;;BBBJJJdddccc```eee..""텅|""FFF;;;BBBJJJdddccc```eee..""텅|""FFF;;;BBBJJJdddccc```eee..""텅|""FFF;;;BBBJJJdddgggxxx൵ccc`````````````````````````````````````````````+++...@@@dddgggxxx൵ccc`````````````````````````````````````````````+++...@@@dddgggxxx൵ccc`````````````````````````````````````````````+++...@@@dddgggxxx൵ccc`````````````````````````````````````````````+++...@@@gFSbuVg{dj'j_Tt=gg"kbY{F_xmtim|LTBB@@55}++`qo|m@@DDFFBB@@BB@@tt~PYBBDDHHHHHHBBBBBB@@BBIIqo|m@@DDFFBB@@BB@@~~HHJJDD88~'@L.DT2@T=PeBNb8BT2HP8L`8;Z.@L+DN".=.='.=@GffDDDD@@22s~~HHJJDD88~'@L.DT2@T=PeBNb8BT2HP8L`8;Z.@L+DN".=.='.=@GffDDDD@@22s~~HHJJDD88~'@L.DT2@T=PeBNb8BT2HP8L`8;Z.@L+DN".=.='.=@GffDDDD@@22s~~HHJJDD88~'@L.DT2@T=PeBNb8BT2HP8L`8;Z.@L+DN".=.='.=@GffDDDD@@22sPbvTiZrltZZFFHHHHHHHHHHDDBBBB??bb|PbvTiZrltZZFFHHHHHHHHHHDDBBBB??bb|PbvTiZrltZZFFHHHHHHHHHHDDBBBB??bb|PbvTiZrltZZFFHHHHHHHHHHDDBBBB??bb|Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5RRRRRRRRRRRRRRRRRR䂂++++++++++++++++88@@@555""''""""""""''''RRRRRRRRRRRRRRRRRRBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++~²ŲŲŲį­~|zupjp~²ŲŲŲį­~|zupjp~²ŲŲŲį­~|zupjp²ŲŲŲį­~|zupn~²ŲŲŲį­~v~²ŲupjpżŲį­~|zupjp²ŲŲŲį­~|zupnqqq___bbbfffPPTTJJj@@JJJ@@@:::qqq___bbbfffPPTTJJj@@JJJ@@@:::qqq___bbbfffPPTTJJj@@JJJ@@@:::qqq___bbbfffPPTTJJj@@JJJ@@@:::qqqdddgggxxx൵ccc``````````````````````````````````````````888888***GGGqqqdddgggxxx൵ccc``````````````````````````````````````````888888***GGGqqqdddgggxxx൵ccc``````````````````````````````````````````888888***GGGqqqdddgggxxx൵ccc``````````````````````````````````````````888888***GGGrcc\~%Nf%de`TsJV`k{DD@@77}nWWFFDDBBAAVVYYLLFFDDDDGGddnWWFFDDBBAAVVFFHHBB55x.=D+;@8JT.=H;N`5FU+P`BWj.DR+DL+@B';H"55"2=MNQHHFF@@22rFFHHBB55x.=D+;@8JT.=H;N`5FU+P`BWj.DR+DL+@B';H"55"2=MNQHHFF@@22rFFHHBB55x.=D+;@8JT.=H;N`5FU+P`BWj.DR+DL+@B';H"55"2=MNQHHFF@@22rFFHHBB55x.=D+;@8JT.=H;N`5FU+P`BWj.DR+DL+@B';H"55"2=MNQHHFF@@22rOax[dpppOax[dpppOax[dpppOax[dpppZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5JJJJJJJJJJJJJJJJJJ++..@@@555JJJJJJJJJJJJJJJJJJBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++|zzzwupmm|zzzwupmm|zzzwupmmzwx|zz|mmupmmzwx___cccYY\HHJJJ???___cccYY\HHJJJ???___cccYY\HHJJJ???___cccYY\HHJJJ???dddgggxxx൵ccc```````````````````````````````````````NNNHHH888666dddgggxxx൵ccc```````````````````````````````````````NNNHHH888666dddgggxxx൵ccc```````````````````````````````````````NNNHHH888666dddgggxxx൵ccc```````````````````````````````````````NNNHHH888666Fdz^rggOOHHBB77x5BN5=P=;T;Lg8@U.5J=Pe5HY'@J8HT"DF'8H'5B'5NOQJJHHBB==uOOHHBB77x5BN5=P=;T;Lg8@U.5J=Pe5HY'@J8HT"DF'8H'5B'5NOQJJHHBB==uOOHHBB77x5BN5=P=;T;Lg8@U.5J=Pe5HY'@J8HT"DF'8H'5B'5NOQJJHHBB==uOOHHBB77x5BN5=P=;T;Lg8@U.5J=Pe5HY'@J8HT"DF'8H'5B'5NOQJJHHBB==uZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5HHHHHHHHHHHHHHHHHH..@@@555HHHHHHHHHHHHHHHHHHBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++ooo___ccc""NNNCCCooo___ccc""NNNCCCooo___ccc""NNNCCCooo___ccc""NNNCCCqqqdddgggxxx൵ccc````````````````````````````````````ZZZRRRDDD...qqqdddgggxxx൵ccc````````````````````````````````````ZZZRRRDDD...qqqdddgggxxx൵ccc````````````````````````````````````ZZZRRRDDD...qqqdddgggxxx൵ccc````````````````````````````````````ZZZRRRDDD...ZZHHDD==vCHU:AM;BP2=F=J\+@P8@RDRc2BR+=N+HT";B8=,7@OOHHBBHHpZZHHDD==vCHU:AM;BP2=F=J\+@P8@RDRc2BR+=N+HT";B8=,7@OOHHBBHHpZZHHDD==vCHU:AM;BP2=F=J\+@P8@RDRc2BR+=N+HT";B8=,7@OOHHBBHHpZZHHDD==vCHU:AM;BP2=F=J\+@P8@RDRc2BR+=N+HT";B8=,7@OOHHBBHHpZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFFBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++___|ZZYHHEEE___|ZZYHHEEE___|ZZYHHEEE___|ZZYHHEEEdddgggxxx௯ffffffffffffffffffffffffffffffffffff___WWWJJJ222dddgggxxx௯ffffffffffffffffffffffffffffffffffff___WWWJJJ222dddgggxxx௯ffffffffffffffffffffffffffffffffffff___WWWJJJ222dddgggxxx௯ffffffffffffffffffffffffffffffffffff___WWWJJJ222HHDDFHouxy8BL2FT5Y`+FY=FZ5DY2;H'DF'2H+8@..=HHBBWWqHHDDFHouxy8BL2FT5Y`+FY=FZ5DY2;H'DF'2H+8@..=HHBBWWqHHDDFHouxy8BL2FT5Y`+FY=FZ5DY2;H'DF'2H+8@..=HHBBWWqHHDDFHouxy8BL2FT5Y`+FY=FZ5DY2;H'DF'2H+8@..=HHBBWWqZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5BBBBBBBBBBBBBBBBBB..@@@555==BBBBBBBBBBBBBBBBBBBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++pppaaat__8822\NNGGGpppaaat__8822\NNGGGpppaaat__8822\NNGGGpppaaat__8822\NNGGGqqqdddgggwwwffffffffffffffffffffffffffffffffffffbbbZZZLLL???qqqdddgggwwwffffffffffffffffffffffffffffffffffffbbbZZZLLL???qqqdddgggwwwffffffffffffffffffffffffffffffffffffbbbZZZLLL???qqqdddgggwwwffffffffffffffffffffffffffffffffffffbbbZZZLLL???]kPe};J\@Rf\_e;9@.CM'8J+FY8J\.8N2;U8@J.AD6BD]rN\;Bu]kPe};J\@Rf\_e;9@.CM'8J+FY8J\.8N2;U8@J.AD6BD]rN\;Bu]kPe};J\@Rf\_e;9@.CM'8J+FY8J\.8N2;U8@J.AD6BD]rN\;Bu]kPe};J\@Rf\_e;9@.CM'8J+FY8J\.8N2;U8@J.AD6BD]rN\;BuZm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5LLL@@@555bbbeeeccc___YYYKKKbbbeeeccc___YYYKKKbbbeeeccc___YYYKKKbbbeeeccc___YYYKKKbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYJJJbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYJJJbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYJJJbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYJJJYoRg5DU2BR9EU`II8FJ+BT'8HFL'HT52;C**iWoNc|5DU@ITYoRg5DU2BR9EU`II8FJ+BT'8HFL'HT52;C**iWoNc|5DU@ITYoRg5DU2BR9EU`II;FJ+BT'8HFL'HT52;C**iWoNc|5DU@ITYoRg5DU2BR9EU`II8FJ+BT'8HFL'HT52;C**iWoNc|5DU@ITZm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5BBB888AAAoooaaa]]]YYYTTToooaaa]]]YYYTTToooaaa]]]YYYTTToooaaa]]]YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTT]v]uFYn=NbFVjHYlKQUexfUkUkJ]t2@P]v]uFYn=NbFVjHYlKQUexfUkUkJ]t2@P]v]uFYn=NbFVjHYlKQUexfUkUkJ]t2@P]v]uFYn=NbFVjHYlKQUexfUkUkJ]t2@PZm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5TTT\\\BBBJJJO\nFXmEUhFYnFVhk_wg~f^pJ\pJ_vDUj5BRO\nFXmEUhFYnFVhk_wg~f^pJ\pJ_vDUj5BRO\nFXmEUhFYnFVhk_wg~f^pJ\pJ_vDUj5BRO\nFXmEUhFYnFVhk_wg~f^pJ\pJ_vDUj5BRZm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5]]]by^rRg\oQatHQ[FZoYhzK[nK\pby^rRg\oQatHQ[FZoYhzK[nK\pby^rRg\oQatHQ[FZoYhzK[nK\pby^rRg\oQatHQ[FZoYhzK[nK\pZm`t`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`uJZ+5rjnrjnrjnrjnWjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=JBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeejjjUUUDDD==============================;;;NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUUUDDD==============================;;;NNNjjjjjjUUUDDD==============================;;;NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUUUDDD==============================;;;NNNjjjjjjUUUDDD==============================;;;NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUUUDDD==============================;;;NNNjjjjjjUUUDDD==============================;;;NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUUUDDD==============================;;;NNNjjjNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNNNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNNNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNNNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNN|||cccccccccccccccccc```___ZZZYYYUUUTTTRRRPPPNNNNNNNNNNNNNNNNNNNNNPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPNNNNNNNNNвލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFU|||ccccccccccccccccccccccccccccccccccccccccccbbbbbb`````````_________________________________________________________``````bbbbbbccccccccccccYYY|ckcpctcfcccccccccccccxcccrceccccccccccccbbbbbbbbbbbbbbb`}`__]\\Z{YzYpW\WYoYcYnWsTrTfRT_RRRUUUWWWUUUUUUUUURRR|||cccccccccccccccccccccccccccccccccccccccccccccccccccbbbbbbbbbbbbbbb``````______]]]\\\\\\ZZZYYYYYYWWWWWWYYYYYYWWWTTTTTTRRRRRRUUUWWWUUUUUUUUURRRѾͺ̹ȶų@@ooTTbb""==22""""++@@ooTTbb""==22""``ttLL''..++@@ooTTbb""==22""``ttLL''..++@@ooTTbb""==22""``ttLL''..++@@ooTTbb""==22""``ttLL''..++222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppggg222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppggg___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNN___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNN___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNN___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNN~~~tttggg```YYYPPPNNNNNNNNNNNNNNNNNNNNNPPPTTTTTTZZZZZZ\\\_______________________________________]]]ZZZUUUPPPNNNNNNNNNNNNޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡʫtggggggggggggggggggggggggggggggggggggggggggggtނ."""""""""""""""""""""""""""""""""""""""""""".ރF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻F~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cccޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠßؓؓٓȓ̓Ǔ䄪{vuoor|sojc}]p]bkbefgkkmppknogjjjmW]{{{vvvuuuoooooorrrsssooojjjccc]]]]]]bbbgggmmmkkkgggjjjWWWޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘۖ֓ՒЏ͌ɊŇ}|xussonnopswbbzzWW..wwHHzz==LLLL''++{~bbzzWW..wwHHYYWW22DD]]''++{~bbzzWW..wwHHYYWW22DD]]''++{~bbzzWW..wwHHYYWW22DD]]''++{~bbzzWW..wwHHYYWW22DD]]''++{~222NNNtttggg222NNNtttgggcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;cccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;cccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;cccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;NNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNmmm]]]RRRNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRWWWYYY______cccffffffffffffffffffffffffffffffffffff```ZZZRRRNNNNNNNNNNNNNNNNNNޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘʫggނ""ރF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻F~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cccޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘf=;snsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnf=;յީħȧŨĩéĩũŦååä⢜ϒ}}|vpkfggjooornuU`}}}}}}|||vvvpppkkkfffggggggjjjooooooooorrrnnnUUUޘUFFFFFFFFFFFFFFFFFFFFFDDBB@==;;;88552222222=t..'';;ZZWW""BBDD܍RRZZRR""""==....'';;ZZWW""BBDD|JJee..""''@@HH..""..'';;ZZWW""BBDD|JJee..""''@@HH..""..'';;ZZWW""BBDD|JJee..""''@@HH..""..'';;ZZWW""BBDD|JJee..""''@@HH..""222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttggg222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttggggggooorrrmmmrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrooofffYYY===gggooorrrmmmrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrooofffYYY===gggooorrrmmmrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrooofffYYY===gggooorrrmmmrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrooofffYYY===PPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBdzeeeRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPRRRYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYUUUNNNNNNNNNNNNNNNNNNNNNNNNNNNޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘʫgޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡgނ"tggggggggggggggggggggggggggggggggggggggggt"ރF޻ނ."""""""""""""""""""""""""""""""""""""""".ރ޻FdzuuuooommmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmtttcccޘFFޘsn޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻ƒsnԳʳ˳ͳγϳѳҮ٧֧שڲݳٳڳ۲ܫڪטҐ}umjijjjrrpsinUY|dz}}}uuummmjjjiiijjjjjjjjjrrrrrrpppsssiiiUUUޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻ݺ׶ִұѰʪä5t==zzBB@@jjLLڗttee55JJ====܄""88HH..FF==zzBB@@jjLLDDBBee55~~;;..2288''@@TT__RR55==zzBB@@jjLLDDBBee55~~;;....88''@@TT__RR55==zzBB@@jjLLDDBBee55~~;;..22;;''BBTT``RR55==zzBB@@jjLLDDBBee55~~;;++..88''@@TT__RR55222NNNeeeppppppppppppooobbbHHH======888222222BBBZZZkkkppppppppptttggg222NNNeeeppppppppppppooobbbHHH======888222222BBBZZZkkkppppppppptttggggggooorrrfffiiioooooooooooooooooooooooojjj\\\UUUjjjjjjjjjfffZZbPP`FFf@@e@@cBB`JJZTT\___gggjjjjjjjjjrrruuuooooooooooooooooooooooooooorrrfffYYY===gggooorrrfffiiioooooooooooooooooooooooojjj\\\UUUjjjjjjjjjfffZZbPP`FFf@@e@@cBB`JJZTT\___gggjjjjjjjjjrrruuuooooooooooooooooooooooooooorrrfffYYY===gggooorrrfffiiioooooooooooooooooooooooojjj\\\UUUjjjjjjjjjfffZZbPP`FFf@@e@@cBB`JJZTT\___gggjjjjjjjjjrrruuuooooooooooooooooooooooooooorrrfffYYY===gggooorrrfffiiioooooooooooooooooooooooojjj\\\UUUjjjjjjjjjfffZZkPPpFF|@@{@@zBBwJJjTTf___gggjjjjjjjjjrrruuuooooooooooooooooooooooooooorrrfffYYY===YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555dz{{{FFF=========DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDD============DDDNNNNNNNNNNNNNNNNNNޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻FޘʫgޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘgނ"gg"ރF޻ނ""ރ޻Fdzttt___RRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPUUUnnn}}}cccޘFFޘsn޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻snڳѳͳγϳѳҮҟѐ͐Ҝ٧ܲݳݳ߲߯xrszvjjibjjkpmksjmmUUUdzvvvjjjjjjiiibbbjjjjjjkkkpppmmmkkksssjjjUUUޘF޻ލރރރރރރރރރރރރރރރރރރ܁}{xurnmmgb___\__`_c5s""22TTBBBBbb랞RRoo@@++JJ'';;""""FF..\\JJ++LL''""22++""BBnn``""..LLwwttBB88LL''""22++""BBnn``""..LLwwttBB88LL''""22++""BBnn``""..LLwwttBB88LL''""22++""BBnn``""..LLwwttBB88LL''222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttggg222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttggggggooorrrfffYYY___gggggggggggggggggggggccc___jjjffgRRk22~""i@@UZZ]iiijjjjjjgggggggggggggggggggggjjjooorrrfffYYY===gggooorrrfffYYY___gggggggggggggggggggggccc___jjjffgRRk22~""i@@UZZ]iiijjjjjjgggggggggggggggggggggjjjooorrrfffYYY===gggooorrrfffYYY___gggggggggggggggggggggccc___jjjffgRRk22~""i@@UZZ]iiijjjjjjgggggggggggggggggggggjjjooorrrfffYYY===gggooorrrfffYYY___gggggggggggggggggggggccc___jjjffjRR|22""@@iZZ`iiijjjjjjgggggggggggggggggggggjjjooorrrfffYYY===```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...dzrrr555222222222222'''555NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN===555222222222222'''555NNNNNNNNNNNNNNNޘF޻ނ."""""""""""""""""""""""""""""""""""".ރ޻FޘʫgޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘgނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރF޻ނ"tggggggggggggggggggggggggggggggggggggt"ރ޻FdzxxxmmmTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWWWeee}}}cccޘFŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻFޘsn޻ނ."""""""""""""""""""""""""""""""""""".ރ޻sn߳׳ϳϳѳүѠʂWkƈ՜ާ۲߲v`YU`it}iggbbjjgjjrtgmUUUdz}}}iiiggggggbbbbbbjjjjjjgggjjjjjjrrrtttgggUUUޘF޻ނ.""""""""""""""""""""\5s""''++++..""8855}}}}++''FFcc""""FFkkxx]]==\\..}~{~``]]FFcc""""FFkkxx]]==\\..}}{~__\\FFcc""""FFkkxx]]==\\..}{``]]FFcc""""FFkkxx]]==\\..~}~{~__]]FFcc""222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttggg222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttggggggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjffiDDx''..55..22YWWYiiijjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjffiDDx''..55..22YWWYiiijjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjffiDDx''..55..22YWWYiiijjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjffkDD''..55..22uWW]iiijjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz@@@BBB@@@@@@@@@===888'''DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHH@@@BBB@@@@@@@@@===888'''DDDNNNNNNNNNNNNޘF޻ނ""ރ޻FޘʫgޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘgނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރF޻ނ"gg"ރ޻Fdznnn]]]8;8+2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++.+BBBNNNNNNPPPTTTnnncccGLQQGGޘFŻ޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲ŻFޘsn޻ނ"޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲"ރ޻snܳѳϳѳҲԡe;oNNkʈכԦڭvPNNNN]p|}ukjkccbibgmrvrkzWWbdz}}}uuukkkjjjkkkccccccbbbiiibbbgggmmmrrrvvvrrrkkkWWWޘF޻ނ"}|xwuws}\2s;;}uu""}}ҔkkNN55DD@@;;++vvjjBB88@@;;}22\\;;;;YY..88++{uvz}}}55++ggiiBB88@@;;}22\\;;;;YY..88++{vvz}||55++ggjjBB88@@;;}22\\;;;;YY..88++|vvz}~55++ggjjBB88@@;;}22\\;;;;YY..88++{uvz}||55++ggjjBB88@@222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttggg222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttggggggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjPPv''55JJJJJJJJ55''..LLZZ5588T```jjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjPPv''55JJJJJJJJ55''..LLZZ5588T```jjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjPPv''55JJJJJJJJ55''..LLZZ5588T```jjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjPP''55JJJJJJJJ55''..LLZZ5588k```jjjjjjjjjjjjjjjjjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzFFFJJJU\cT_j]rWcn===222===NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFJJJU\cT_j]rWcn===222===NNNNNNNNNNNNޘF޻ނ"tggggggggggggggggggggggggggggggggt"ރ޻FޘʫgޘF޻ނ."""""""""""""""""""""""""""""""".ރ޻Fޘgނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻FdzuuuWWWeeeDHDBHB@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@;B;+.+NNNNNNUUUNNNmmmccc;@D.B2F2D$1D;;BFD1ޘFŻޫtggggggggggggggggggggggggggggggggtޫŻFޘsn޻ނ"ޫtggggggggggggggggggggggggggggggggtޫ"ރ޻snٳѳѳҳԦrL|8g;NNkψҘՠۧYTNHFLNPgorjjgffcccboutxwnWZ~dzvvvrrrjjjjjjgggffffffcccccccccbbbooouuutttxxxwwwnnnWWWޘF޻ނ"tggggggggggggggge`_]ZWUTPNLJHHDFFNw]5s;;;;uuHHYYbbTT}}ZZ__22""55LL..첲uuHH++LL;;;;uuHH++BB==BBWWBBTTPPLL~{zxvuxUUHH++LL;;;;uuHH++BB==DDZZDDTTLLHHzxxvuuxWWHH++LL;;;;uuHH++BB==DDZZBBUUPPNN""~{xzwvzWWHH++LL;;;;uuHH++BB==BBTT;;LLHHHH{zxvuuzWWHH++LL222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttggg222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttggggggooorrrfffYYY===jjjjjjjjjjjjjjjggk55''TTeetjjjjjjjjjjjjjjjjjjjjjjjjeexTT''ZZzz22eUUYjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjggk55''TTeetjjjjjjjjjjjjjjjjjjjjjjjjeexTT''ZZzz22eUUYjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjggk55''TTeetjjjjjjjjjjjjjjjjjjjjjjjjeexTT''ZZzz22eUUYjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjggo55''TTeexjjjjjjjjjjjjjjjjjjjjjjjjee}TT''ZZzz22UU\jjjjjjjjjjjjjjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urfz@@@222===NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFNNNes`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gg"ރ޻FޘʫgޘF޻ނ""ރ޻Fޘgނ"gޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttccc}}}5s2F2F5H8J5H2F2D,?*9#0sFFHJHFD?90ޘFŻޫggޫŻFޘsn޻ނ"ޫggޫ"ރ޻snڳ׳ԯ{_YL8z;NNkֈ՘۟RPLF=5NPZcic_ZY\\\bcnruzzn}WWWdzvvvmmmiiiccc___ZZZYYY\\\\\\\\\bbbcccnnnrrruuuzzzzzznnnWWWޘF޻ނ"gλ̺ŴDs_5tLLLLooss88ccLLbb==""8888oo88JJpp쯯ȁJJ""PPLLLLooss88~;;ZZ..55PPggUU~}|xwux}""PPLLLLooss88~BBii2222@@PPFFxx}}zuusw|""PPLLLLooss88~BBii55;;WWkkWW|xwvz}""PPLLLLooss88~88NNo""p''@@__RR}|zvtsx}""PP222NNNeeepppcccgggmmmrrrppppppppppppppppppppppppjjj]]]HHH222eeetttggg222NNNeeepppcccgggmmmrrrppppppppppppppppppppppppjjj]]]HHH222eeetttggggggooorrrfffYYY===jjjjjjjjjjjjbbo""'']]~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj]]++}}oosNNWiiijjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjbbo""'']]~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj]]++}}oosNNWiiijjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjbbo""'']]~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj]]++}}oosNNWiiijjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjbbw""'']]jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj]]++}}ooNN`iiijjjjjjjjjgggooorrrfffYYY===ccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urfz@@@222'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''+++FFFNNNes`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻FޘʫgޘF޻ނ"tggggggggggggggggggggggggggggt"ރ޻Fޘgނ"gޘF޻ނ."""""""""""""""""""""""""""".ރ޻Fޘg"ރF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccmmmvvvxxxxxx~~~jjjRXRl#!EFHF2R;R@5b2D.B.@+='8+=.A,>):*!!22;;bDB@=8=A>:*ޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡgޫŻFޘsn޻ނ"ޫggޫ"ރ޻sn݇ge_YL8;NNkTNHB88NNT]b]WPNTY\_`kov~ruuYYYdz{{{pppfffbbb]]]WWWPPPNNNTTTYYY___bbbgggpppssszzz~~~rrrYYYޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘۗՑ΍ʋ…|tsong`\\]gFv_5vccgg]]NJѐ‚''DDNN88FF..BBYYLL55""..++@@ccggYYjj\\~vicgfm''w==x==rou""~55xtttsu}}@@ccggYYjj\\~++v\NJP`n""{55wrttsu}}@@ccggYYjj\\~++;;WWNN++;;}uvwtu}}@@ccggYYjj\\~|fPDF_++r55sx|''88vtttsu}}@@222NNNeeepppccckkkwwwpppppppppppppppppppppppppppooocccRRR222```tttggg222NNNeeepppccckkkwwwpppppppppppppppppppppppppppooocccRRR222```tttggggggooorrrfffYYY===jjjjjjjjjbbrJJjjjjjjjjjjjjjjjccfWWbHHeBBe@@cDD]NNY\\]fffjjjjjjjjjjjjJJbbߎzNNWjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjbbrJJjjjjjjjjjjjjjjjccfWWbHHeBBe@@cDD]NNY\\]fffjjjjjjjjjjjjJJbbߎzNNWjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjbbrJJjjjjjjjjjjjjjjjcciWWnHHxBB{@@zDDrNNf\\bfffjjjjjjjjjjjjJJbbߎzNNWjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjbbzJJjjjjjjjjjjjjjjjccfWWbHHeBBe@@cDD]NNY\\]fffjjjjjjjjjjjjJJbbNN`jjjjjjjjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNYckT`mZnWcn@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;===NNNYckT`mZnWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻FޘʫgޘF޻ނ"gg"ރ޻Fޘgނ"gޘF޻ނ""ރ޻Fޘg"ރF޻ނ"gޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރ޻FdzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}ccc777YYYTTTJJJfffsss B DFJNRUWU^FJLz.TF@;5~.k'D+;.@.B.B5H2F-@(9*zz..~kD;@BBHF@9*ޘFŻޫgޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘgޫŻFޘsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻snκ酫fge_YL8;NNkiULF@2BNNU``WNNNPTUUU]`rtwwYYYdz~~~ssspppiii```WWWNNNNNNNNNTTTYYYbbbcccjjjrrrvvvuuuYYYޘF޻ނ"gޘUFFFFFFFFFFFDB@==;5522.++++8fH}e8{..nnFFBBᦦƁυNN..@@BB;;RR88~~⥥\\敕gg""BB''..nnFFeeJJ88DD""@@''~fRFBDDDHHFHP""i88u88nrwuux}~|..nnFFeeJJ88DD""@@''Y8."L'H.8@@Jj;;uBBz;;mputtx}~|..nnFFeeJJ88DD""@@''""++|==TTRRDDttxvuz}~|..nnFFeeJJ88DD""@@''uHD+"L"D25@BTco..NN|HH{==noutux}~|222NNNeeepppfffpppppppppppppppppppppppppppppppppfffWWW888___tttggg222NNNeeepppfffpppppppppppppppppppppppppppppppppfffWWW888___tttggggggooorrrfffYYY===jjjjjjggn''ZZxjjjjjjjjjjjjUUm22""gDDU```jjjjjjjjjZZRRיsUUYjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjggn''ZZxjjjjjjjjjjjjUUm22""gDDU```jjjjjjjjjZZRRיsUUYjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjggn''ZZxjjjjjjjjjjjjUU}22""DDj```jjjjjjjjjZZRRיsUUYjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjggp''ZZjjjjjjjjjjjjUUm22""gDDU```jjjjjjjjjZZRR虙UU\jjjjjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNHHHFFFFFFDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘgނ"gޘF޻ނ"tggggggggggggggggggggggggt"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ."""""""""""""""""""""""".ރ޻Fޘg"ރ޻FdznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc2D2F3G5D->RTUOOOEEE~~~ukFHHJFDD>6!_Z]_+;#5DHJL8ZB`NFDBBDB=5.|2m;x2D.B+;"2_ZZ;D##88BB|mxDB;2ޘFŻޫgޘFFޘgޫŻFޘsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻snۺ公fge_WJ8;NNkUTJD;.HNPZ_]NNNNNNNNNNTi{zpttWWWdzwwwtttnnnggg]]]NNNNNNNNNNNNUUU\\\bbbgggkkkssszzzwwwZZZޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻ݺִϯ̬£}trrs}.gJf8{""텅;;88WW....LL坝˂ZZWW""""LLnnWW__x""..;;RR``''""__NN""\"+."."."."."."."."."+5@BTbgw55vv|++}x""..;;RR``''""__NN""{tW"L55}88~22t''\'B@@J_""cegw55vw}..}x""..;;RR``''""__NN""{x}~xopnmnk''g++fgk};;vu|++}x""..;;RR``''""__NN""D2s;;88..k""N.8@DR]e""f''bfgw55vw~""..}x222NNNeeepppiiiwwwppppppppppppppppppppppppppppppfffYYY===bbbtttggg222NNNeeepppiiiwwwppppppppppppppppppppppppppppppfffYYY===bbbtttggggggooorrrfffYYY===jjjjjj55bbtjjjjjjjjj]]o++++8888nHHTfffjjjjjjbbRR׎e```jjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjj55bbtjjjjjjjjj]]o++++8888nHHTfffjjjjjjbbRR׎e```jjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjj55bbtjjjjjjjjj]]z++++8888HHbfffjjjjjjbbRR׎e```jjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjj55bb|jjjjjjjjj]]o++++8888nHHTfffjjjjjjbbRR莎```jjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ލރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻Fޘgނ"gޘF޻ނ"gg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻FdzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmccclh>fe=2F5F5H8J5H2F2D,?+;#0!LLLYYYNNN&&&KKK""DD22wTDB@;8BDHPfwiT%;z.@2D1C)9FHJHHFFDFFFD@;8HD=5'f2z%%@DC9f2ޘFŻޫgޘFFޘgޫŻFޘsn޻ނ"ޫgsn޻ލރރރރރރރރރރރރރރރރރރރރރރލ޻sngޫ"ރ޻snۺݳfgc]TH@;NN`PPH@8.NNRYWNNNNNNNNNNNUfu{svvYYYdzxxxsssiiiZZZNNNNNNNNNNNNNNNZZZbbbeeesssxxx{{{ZZZޘF޻ނ"gޘF޻ލރރރރރރރރہ}xvpkcb\WPNNNWz.jLi8}zLLNNJJHH==""==NN==LL..==++FFZZ;;@@ێggz..JJFF22''__g@R5W5W2T2T.P.N+J+H+F'D'@5''@BUcp++ouDDWW;;z..JJFF22''__eeWW..m=8==;;55{++g""P'=@BJRYbn++nxDDYY==z..JJFF22''__eeWW..}|vof`b`W\]_ep++nvDDWW==z..JJFF22''__eeWWZ5r==BB==88~++g"F@BJPPLPZ`p++rzFF\\==222NNNeeepppjjjxxxrrrppppppppppppppppppppppppooofffYYY===jjjtttggg222NNNeeepppjjjxxxrrrppppppppppppppppppppppppooofffYYY===jjjtttgggjjjuuuiii\\\DDDjjjTTZZtjjjjjjjjjLL}..BBJJJJBB..22``ff22TbbbjjjjjjZZbboo88Tiiijjjuuuiii\\\DDDjjjuuuiii\\\DDDjjjTTZZtjjjjjjjjjLL}..BBJJJJBB..22``ff22TbbbjjjjjjZZbboo88Tiiijjjuuuiii\\\DDDjjjuuuiii\\\DDDjjjTTZZtjjjjjjjjjLL..BBJJJJBB..22``ff22nbbbjjjjjjZZbboo88Tiiijjjuuuiii\\\DDDjjjuuuiii\\\DDDjjjTTZZjjjjjjjjjLL}..BBJJJJBB..22``ff22TbbbjjjjjjZZbboo88kiiijjjuuuiii\\\DDDccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urgzFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ."""""""""""""""""""".ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"tggggggggggggggggggggt"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttcccκҽȵ"LLvr@Z\@2D.B.@+='8.@.B,>7AJFJP ;;__wg5=BBDHD=#@B8~2F2F0D!/BDFFDDFHHJHD@;DD@8+~FFD/ޘFŻޫgޘFŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ."""""""""""""""""""".ރ޻sngޫ"ރ޻sn޺ܳ߳兲fc]Z`bR=NLNLH=28NNNRNNNNNNHB8.HNPerwvz{ZZZdz{{{uuujjj\\\NNNNNNNNNNNNNNNRRRcccjjjrrrzzz~~~]]]ޘF޻ނ"gޘF޻ނ."""""""""R}.kNj8TTUUUUPP椤..;;''55LLNN᧧TT栠cc;;22mm55""'']c=e@j@i=e;b8]5Y2T.N+J+F'D"=58@DT_fp2222''==;;""''jj{{]]BB|''L'88==8822t++b""UH@@@@DR_fr2222''==;;""''jj{{]]BB==""{skb\TLJFFFT\fo2222''==;;""''__nnTTBBFFDD==55{++e""L;@BB@@BFP_gs2222''==;;222NNNeeepppkkksss̒ppppppppppppppppppppppppmmmcccUUUHHHoootttggg222NNNeeepppkkksss̒ppppppppppppppppppppppppmmmcccUUUHHHoootttgggjjjrrruuujjj\\\UUUggnHH}jjjjjjjjjBBJJeesjjjjjjjjjjjjjjjjjjeexJJBBԒLL++\bbbjjjjjjJJ}}22WWYjjjrrruuujjj\\\UUUjjjrrruuujjj\\\UUUggnHH}jjjjjjjjjBBJJeesjjjjjjjjjjjjjjjjjjeexJJBBԒLL++\bbbjjjjjjJJ}}22WWYjjjrrruuujjj\\\UUUjjjrrruuujjj\\\UUUggnHH}jjjjjjjjjBBJJeewjjjjjjjjjjjjjjjjjjee}JJBB撒LL++{bbbjjjjjjJJ}}22WWYjjjrrruuujjj\\\UUUjjjrrruuujjj\\\UUUggrHHjjjjjjjjjBBJJeesjjjjjjjjjjjjjjjjjjeexJJBBԒLL++\bbbjjjjjjJJ}}22WW]jjjrrruuujjj\\\UUUccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urgzFFFFFFFFFFFFFFFFFFFFFBBB;;;555222222222222222222222222888===DDDFFFFFFFFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ލރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFUޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccŴNм"~κ"Ǵ"'v+b\+282+;.@.B.B5H2D->(7';;..vumB@8+DHHD5b2F2D/@!CDFHJNHe'ND@BB@8+z7bFD@!!HH''z7ޘFŻޫgޘFŻ޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲ŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲"ރ޻sngޫ"ރ޻snݳݳ```z{sWBHJHB8.BNNNNNNHB5++..5=NRensuzzYYYdzvvvmmm]]]NNNNNNNNNNNNNNNJJJTTTiiiooouuu]]]ޘF޻ނ"gޘF޻ނ"}vkgggmU2oPn=ʊ˹NNttPPLL==88FFTT''55YYee88""HHooHH;;||ӃWWUUxRgDrFtDsBm=f8_5Y.L+H'D'B'@";5+'@@DR]go++""==WWWWUUttzz;;25;;.""T..n..o++g''YJF@@@@@HNYeo++""==WWWWUUttzz;;BBccgg''~rfb\PFB@@@HU_gp++""==WWWWUU|RRPPu''DDFFBB;;22r''\J8+88@@@@@HW`ks++""==YYWWUU222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttggg222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttgggjjjjjjjjjccc___jjjJJ""iiijjjjjjNN55eepjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjeex88bb22Tfffjjjjjj++zz22Yiiijjjjjjccc___jjjjjjjjjjjjccc___jjjJJ""iiijjjjjjNN55eepjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjeex88bb22Tfffjjjjjj++zz22Yiiijjjjjjccc___jjjjjjjjjjjjccc___jjjJJ""iiijjjjjjNN55eeujjjjjjjjjjjjjjjjjjjjjjjjjjjjjjee~88ьbb22nfffjjjjjj++zz22Yiiijjjjjjccc___jjjjjjjjjjjjccc___jjjJJ""iiijjjjjjNN55eepjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjeex88bb22Tfffjjjjjj++zz22uiiijjjjjjccc___jjjccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@'gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNYckT`mZnYcnFFFFFFFFFFFFFFFDDDPB5rLUZ\\\\\ZWwP`@;."...@@@FFFFFFFFFFFFYbkT`mZnWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"tggggggggggggggggt"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ."""""""""""""""".ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރ޻FdzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}cccǴӿ52ѽ̸dzı{r'fc8jg@2D.@+;".RHHL|뉗"F2T2D.B FZJJ_u慕JB@B=5'o||牉""TDBFF__oޘFŻޫgޘFŻޫtggggggggggggggggtޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫtggggggggggggggggtޫ"ރ޻sngޫ"ރ޻sn߳߳gJF.BH{bL@FD;2+HNNHB8+++x"`+5=@LR_mvruvWW]dzgggxxxppp555zzzpppcccUUURRRPPPPPPNNNNNN===```rrr___ޘF޻ނ"gޘF޻ނ"tgggggc`]WRLHB===FgZ5zTo¤@͌ͺ""''..++DD傂ۛLL88LL==WW55``RRDDTT@@nn""""88~F8]FvHxFu@j;b2U+J"=552222"+@@@NU_ir''LLTTDD@@nn""""88~''D'5+=+@"=DJHFFF=@@@@@BJZfs''LLTTDD@@nn""""88~''22cc__55{pjeUJB@@@@BLW`jr''LLTTDD@@nn""""88~jUJHH+DDBB==55x''_J2'@@@@@HUYfkw''LLUUDD@@nn222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttggg222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttgggjjjjjjjjjjjjjjjggnYYmjjjjjj]]xBBjjjjjjjjjjjjccfRReDDf@@bHHYYY\gggjjjjjjjjjBBLLHHTjjjjjj]]ZZ55\\]jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggnYYmjjjjjj]]xBBjjjjjjjjjjjjcciRRsDD|@@xHHiYY_gggjjjjjjjjjBBLLHHTjjjjjj]]ZZ55\\]jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggnYYmjjjjjj]]BBjjjjjjjjjjjjccfRReDDf@@bHHYYY\gggjjjjjjjjjBBŌLLHHbjjjjjj]]ZZ55\\]jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggpYYwjjjjjj]]xBBjjjjjjjjjjjjccfRReDDf@@bHHYYY\gggjjjjjjjjjBBLLHHTjjjjjj]]ZZ55\\`jjjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFFFFZ+txzzzxxxxxwup`T8...DDDFFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ލރރރރރރރރރރރރރރލ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻FdznnnFLFJPJFLFFLFFLFFLFFLFbebbebFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc""AAZqpZ""ZAAqpZ"AZZqqppZZ""AZAqpZƴ"κҾԿҾм̸Ǵðκ͸ȵ¯ʷ¯\U%#8822fHJFe߽~H;.B.@*<%3HJ2Yf{D@B=5!fFF~~B@<322fffޘFŻޫgޘFŻޫggޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻snޙzZ@'Yp."].++@.'++r+Z+].i;Z.wBDJR_oxruvYYYdzBBBTTTiii@@@"""@@@PPPPPPNNNNNNWWW888ZZZ___ޘF޻ނ"gޘF޻ނ"gǷF|wƴ_k\FWcTx|o{=i_8{Wrȩ@͌ͺ''==FF镕||LL++PP..88BB㕕""FF55BBJJTT==wuB5ZHwHxDr;c2U'D"5.222222"+@@BNTW`jp{UUjj55BBJJTT==+;+='8'2.+8BFF2.2""+"++'8@BR`nt{WWjj55BBJJTT==wtv""};;~22nki`""PB@@@@@@PY]fmtzWWjj55BBJJTT==\2+"."+2"8D@@==.2k"'L"2=@@@@HYYcfot{WWkk222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttggg222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttgggjjjjjjjjjjjjjjjWW""jjjjjjjjj..55jjjjjjjjjffk==++_WWYiiijjjjjj88n```jjjjjj''ZZ@@UjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWW""jjjjjjjjj..55jjjjjjjjjffn==++}WW\iiijjjjjj88n```jjjjjj''ZZ@@UjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWW""jjjjjjjjj..55jjjjjjjjjffk==++_WWYiiijjjjjj88ђ```jjjjjj''ZZ@@UjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWW""jjjjjjjjj..55jjjjjjjjjffk==++_WWYiiijjjjjj88n```jjjjjj''ZZ@@ijjjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;++U............555;;;==_gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;U++............555;;;_==gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;+UU............555;;;=__gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;+U+............555;;;=_=gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFiR=~āÁÀ€~}{u`;."===FFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"tggggggggggggt"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ."""""""""""".ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻FdzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmccc,,((/,,/((,(//,,(/(TTTNǴȵȴŲIJκҾҾѽ˸ðɶti0+??''88DD\HJN2YJFB2m.@2D0B'JHLتFBB;2 \22m@DB''\ޘFŻޫgޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޡgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻sn'''"""Rbbr5"""'''"';"L's"pYPzBn=@L+Hx+Lr+U2b.]8oD@HPcpmkppYYYdz'''"""FFFppp"""+++===555___TTT...222+++222NNNNNNPPPeee```'''___ޘF޻ނ"gޘF޻ނ"gʖtFFFFPc@pzzu|s5N.FFFF\gH{=p`8}Yuͭ@͌ͺffww@@++PPJJ88jjcczzkk@@''DD;;FF""LL''UU==NNeessBB''''xcYD+JHzJ{@k2J';.5".+"++.2222"@@@FNY_jrt{88""''UU==NNeessBB''''|~N5p'2b+8'2".'++2"'"+;522255''@Jbpvtx88""''UU==NNeessBB''''|xocY\\`W"'FH@FF8@@@@@@R\birstx88""''UU==NNeessBB''''P'@2U2T.P.N'@;'._'2F+.'2"28"."+'.+8@@@@BNZ]fipvuz88""222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttggg222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttgggjjjjjjjjjjjjjjj==LLnjjjjjjWWccjjjjjjjbbs''FFBBwLLUiiijjjeexBBffDDUjjjjjjTTLL""igggjjjjjjjjjjjjjjjjjjjjjjjjjjj==LLnjjjjjjWWccjjjjjjjbbz''FFBBLL`iiijjjeexBBffDDUjjjjjjTTLL""igggjjjjjjjjjjjjjjjjjjjjjjjjjjj==LLnjjjjjjWWccpjjjjjjbbs''FFBBwLLUiiijjjee~BBffDDjjjjjjjTTLL""igggjjjjjjjjjjjjjjjjjjjjjjjjjjj==LLjjjjjjWWccjjjjjjjbbs''FFBBwLLUiiijjjeexBBffDDUjjjjjjTTLL""gggjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;'............555@@@5gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urgzFFFFFFFFFFFFm'ʅɄȃǂłłŁŁŁŁŁÁ€~{p`@888FFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ލރރރރރރރރރރލ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttccc..JJ22`((/..JJ22`/((.J2``(//..JJ22`(/(;¯˸Ҿ'L̸¯k`GOG0G0(`(''''RRQ"JHJJHFD+P=.Z2D2D.?FJ]t㰼"LB@;.Q""++ZDD?]]""QޘFŻޫgޘFŻޫgޘUFFFFFFFFFFUޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻sngޫ"ރ޻sn""";bk""""7L.Uk.;D'''"5B"U.W+gF@+c'Db.U5e5b'5H=8NTbgnnrsYYYdz"""xxxRRR"""&&&;;;222'''"""222...'''LLL\\\nnnfff+++___ޘF޻ނ"gޘF޻ނ"ggueB'@+@+@+;258'@D'=@58;2@+@+@+B'BT@Bxf;…ò\zЯBЏнTT셅לLL5555NNLL""JJ++""NN==UU22""""BBٜLLNNss__gg++iijj55DDZZ==""cH=25Dr2R5J.2"88+8+28"'5"'2"2"++'52.=@@@BN]nz|t~++iijj55DDZZ==++""8@|;H+;B+.B"+8"''.28""'222"="=55Ljw~{t++iijj55DDZZ==++""iLDJHNP5@8;L'8@.5+5@D+5F5@@=@@FZ`jrz}{t++iijj55DDZZ@L=e@i=g;c;b5Y.H"8F+2=8B.5'58'8.5"'.';@@@BNU""`fru{~|t222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttggg222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttgggjjjjjjjjjjjjjjj``ejjjjjj==FFvjjjjjjggn..JJJJ..ZZwWWYjjjjjjJJ``""gfffjjjeex....___jjjjjjjjjjjjjjjjjjjjjjjjjjj``ejjjjjj==FFvjjjjjjggp..JJJJ..ZZWW\jjjjjjJJ``""gfffjjjeex....___jjjjjjjjjjjjjjjjjjjjjjjjjjj``ejjjjjj==FFjjjjjjggn..JJJJ..ZZwWWYjjjjjjJJ``""fffjjjeex....___jjjjjjjjjjjjjjjjjjjjjjjjjjj``jjjjjjj==FFvjjjjjjggn..JJJJ..ZZwWWYjjjjjjJJ``""gfffjjjee}....___jjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............888==='gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNesbsrgzFFFFFFFFFFFFx·ˆʅȄǃǃǃǃǃǂǂƂŁ€}uwP222FFFFFFFFFcr`upfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"tggggggggt"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ."""""""".ރ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~ccc!!{{ꊊ!!{{䊊!{!!{{3?>>≯{tȵ<B\AFHHF]sNgD52P2D2D+;BH'Rx"LB@8+A]]NNPDD;''xx""AޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻sngޫ"ރ޻sn@PU5DP"""'''+++""""""'''"+.U{8v"@U"TrJNUUWsvpuuYZ`dzFFFFFF"""'''+++""""""'''"""\\\sss@@@===___ޘF޻ނ"gޘF޻ނ"."DFR82P.;F"2F+55+52+5@+5D2='@+.FBrj=ÆǴ]"{ѰBѐѾBB]]LL++FFYY22""ZZ22YYLLLL쭭..NNBBWW225555vv++jjiivv``JJ;;ZZDHH'U''Y""T""T'']'+Z".=""='5B5H'2F'8B+.D"8=2='+2".';FFFH'=@@Tp``JJ;;ZZHH''BBHHk{@@H5n2@R2;@+2;+2;55J.2+5"+8'+222"='D"="+Lo``JJ;;ZZHH''@@88'+;'+F""82=P'@L";F"=F'2B5@+;F+5J"5=";8JWZjp}``JJ;;ZZcFcDrFtDrBoBn=c2L+=N'2=+2D'2B"5@".@"=@"'...55;HU""c++n;;s++u{222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttggg222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttgggjjjjjjjjjjjjbbziiijjjggnbbfjjjjjjBB]]zjjjjjjjjjjjj]]JJՎ++_gggjjjeex2288\\]jjjjjj''55TT\jjjjjjjjjjjjjjjjjjjjjjjjbbziiijjjggnbbfjjjjjjBB]]jjjjjjjjjjjj]]JJ玎++}gggjjjeex2288\\]jjjjjj''55TT\jjjjjjjjjjjjjjjjjjjjjjjjbbziiijjjggpbbmjjjjjjBB]]zjjjjjjjjjjjj]]JJՎ++_gggjjjee}2288\\bjjjjjj''55TT\jjjjjjjjjjjjjjjjjjjjjjjjbbiiijjjggnbbfjjjjjjBB]]zjjjjjjjjjjjj]]JJՎ++_gggjjjeex2288\\]jjjjjj''55TTfjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNYckU]gZnYcnFFFFFFFFFFFFłω͈ˆɄȄȃȃȃȃȃǃǃƂÁ~wW222DDDFFFFFFYbkT`mZk{Wcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ލރރރރރރލ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘUFFFFFFUޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻FdzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFkokkokFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}ccci""vv䊊i""vv䊊ii"vi""vvBEB.@.B/@$]]]xxxмY@¯WNrDFJoHHNNv5RDHPڭ+PB=5u2D2F1E#0@FH=\HB=8'v55++uDFE0==vޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ލރރރރރރލ޻sngޫ"ރ޻sngޫ"ރ޻snHcc"28p8i"""'''+++'''...++++++"""''''''''''''""";H.Z"TbURPZf||t{ZbwdzHHH555"""'''+++'''...++++++"""''''''''''''"""]]]{{{'''@@@___ޘF޻ނ"gޘF޻ނ""'"."@F=2""H5D\=L`+5@';B2=N+5L"F85F;|rȩ@͌μc"{ѰBѐѾPP@@鬬ssNNLL==YYffzz锔BBTT쩩==''beU=p888855}55}88~2BU+;D2=N2=@.DP'BJ2DN+2J'2F2;';8'."'.FFJ""U""P'B@Hm++``22''ccPP``{{iif5DP~+=J2BJ.@L2;F'5H"5=+5B+58+5"'+22'B+F'D".Jp..__55''ccPPHHvHJ"2'5.D+5D'FH'@H+=F"@H'=J";D"8B"5@2;".8"+28@DH\jz++__22''cc]LkFvHxFvFtDs@c2=H2@H2HJ2LW+=="@D'BL".B+;@"2;+5HFDT]k++u==rz""++..bb22222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttggg222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttgggjjjjjjjjjjjjZZ..xjjjjjj]]""jjjjjjggo\\pjjjjjjjjjjjjjjjjjj]]ZZBBYY\jjjjjj..88NNYjjjjjj55..JJZjjjjjjjjjjjjjjjjjjjjjjjjZZ..xjjjjjj]]""jjjjjjggr\\{jjjjjjjjjjjjjjjjjj]]ZZBBYY_jjjjjj..88NNYjjjjjj55..JJZjjjjjjjjjjjjjjjjjjjjjjjjZZ..xjjjjjj]]""jjjjjjggo\\pjjjjjjjjjjjjjjjjjj]]ZZBBYY\jjjjjj..88NNfjjjjjj55..JJZjjjjjjjjjjjjjjjjjjjjjjjjZZ..jjjjjj]]""jjjjjjggo\\pjjjjjjjjjjjjjjjjjj]]ZZBBYY\jjjjjj..88NNYjjjjjj55..JJjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;++U.........55588\gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;U++.........555\88gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;+UU.........5558\\gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;+U+.........5558\8gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFȄыϊ"ˆʅɄȄȄȄȄȃȃǃǂŁxZ222DDDFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ."""".ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޡg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"tggggt"ރ޻Fޘg"ރ޻Fޘg"ރ޻FdznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc)""{{22Z)""{{22Z))"{2ZZ)""{{22Z'5BB2F2F->YYYYYYZZZڂƲw55UFFL]iXBiimr~JJ2YwD@=B8v2D.B#25K@FHJFB=5"mrr22wwvDB#K22mޘFŻޫgޘFŻޫgޘFŻŻŻŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ."""".ރ޻sngޫ"ރ޻sngޫ"ރ޻snc;Y'''"""+Fo;`'''+++......++++++...+++...+++''''''""""""@.HHTbnuˁDŽ{\mdz'''"""ggg'''+++......++++++...+++...+++''''''""""""\\\LLL```ޘF޻ނ""B=uF.t""".."5'8+@+.D"';FYpNe|.FW"=D"5D'8D2@L.;N'85"'p+"i"2Hs@;"{ѰBѐѾ@@..@@++""FFbb""DDJJoooo||xx""NN++{|m.g@@BBBB@@@@;@'=J+HL.;J2BP;DU+8D+DL"5D2;R'5@'=D"'5'."'BF''Z++e++g''\.8Ho""jjPP55PP++{|++++\\~~iiz=@{H\;N\'@L"8F'FH2=J.;L.;H28F"5=.@+++25'D+J+F".Hk""jjPP55PP++{|++++sT".=2'@+=8L.5@2=J5BJ5@L28R.;P2BT'=P"2D+;@"+2"+."'8+;@@DYo""eePP55PP++{|++R@cFvHxFvFtDs";T.=U'=L'@H.@J5JP2DN'=L"@B.8@'5="8DB'5DW_bju''22""iiPP55PP++222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eee222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eeejjjjjjjjjjjjNN;;jjjjjjjTT55pjjjjjjZZ''jjjjjjjjjjjjjjjjjjjjjjjj..FFHHYjjjjjjBB++DD]jjjjjjJJ''BB`jjjjjjjjjjjjjjjjjjjjjjjjNN;;jjjjjjjTT55pjjjjjjZZ''jjjjjjjjjjjjjjjjjjjjjjjj..FFHHijjjjjjBB++DD]jjjjjjJJ''BB`jjjjjjjjjjjjjjjjjjjjjjjjNN;;jjjjjjjTT55jjjjjjZZ''jjjjjjjjjjjjjjjjjjjjjjjj..FFHHYjjjjjjBB++DDrjjjjjjJJ''BB`jjjjjjjjjjjjjjjjjjjjjjjjNN;;jjjjjjTT55pjjjjjjZZ''jjjjjjjjjjjjjjjjjjjjjjjj..FFHHYjjjjjjBB++DD]jjjjjjJJ''BBwjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;'.........222+gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNU]eU]f]rYcnFFFFFFFFFFFFʄҌ"ϋ'̇ʅɄȄȄȄȄȄȃȃǂŁx\222DDDFFFFFFT\cT`k\oWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻ލރރލ޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޘUFFUޘg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘg"ރ޻FdzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFbebFLFbebbebFLFFLFbebFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccNJJpNJJpNNJppNJJpIJ͹ȴ52F2F5FFLRNNN³Tκȵ{o7122YYFDD5f]]WWbZkHJcz在JBBFF=2Z+='5"'BFHHDB=2!bZZccZ=5'bޘFŻޫgޘFŻޫgޘFŻ޲ޫޫ޲ŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"޲ޫޫ޲"ރ޻sngޫ"ރ޻sngޫ"ރ޻sn_Wx''''''...+++'''+++...++++++''''''...+++'''++++zis{폼؃]xdz''''''...+++'''+++...++++++''''''...+++'''+++```ޘF޻ނ'"@'\""LFFFFFFF'B+=2B"2D;;;LY"=L'BN;Ug+5F5@+BL.;L+5B+2"2H""T..k55z55}++f""RF8D"|ѰBѐѾ88ee++eeLL֛''""bbgg55++ZZHHՈbbcc..BBPPNN''DDJJ88N=FFFFFFDDDD5D{'BL'@L.@H.FR5BR.=N+L`2DR'BN+@F';;"+="+5"+;H++g22v55{22s'FW{FF55''DDPPbb88;;@@YZJUj'FT+BP'@T"@P';F.5H+8H+5D";B+='2"+2"8+H.N+H".Ff~DD55''DDPPbb88ZB+'Z''\''Y+L5B+@NBJ+HJ+8N'BD5@N+8H2=L'=P'DF+;F"+2"'."."2JJ"F.8@FfBB55''DDPPbb88H;`FvHxFvFtFp+=P2;L.DJ8Jb;D_+DR2FU2@N2@L25N'@H5@+8F;Zciow{DD55''DDPPbb...222222222222222222222222222222222222222222222222222222222222222222BBB...222222222222222222222222222222222222222222222222222222222222222222BBBjjjjjjjjjjjjNN==fjjjjjjNN==fjjjjjjNN==ijjjjjjjjjjjjjjjjjjjjjjjjJJ''@@bjjjjjjJJ@@cjjjjjjJJ@@cjjjjjjjjjjjjjjjjjjjjjjjjNN==fjjjjjjNN==fjjjjjjNN==jjjjjjjjjjjjjjjjjjjjjjjjJJ''@@xjjjjjjJJ@@cjjjjjjJJ@@cjjjjjjjjjjjjjjjjjjjjjjjjNN==fjjjjjjNN==jjjjjjNN==ijjjjjjjjjjjjjjjjjjjjjjjjJJ''@@bjjjjjjJJ@@zjjjjjjJJ@@cjjjjjjjjjjjjjjjjjjjjjjjjNN==~jjjjjjNN==fjjjjjjNN==ijjjjjjjjjjjjjjjjjjjjjjjjJJ''@@bjjjjjjJJ@@cjjjjjjJJ@@zjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNescrrgzFFFFFFFFFFFFʄҍ"Ћ'̇ʅɄȄȄȄȄȄȄȃǃŁx\222DDDFFFFFFcr`uofz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ"tt"ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻ނ..ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޘFFޘg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"gޠޡg"ރ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttccc.......ƳӿfοUig=2D2D-@(ȴҾ@mɶrf++''}BB>%%++22Y"JHN|5WDDFDB=2z!76LDFHHD@;2Y""||55z766YޘFŻޫgޘFŻޫgޘFŻޫttޫŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"ޫttޫ"ރ޻sngޫ"ރ޻sngޫ"ރ޻sn__2;@"""'''+++''+''+'''222...+++.........+++++++++'''''''''""""""'@_.r\퉤`¬dzJJJ"""'''+++'''''''''222...+++.........+++++++++'''''''''""""""DDDbbbޘF޻ނ2W++`2=ZFYs5@\'+NJFFF"'W.B5F25@5LN"@L8JU+DN'BN"=L8HY"8B"5=+2;+;"+"B""U22u==BBBD5;k2@Y2=T"F'5~ԲBҐºpp__NNee䢢....55LL++bbttNN@@LL==觧YYUUppDD..R=JJJJHHHHHH+@c.@B+8==;TBWs5BT.8H+@N5@N+=J.@J"@D"8D'58"+5"2J22r88==88~.Jp55UUZZZZppDD..o"'.HW.=R+DT;L`BPfBJb2HZ"BR+BJ.BJ"2;'+2+.'@.N2T.L".Fe}55UUZZZZppDD..b"R88;;8888~55z2F"8L"=N2DY5Rb+BR.;H;HZ@D\'@J2@J.8B'2='.;"."H''\++c..i""N25De55UUZZZZppDD..D;`FvHxFvFtDn+=W2@P55P;F_;Rf@Ug=HYBTi+5D2@U';F"=H"2;@cgnt{55UUZZZZBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeejjjjjjjjjjjjNN;;cjjjjjjNN;;cjjjjjjNN""88bjjjjjjjjjjjjjjjjjjjjjjjjJJDDfjjjjjjJJBBejjjjjjJJ@@ejjjjjjjjjjjjjjjjjjjjjjjjNN;;cjjjjjjNN;;cjjjjjjNN""88{jjjjjjjjjjjjjjjjjjjjjjjjJJDD|jjjjjjJJBBejjjjjjJJ@@ejjjjjjjjjjjjjjjjjjjjjjjjNN;;cjjjjjjNN;;|jjjjjjNN""88bjjjjjjjjjjjjjjjjjjjjjjjjJJDDfjjjjjjJJBB{jjjjjjJJ@@ejjjjjjjjjjjjjjjjjjjjjjjjNN;;|jjjjjjNN;;cjjjjjjNN""88bjjjjjjjjjjjjjjjjjjjjjjjjJJDDfjjjjjjJJBBejjjjjjJJ@@{jjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNescrrgzFFFFFFFFFFFFʄҍ"Ћ'̇ʅɄȄȄȄȄȄȄȃǃŁx\222DDDFFFFFFcr`uofz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ"tt"ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻ނ..ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޘFFޘg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"gޠޠg"ރ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFuxu~~FLFFLFuxuuxuuxuFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccww''ww''w'ww''Ŵ5Ҿmj"JN@.B.@(9aaa¯κҾ;ȴg];;++jj@@\@@@~""@@==%V%HJLg;ZDDDD@;2!+Z*HDFHHD@;.MLL;;Z!!**MޘFŻޫgޘFŻޫgޘFŻޫttޫŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"ޫttޫ"ރ޻sngޫ"ރ޻sngޫ"ރ޻sn__Jcn+++222222.....8..5222++++++.........++++++...++++++'''"""""""""''''''"""HxD~5cdz+++222222.........222++++++.........++++++...++++++'''"""""""""''''''"""cccޘF޻ނ8e58rRgRg@Ne=Fm++g''ZJ""L..o"8Z'8F+=F5@L5FL=FR5D].;N=Pc"@P"2F+=D+28'2;'2+J++g;;FFFFRZP`FZr;L_+5L'5ضDٕŹ""''22RR@@""NN++__88zzooNN""..JJNNLLDDPP++JJLLPP""LL==n.iHHJJHHHHDF5J.=N5=L5@N8BP@P`5JY;=T@Pc2=L'8H'DN'8L2@++D..n====55|\5==iiLLPP""LL==c...DP@]r;Re8F\=L_FYn=HZ@Tg';L.;P+.D".="2"8.L5W5Y.N".Fbx==iiLLPP""LL==U5zDDDDBB@@@@5=b.DP2DJ.HU8Wc2HT.DR;BR+BN.5H.=N'5J52F'28"...'']22s55{88..n+@Jk==iiLLPP""LL==F;`FvHxFvFtFi+DZ8@J.DP;R_+JT8Rf2FW=@W=J]2@R'@N'2B2;Lkrw{==ii222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppggg222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppgggjjjjjjjjjjjjNN""55cjjjjjjTT''..fjjjjjjZZ;;neeejjjjjjjjjjjjjjjjjjjjj..RRejjjjjjBBHHejjjjjjJJFFfjjjjjjjjjjjjjjjjjjjjjjjjNN""55cjjjjjjTT''..fjjjjjjZZ;;eeejjjjjjjjjjjjjjjjjjjjj..RRsjjjjjjBBHHejjjjjjJJFFfjjjjjjjjjjjjjjjjjjjjjjjjNN""55cjjjjjjTT''..jjjjjjZZ;;neeejjjjjjjjjjjjjjjjjjjjj..RRejjjjjjBBHHxjjjjjjJJFFfjjjjjjjjjjjjjjjjjjjjjjjjNN""55|jjjjjjTT''..fjjjjjjZZ;;neeejjjjjjjjjjjjjjjjjjjjj..RRejjjjjjBBHHejjjjjjJJFF|jjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNYckU]gZnYcnFFFFFFFFFFFFʅҍ'Ќ'̇ʅɄɄȄȄȄȄȄȃǃŁx\222DDDFFFFFFYbkT`mZk{Wcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻ލނނލ޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޘUFFUޘg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘg"ރ޻FdzFLFJPJFLFFLFFLFFLFFLFuxuuxuuxuuxuFLFFLFuxuuxuuxuuxuFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}cccFF,,FF,,F,FF,,ʶ=Pмȴ+2==+=2D {{{:::Ǵ"ϻ5Fɶ^V55NDDNee..H[FH+R.TDFDB=8*x"FDFHFD@8+}HH++..x""}ޘFŻޫgޘFŻޫgޘFŻ޲ޫޫ޲ŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"޲ޫޫ޲"ރ޻sngޫ"ރ޻sngޫ"ރ޻sn׺x_Tt...55555522222522;222......+++......222...222+++++++++'''""""""'''+++++++++'''WZ.ec󬬬dz...555555222222222222......+++......222...222+++++++++'''""""""'''+++++++++'''cccޘF޻ނ'5WTYrYp\k@D55|22p++c..i;;8@~"=R"@H+HN'8P'DH=FY=L`2=P+@T'DH+;F'+8+.;".""D++b55x@@HHHHHHYjUjBTiD=N"܁ܺDܗBBRRݟۡ""RRcc55zzWW22@@LL֚++NNRR22kkuu..88PP==..r2pLBDDDD.=v=L5BT5;P=HY2BP=]g'BT@L`8H\.;F'HJ'5L"588@'5'2"=""U88@8_"L''kkuu..88PP==..f".Uf'DR'BL5;T@LZ@L]2FU2LZ5;U.@T";@"."2+F5Y;`8]2R".Ffu''kkuu..88PP==..];HHHHFFFFFF@F2DT2BN+;N.DH=T`;R`H\p.J].;L2=L+;H'8=.;+2'H55w;;====88.H_t''kkuu..88PP==..J;`FvHxFvFtDr.FU.BT.=U.HT8BP2@R.8J.FR'BU'@T+=J8D58DW"w''222NNNtttggg222NNNtttgggjjjjjjjjjjjjZZ++''miiijjj]]22teeejjjggr..RRDDPiiijjjjjjjjjjjjjjj]]zccfjjjjjj..WWbjjjjjj55PP`jjjjjjjjjjjjjjjjjjjjjjjjZZ++''miiijjj]]22teeejjjggt..RRDD_iiijjjjjjjjjjjjjjj]]ccijjjjjj..WWbjjjjjj55PP`jjjjjjjjjjjjjjjjjjjjjjjjZZ++''miiijjj]]22eeejjjggr..RRDDPiiijjjjjjjjjjjjjjj]]zccfjjjjjj..WWnjjjjjj55PP`jjjjjjjjjjjjjjjjjjjjjjjjZZ++''iiijjj]]22teeejjjggr..RRDDPiiijjjjjjjjjjjjjjj]]zccfjjjjjj..WWbjjjjjj55PPpjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;..D....................Dgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;D....................D..gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;.DD...................DDgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;.D....................D.gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFʅԏ+э.͈˅ʅɄɄȄȄȄȄȃǃłz\222FFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ."""".ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޠg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"tggggt"ރ޻Fޘg"ރ޻Fޘg"ރ޻FdznnnFLFJPJFLFFLFFLFFLFFLFUYUUYUFLFFLF~~FLFFLF~~FLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc55PPFFf)q55PPFFf)q5PFff))qq55PPFFf)q˷ӿҾ͹Ų{s+.B2D1C#2NNNYYY]]]uuuų5&hb5;;ۆbbBDFoDFJLDDB@;2(.Q@FFHFB=5's 0Q((s0ޘFŻޫgޘFŻޫgޘFŻŻŻŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ."""".ރ޻sngޫ"ރ޻sngޫ"ރ޻snmxe555555555555555555...222...222+++...+++......++++++"""'''"""+++...222...+++;Tj]ZNuܱc欬dzmmm555555555555555555...222...222+++...+++......++++++"""'''"""+++...222...+++gggcccޘF޻ނ"+=kfHW==;;55|55{55{FFBF+@J+;N5Hb5Pb+DRHTeBRg==W.HU.@L.8B.2@'.;'.5"+N55w;;BBFFFFBBRTg8FW8D"ރ޻FޘJJ++NN22xxff@@++""LLNN""55vvLL==@@JJww..''WWWW;;JJ++22=~']8Z5J.=J8HR8BJ2FN';N'BU=Pc2@T28P5BL2BH28F"'2".'8+@;+L'}''''}{''WWWW;;JJ++22s8@uWsPo;N\=JY+JL'=L2DN2FP8JY+HT';F"+=';5Y;c@i;b2T".Lt}{''WWWW;;JJt=|JJJJHHHHHHDH'FP'FP8=R@Zj=Rb5BY8Pe.HR5BP5;L.@L'8D"8;+..2m==BBDDBB;;ND}{''WWWW;;JJ++N;`FvHxFvFtDs'BY.JN;N@ZmBNc5BT5DW;HU'JL"5H'@H2DPN.;_v""DD++++''}{222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttggg222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttgggjjjjjjjjjjjjbb~++|cccjjjggp==UUZjjjjjjBBDDPeeejjjjjjjjj\\p==jjjjjjeesccfjjjjjj''ZZbjjjjjjjjjjjjjjjjjjjjjjjjbb~++|cccjjjggp==UUZjjjjjjBBÊDD_eeejjjjjjjjj\\{==jjjjjjeesccfjjjjjj''ZZbjjjjjjjjjjjjjjjjjjjjjjjjbb~++|cccjjjggs==UU`jjjjjjBBDDPeeejjjjjjjjj\\p==jjjjjjeewccijjjjjj''ZZbjjjjjjjjjjjjjjjjjjjjjjjjbb++cccjjjggp==UUZjjjjjjBBDDPeeejjjjjjjjj\\p==jjjjjjeesccfjjjjjj''ZZkjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNU]eU]f]rYcnFFFFFFFFFFFFɄג8Ւ;ΉˆʅʅɄɄɄɄɄȄǃł€zZ555FFFFFFFFFT\cT`k]oWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ލނނނނނނލ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘUFFFFFFUޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻FdzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFUYUUYUFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccՙfNBB[fN[BBՙffNNB[[fNB[BǴ"κѼм͹Yλ._]52D2D';HNRU'''@@@vvvrrJJgDFHUX"ADFHHDDB=5)pBFHJFB=5"j""pjޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ލނނނނނނލ޻sngޫ"ރ޻sngޫ"ރ޻sn\{{555555555555555222222...++++++...+++......'''++++++""""""+++222222222+++8Uw\W}ȩc۬dz\\\555555555555555222222...++++++...+++......'''++++++""""""+++222222222+++WWWcccޘF޻ނ"iYmYpTj_RN====@@HHBH.BR2FH'@L5T_2HT.BP=FR.BP.8H2@R+;L8;N25.2.2o;;@@BBBBPL_pZrLYn""ރ޻Fޘ..ff""NN==NNJJ''BBǂss``55''LL22..@@++BB88PP==BB55JJNR5H5H;U'HW8H]8Pb5L].FU'BR.FW'@J+=D'DR"BB+5B'5Z+=+=;vNNccNNDD..~}++BB88PP==BB55JJ\\''bg@\p5R`8FN+;R2N\"BH.DH+DJ+=='.5+5=2R=eBmBn=e2T".`"";;..~}++BB88PP@H_FJJHHHHHHHH8Bj8DR2BR8JN5P];Pf;F_2FP'BL.HT2;@+5F"+2"2@==DDFFFF==U=wFHDD..~}++BB88PP==R@cFvHxFvFtDs"D]'FN.BP8BJ8HY.BP;Pj2;H2BP.DJ';H5BYNZz''PP22PPccNNDD..~}222NNNeeeppppppppppppooobbbHHH======888222222BBBZZZkkkppppppppptttggg222NNNeeeppppppppppppooobbbHHH======888222222BBBZZZkkkppppppppptttgggjjjjjjjjjjjjjjj;;UUZjjjjjj==\\22Yiiijjjggs;;ҡn88b==i''ffkjjjjjjJJ22jjjjjjeetfffjjjjjjjjjjjjjjjjjjjjjjjjjjj;;UUZjjjjjj==\\22Yiiijjjggu;;䡡88{==''ffnjjjjjjJJ22jjjjjjeetfffjjjjjjjjjjjjjjjjjjjjjjjjjjj;;UUZjjjjjj==\\22tiiijjjggs;;ҡn88b==i''ffkjjjjjjJJ22jjjjjjeetfffjjjjjjjjjjjjjjjjjjjjjjjjjjj;;UUbjjjjjj==\\22Yiiijjjggs;;ҡn88b==i''ffkjjjjjjJJ22jjjjjjeexfffjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;"........................"gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNescsrgzFFFFFFFFFFFF~ߝR]ю2͈ˆ˅ʅʅʅʅʅɄȄǂÀzU;;;FFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޠg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"tggggggggt"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ."""""""".ރ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFuxuuxuFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttccceeឞ//ee랞//e/ee//IJȴϼ;ʶ";FB2D2F.?bFD==BFFFDB@;.BFHHDB;2 ^^ޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻sngޫ"ރ޻sne222222222222222222......+++......'''...++++++""""""'''..2222222...8_Uoc۬dzeee222222222222222222......+++......'''...++++++""""""'''...222222...bbbcccޘF޻ނ"gʢeҲ+~\BBDDDDFF8Fz'DU.;R.HJ@We2P_BWk'BU28N;HZ'@F"5="2='.=;;==@@@@{Wpظ~`pg"ރ޻FޘʊLL55++""BBPP{{22==++++UUPPBBDD88..ZZfgH2B2F\;\]=p_R]sWr"@N2BW8Ug'@L8ReDP{F=p8;uN5x+;B'5{BBnnooppFF5555BBDD88..ZZss;;""..DDNJx'LN8BP'BDDYt2L\+5H+5F+8D"5D2LBmDsFvDs@i5W2"5PPggFF5555BBDD5Bb@DDDDDDFF;@.BR.FU2=F.DT+DH8;R.BN'5L5J+;H''=.@'._@@BBDDBB_;ujmooppFF5555BBDDZ@bHzJ{HzFvFuBm+FZ85T5@T2@R5HR=;T5BN8BN5=D'5B'5JZrBBnnooppFF5555222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttggg222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttgggjjjjjjjjjjjjjjj==LL;;UjjjjjjWW]]88TTYjjjjjjbb;;ҊRRbbsjjjjjjeepUUmjjjjjjTT22~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjj==LL;;UjjjjjjWW]]88TTYjjjjjjbb;;䊊RRbbzjjjjjjeepUUmjjjjjjTT22~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjj==LL;;UjjjjjjWW]]88TT_jjjjjjbb;;ҊRRbbsjjjjjjeeuUU}jjjjjjTT22~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjj==LL;;mjjjjjjWW]]88TTYjjjjjjbb;;ҊRRbbsjjjjjjeepUUmjjjjjjTT22jjjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urgzFFFFFFFFFFFFv'nѥߠ\ю2Ή͈̇̇̇̇ˆˆʅȃÁxrLBBBFFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ލނނނނނނނނނނލ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~ccceeᙙFFeeFFeFeeFFѽT]ı28DD2D.B%4==JJR@;#$#@DFFFD@=5'N@]RjF@;.#.[''@@RR[##ޘFŻޫgޘFŻޫgޘUFFFFFFFFFFUޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻sngޫ"ރ޻snF'''.....................++++++''''''+++YLw]_YPgc⬬dz'''.....................++++++''''''+++cccޘF޻ނ"gޘB޻ނ"f2+=e2FN8@T;U_8JY5=U5L`.JU2=N8@P2;F+5B2;';f'"ރ޻=ؖg"ރ޻FޘʉHHYY""55YYLLRR22""@@\\朜LLHH䗗mm""__mm55BDiiWWBB@}UsRc|+HT.@LFRjsBW5x@@RR``LL]]||..""__mm55DDiiWWZBt2=N+5B"BL;N.@F.=J";F+5=+52RJ{HzHxFt@j5Wn5;YYLL]]||..""__mm8F@m8e5T'@_8DR+;R8@U.@P2;D+=L";@8@"5H.H;8DF+fRR``LL]]||..x+DHxJ}J{HxHwBo5T+=P2BL+FH'=L2DL2=H.5D2BL8D""=JWrRR``LL]]||..222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttggg222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttgggjjjjjjjjjjjjjjjWWRRsbbbjjjjjj22Ņe___jjjjjjggsBB..;;""BBggnjjjjjjjjj55++jjjjjjjjj''RRkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWWRRsbbbjjjjjj22Ņe___jjjjjjgguBB..;;""BBggpjjjjjjjjj55++jjjjjjjjj''RRkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWWRRsbbbjjjjjj22ׅ___jjjjjjggsBB..;;""BBggnjjjjjjjjj55++jjjjjjjjj''RRkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWWRRbbbjjjjjj22Ņe___jjjjjjggsBB..;;""BBggnjjjjjjjjj55++jjjjjjjjj''RR|jjjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;..D....................Dgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;D....................D..gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;.DD...................DDgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;.D....................D.gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNYckT`mZnYcnFFFFFFFFFFFFvY=ޛFѥ]Ւ;э.Ќ'Ћ'Ћ'ϋ'ϊ"͈ˆɄātPB5FFFFFFFFFFFFYbkT`mZnWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޠg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"tggggggggggggt"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ."""""""""""".ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻FdzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}ccc;;PPFF++99;;PPFF++99;PF+9;;PPFF++99Ӿɶʶzt8.B+=%3#sskkv5(=BDFFDB@8*;W&H5;;&&ޘFŻޫgޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޠgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻sntH........................+++...++++++'''PJrYJ;NNkcdz........................+++...++++++'''cccޘF޻ނ"gޘF޻ނ"g@kDn+FZ5DH'HU+DT2;T.FP+BP";L.@B".F5U'@g"ރ޻Fޘg"ރ޻Fޘʏ''BB..BB55``ii'']]DD++nnHHLLppӛ{{ۗ;;;;BB""DDoogg++ciz=Dt;@p+.j..YZx8;kr++++ggÀ@@88==;;BB""DDooggU5e";R2F';J5H.@L.;H"=F+5R'+\DrHzHwFvDr=eR'@++++ggÀ@@88==;;BB""~;L@kBoBm@c'@Y+@T"8N+@T';H;P@Y=c5Y'@2"Fe|++++ggÀ@@88==Y8]HxHxFvFu@k8e;@5F_'=H"=H2@B'5F.;L".8'B."=Dcv++++ggÀ@@88==222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttggg222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttgggjjjjjjjjjjjjjjjggp..ZZDDPjjjjjj]]]]uu''\]]]jjjjjjjjjggrZZNNNNZZggojjjjjjjjjjjjBB]]ojjjjjj]]~ffgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggp..ZZDDPjjjjjj]]]]uu''\]]]jjjjjjjjjggtZZNNNNZZggrjjjjjjjjjjjjBB]]ojjjjjj]]~ffgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggp..ZZDDPjjjjjj]]]]uu''|]]]jjjjjjjjjggrZZNNNNZZggojjjjjjjjjjjjBB]]zjjjjjj]]~ffgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggt..ZZDD_jjjjjj]]]]uu''\]]]jjjjjjjjjggrZZNNNNZZggojjjjjjjjjjjjBB]]ojjjjjj]]ffjjjjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFFFFu+ޛFnߝRג8ԏ+ҍ'ҍ"ҍ"Ҍ"ыω·ʅ~Z+DDDFFFFFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ލނނނނނނނނނނނނނނލ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻FdznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc5555555ʶ.ϼ+¯ɶdzUT2".-./55bb:@DFFDD@;2$,ZZ$$ޘFŻޫgޘFŻޫggޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻snZ=u222555222222222222222222222222222...+++""85c|WL8;NNkcccdzkkk222555222222222222222222222222222...+++"""gggcccޘF޻ނ"gޘF޻ނ"gFuHwFs.@U.=R+;H2=N+;D+;L=B@U@c;b.Ng"ރ޻Fޘg"ރ޻Fޘʞ22DDPPFFLLHH''BB''++''BB==""NN55__2222pp..22..~++PP..++DDBB''""ccDD..22..~++HJ2F5H8L5F5J2;b;@;@88~'']55N+JD5ZB8]W.Pu.ccDD..22..~R5YFuHwFuDsDsDoDnBfDpDsDsBn;b.N"+Ji|ccDD..22..~~"8`2UH8]R5Yu+B@mFFHHBH5B|';\2D5B+;'5'PvccDD..222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttggg222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttgggjjjUUUDDD;;;NNNjjjJJssp]]]jjjjjjNN}}jjeTTYiiijjjjjjjjjjjjjjjjjjjjjjjjjjjccj55LL}jjjjjjjjj''DDxjjjUUUDDD;;;NNNjjjjjjUUUDDD;;;NNNjjjJJssp]]]jjjjjjNN}}jjeTTYiiijjjjjjjjjjjjjjjjjjjjjjjjjjjccj55LL}jjjjjjjjj''DDxjjjUUUDDD;;;NNNjjjjjjUUUDDD;;;NNNjjjJJssp]]]jjjjjjNN}}jjTT_iiijjjjjjjjjjjjjjjjjjjjjjjjjjjccp55LLjjjjjjjjj''DDxjjjUUUDDD;;;NNNjjjjjjUUUDDD;;;NNNjjjJJss]]]jjjjjjNN}}jjeTTYiiijjjjjjjjjjjjjjjjjjjjjjjjjjjccj55LL}jjjjjjjjj''DDjjjUUUDDD;;;NNNjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;''w......''wgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;w''......w''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;'ww......'wwgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;'w'......'w'gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFFFFFFFvY=v'~ɄʅʅʄʄʄȄłxm'iR=FFFFFFFFFFFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"tggggggggggggggggt"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ."""""""""""""""".ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠg"ރ޻Fޘg"ރ޻FdzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccñ5мZҿ8ðƳȴðOI"FFh]NQ 4o`e@}j k k<87"QPh@UWB?.W + uw 5 S 2 " Z k0]VnQg'(}3I%b8'aYp9cWWVIq ) :) k7"'8S_|Ho3vlN$[bk:PJX_*Z'B x) m 4 | =mC |+|Lh*}XBO[Cf7)JI JN S/:Iof*"hN9/757H-]M-PNBH@ @ q_l>jK@ghuZ &)~[wNv]  Y " ~m   [ 6 = L4 *9.w.M;]jZWHSnEe{rO;Q-%e'zV2P5jz4+GVOJdG@w\/+EG9Win" 8   w = #>V5Vj*1odjOhc=lL#L  n { w s  9  V % f6dWf71*wA@p?Op[,*v$GLWVo0k\iLC+ iyt/nohrE Kd:Y5X|(Ad\g( H *  R Ka+ \ 7 59HF _P\;Wzb*#2tSN`j(U(A 2  b}]qp~&Ol:ldzFGW*H/En8mlRpm= B 9 ? - } ,L7e7[f u\<_.@&1?'G<lOW>r9 `c_P#r!_3('vYUf`&thXC'+E9m^,3 D";:60%l _  2 8 #(xF2u|,v`{@<Pvtn67R,K  iW " JxCO @Mk67#pKRepY^!8E_e  . q ! =tqCB6T( /Y@3+m%=L4`ykx:(v1L[*pp? B~3viCR =a4w>&A*>T f Pt U5 FAf//Yt*}~T:[s)ur~2@7G>D`o0_N<HOx lMA93mJ]pw;yq*IEU!Z=VU"w %Enoh@g2V!%LkSG_{CHZNR:LUm('}>Q21m5I@hm5#6~azR-N kQ n s  >  pQb o~k!8B uYF^),#w[/OS}'p F@RUm $uM- x}d ;(SY"r[c Uj2(H*\c+|Rf;Wc ;}"8ANo<)|{=BF\ LL1w#Q~7S`|oRc p  -WNp!4V,U!VP<+* eN4viu<XSTY36q$&eV|oM(lWj8yowp`yMGx|l>uH.V0A;!cy<qOHUbX\K&3>Wf^.14I,(.ck(Ssjf- )q;0&Mu6(2c .E.!q|@'JF$#XR+$ FJ .2](E>y"?tf5Y-QrV1l|dN!r(Ap^/`mt{?\uIIa86) :*{   c 7 I JaUv,(SL|]s#l gZ6P : ig aRw wa1)Q +MVI.drS%2p}|r(Ai[`" H  )8o r ip % 4(3+lCTiwW< u m F .N~r P @)R^\_bmQH@y]{lm jnnR7f{'5`z- LF@a.W4eHs/Ua}b:YblX4F/M 7e5<  3 Wh <l I g  Vf ir%X{=z0nfW3|5Q$0Whf*^9\+%%b9Q+^j<*!Wdr;S TgP1D[  a9CAtf_38s:h8OsKQ4 -KD ^ B ! lNk  }1 b >C:a9)}!o G. s? SFBG(j_ o a E (  % a* E\6J.}%JuEr cd4F3QfL ? [ 4 0  E U b!r X|w*n`.zM 0G0\3X[:s44 %PHtio~44/'LyjbxzDJBkI){~4e7 a[%&[Z$12'PRPti=~ ,:_ }9 % gF q :qxO{e";\L*sC\=%MT.d;UA}-D`,PqC&v\va#<U:~CB9SO & %\'I p7LzFtv}w+J.+tb>.@/r]Iq#9=@v 2g{YB!h \IyGQ] $L\P5{\,`WJ&"q RlBF (%0D>Y~whDc.BH>,x N0<" hM<{u3K\Y\Xu3El U=Znf| gnX;P'pH ?H.,WxFHV1cJ\&McC:+=Z|jI+:_vVF/F~"b3@[(,GPiZi^TH$ayV!BtvC#QaUDSS)SMc >YO W"a-wz=Q \9C(Ow;I4B@VH' {[{;1"L iWB/}h"T3h,mI!=nd{ J*sp10R;a*-dUx #V!2p4]+oyy$0 HE0Vgy$6)&w_)15 C k U  j?8LV#*1Z{8;*z<#Kj\N O"x2vNVGbEcV=`L_yN Q/fH4 }Pi+5QxxCdb]9 %jp2fNnc+y] I;.yr"E1]wBe *L%>rzyt`M2E:HcqV7KqpR[R`m,5 (.m]@vTh.* .W\l-HUEPG[R1k~U)'vsLr0qa#~~ o[&.wuaN :fucmt=bb:eM)k(H'\F129wL&(`K:W}RWJnG @ > mv,Cy36RXw4Tfth z:NEHz='ow3t x}A9s4oPj*3Zwa2B;?O_jDnxO0&.d>1Yh!nENG> Q .  ` " rF"8,}`.c  27*Iy>d^ p!c)fEnLmlN;r] W(hQ|7_..Bt)!iI53i/#|H~soYppQC!^u$WF_(z{:/r;G&,P'{kh VWE_F~B\EO'Y>|$dLwF>W15zy1pTe+m!'1o]VRIN]' Hx#$(Sa?{eab/Oi+im9 eREhgu{b NWw f ,s_JNCdHy _&7cPV {J_ > _>[Rv I8>xQ&!_ ?*l7nX~h!qLp-K982jw9  Y  u 8 j_4nimG_nqORGZO J9?Ko?;FC}` l J 3 A<i# M+pdep_!6 av*yb.|({J M  5L /vuE IXnuH^_,>PoDthILa"h@vgo  $}] {mt}73.DU383#\Yb@ugRcJN : 5 < J[  2 p y)   ?n4_,Ms\Ae$=Q};crlCd;I8~S6}ac!P>Ma?- k d|_) \C 08L,|4}WQnC?GWQStworld-1.3.0/res/bomb.wav0000644000175000017500000005331610125477410015424 0ustar breadboxbreadboxRIFFVWAVEfmt +"VdataVaS/O=~,"X:Wyg%@^kE%m3ݍܨҍdǵj̈p{p¾<ҭDP D@y}W˘JP[**¬̑yϊϣ϶ϰϵϹϯϧϸϥϴϼχυϘLЫg_GHA !9DJ+Z[hihpiiiAii.i(i"i.i&i&i%i i)iDiZiZiViYihiiiiiiiiiiiiiiiiitiTi7i&i&i(i i ihhhhhhhhhihhiof)a[.VQE.S<4^c ǖ1 ז~usl`R>.-23.-021///12../.00/' ,1/00//.-//.-/31/./110133////12///-/0,*.2/-11,1=GUbiov}uuuwzn{kiM}kh2 9@%O۫ݯ}eԖE3GDWW]flpieinzωϕϛϝϨϷϪhY*@ q) 3Y<8>4M20/,*D+-<01S1]/I/2 789:>B$DA4>=^?? >;;=>(@@ABhBAA]@?>6=h;t97541&/,*'@%" y1pM  6iݣاtq_&s%$LyJ y9 0"y$o&" | ! ~<  9^r3LݩJֵԉ҂*u=Ȗ7|Ľ [/+N4ִѴM޵:[mo6L!HL!F!_&z z Ps-k{V. :  Me bx}:5<5-7ڇL܁wāāʁǁҁʁv"䅲jCiǘw%՟Uw[׮,=RκhپEè5CQI4ҤϢй6=ҳ:ӣ \Ԧdi7qףסakG֤֓oNW ۃމ6?a ݷܠ۝ݙSb $+/01//S/.C.-^-]-'-,D,+++,+r+(++C+++]+A+W+l+O+ +******r***!++q,--G../N0'112:334567m8*9(:;<<=>?N@AFA;4.Q*)++*(B" tc_Enpv v W / {6)l?S} M|2.Je9e "*)+n++,,+K)-(''&$"!!!] b][`"+{;P_aq`McCdcdcbaSa`%`_^^]']\/\l[ZYTY|X8TMG?=1J%vh H  ={q2.l8:8w87 76544332021310000j00+0c00T/1O/M l^`? av E  M Z Hxq ӄҿққҠ[RO0EҘҾ~.o ЈgQB7+..,WГDѓѦџ>K*5: ҸхђѓUжѳե)z GG{ʑɟf<+~Vfxz%bWI- H/N67~88O99:>::t:;:5-M' ):מ ؍׵~jא4h} */%55.5}5*555444Z4R4D443333M333322h2Q2:221a1%111000W0500//u/w>)f.Ȟ_'Jpkȫ6*sʪ+LJd~̯6͇ͽK΄κ;uϴDtй_ѯѶ҆җҜOӓޣz{I U *4989b::::w:}:c:i:m:[:j:i:X:m::::9:d:8;38XW /qe0Y&?I6%X443*4M332e2=211p1;1 10W0A0)0///z/C//...{.A.--G--,,,d,M,U,l,u,,,---M-t----C...F/G/y//*rl5(K^-lu)uJ"֎֜&L@L`xֆ_OeyևtE0AVaB, ջլ՟՛ՐwcP( *jԫӕYhH.yB4SRV "V7ɜɖ?xȓUXޤwK '+(*<*)>*)*M*;******+%+Y+++++9,|,,,,,,-;-[-v-----.7.t......)/m//////$0H0S0r0000001B1112&2A2j22223,3O3334<4O4444#5A5g5556520&^V Q13(kRo0fމn۶/֗Ն֌կpՎM<ԶeӍOӫ~i1ѳѓр7Кg6Ϯυ^Iδm\5 ΃̸͑ͪ͠>j4 X6Rg_fx}}n~f#Kf] *1/1e11Z111112*2N222223.3O333333 44U4445Z5t555(6Y6666 7U7777(8T88888 909<93969:9E9c9o9u9u9f9g9i9V9@998888y8B8 8777\7*766z67655o554454I44240z} SW`rSX-qqK/>R=U(,٫&%ͺͼͲͨͦ ".OyΧμθε9nϗϯ;qЍгfVљіҿvFD $ 7 q   E I $ ]#v%&y&&&~&c&7&*&& &&%%%3%'/44L4V4333{3Z3%3222o2?21111g1F110000:0d0/,w**)f)r)X)O)K)8)))((((((((((((((''&" T z  ޥٶWr Z$ӹZYHwU^}G\?a *_++?'&%bGv~ \}lէ~ԤNZP9)ӔfZ&ҖvқT5bTPڦ*6Tnk :Jhqe69:%`N 4|~}asD%- A<0"Im  %-E.-.Y.l...../,/Q/{/////0;0n0000%131P1~111152S2i22223%383k333333334&4+4d4[4b44T44435\3!|P` txlLTG%.jv)c6zPeWRg/Ԕқv1ن41/; 6tyP+U#{*a7mb9]I:565Nw{ +I!/1+01000000000000000v0k0_0\0Z0O0L0N0N0M0?0>0J0=0;0O0K0=0@0000$0 0 00030J0/000'0)0000"00////0//////0 0////0&inzE. Orڛ՚ ъ",X'2ZTRhl_fтіѐяѡѲѶѽѿ,CDRnrpҁҔҚҡҪҺҿҶҶҲҪ Ӕռp?ӸҤҬ`җ  Zzb<y hUG$+2'FNIahkwpOSaFU e, (T/0q/////x//e///A//.,-+V v| '-G/.//............./...../// / /1/=/%/7/F/5/N/X/=/G/J/D/S/I/K/m/r/l/////e/}////P//[/m't( '5nXӪӶһҰҜҚҦҫҤҝҋҐҨҗҎҝҗ҂smovi\smU_UFUV@@U_ZcnfZ[_SNfRX҂7ҋ҂W܊ V h  $39Kt#5A:Xp^ge%/0/700/900 00////////////////|//1///&x kUki u xE 7ej  ]r oo i`uPcm=N+ُ |6NVOS;HOHZVRhjgӂӘӜӪӺӿ#8GEKpԔԎԗԬԤԽ$=FJith{ՂՀՔՋՑ՞ՈթՕwշHq o i o u l M 7 ' ! # ! !         2 H 0 T!(,+++, ,&,2,,,$,),!,,,, ,,,,,+, ,+,,+++++++++++++++++}+++E++N'Adb$#s 8XL7f{uzjgcMTO9JN///#~m?)E#"st֐ւ|ևְ֪֮֡֯֬־ָֺ .; < = C B C < 4 6 6 F N : 2 4 , 0 6 * * & & 6 4 9 6 3 F  "Rsn. " e"###################################i#]$# #$<87 o#^itwu}~u|znqgH467%" -Mxߌ:&      $"37FEQF@TUK;T߮ߤWQEfewG: U j m o z |      $  & + $   R S K   r d ;"E=MH<7!;+KA  *~jY`XMSGQE(s =fd.\ +H(#)!&'&&]V)U8+KhJW[[]jp,VP.=lN]Ax]m;'Z4~piha`:B8kwstylYp/xEG]AFRSOKTUPW__]WYiqomnhdw-r4)YkOlnx`  r=v'295@NEFC8Q@DGR?ibs[.{Jy zih2H_@7Nsl rH@"#  )'!#`{|y}*?9 Ns>,Xnx_~p}x 7vrvyqpj]RNF;GLAGG79:;DFKONKiI d #dEED>DGFFFKPNNOKJNPOMF;<>..:768.-=@754<?>PHKRMnUf K"?MUZU`g^cklnry}~o_O]jH#v1=Q(p-4"| ;t[7bU'5x5p^i$(B C l  V i V}~}xy>~_q<<*`yjU=;B8541.02)+-*7$.L&PYGpxDI48LLvmhz[V_ZWZ]kuu|MGpaMG)W5H?8"pD2&_}c        Fs"GsoFs>lfJdpYgwt{}}oA379EKHCGPOKGAEKC58>>93x}m8?X Yn"4* e( U  ?          Z  ;g/-l( *4B 9% u JA7L; C - J  T `yeC1RB,MT\=GWYVXZYWZ\\ckmigihkporqxvW/Ze1T~yU-FW   x , lMrk u=e[t8=ngW9&VwJ>mi=! B R p S b ` \ d e d a _ ^ ] _ b b ` ] ^ b ] X Y T O T P H K L L I H M M H H C = B ? 9 < > < < : : : 8 5 / 3 6 2 5 5 , , . , , ( % & ' " $ $   $  1 @4}L&zmM"\@_895b"K/rxguGWZ |"   # Bzo >UB*5dNYAE!R(%IO0 %-QUqM5khXyBQqQZcm | B j"X :wI[`ad_`gcaefddgjkjmjkterUES A;yJ B x + B Z ` ] ` _ Z _ ^ V h   onc;u[}.az};&!# :|Sp9{E+Xbkonswz}yy|]PC3 lB>Q6-*N-[9X | _ x}{{~zzxt{YT AsaO%pS3`}M;8ac]$yi1Y7enBP[~gZ f Y ^ Z X Y T U W T U S S T H M C {<DgBBRYRPmU4Y<rR9d2gfFw-VNuonnokqqaC]iKh` uDr\zT''V^jBbNFeNGHGGHIHEEILLKKIHLKGGIGGGHJIGKMMOQPSRRQ \CI1` KsfIlQ*IXkx ?^tzunj\@ |M=Wa+wi-ZM'_y/qjrc3  $:D8XVNFEDDGDBDEFD?@FGDDEDCFGGJKIDDDDHDduE7NbtxTiY5{.Te_jsps{ko 7T CXVRZy(7e]~Wr )kc9U1$^%lLq'(2U~*'?#2B6[UzG"5/B'Vf=arUgW~rg\H&&) 7d8/-`<B!%d"k0` h87x=^VP\jg\M<-%x=#7RFRJ_rrotve4.3:g;5)2F`5MfSt~#c ;7^dinollllkkjijhfdaa^o'!&" "!! ylIxZ~z~eJBLTJL`mgVHIWr\v`.j %{,G)^eM@_.'8]9 SyxfW4BF nMfK;5*';ACIJHJHHLLKLLNPQQQSG% 4Dv71&@4gd *0:KV^]6 \6n <x=;qJTnh?jdklc`c_RA:FQF2$ ,M@jf4Pc~rlwvjhf^[^dnqmpz}{zzxwvvuvvutqpppnkiijjkihfabdabb___`H[%ErchvjO`p\5JenSIKU]^\]ZM4(7KO>2?]m`C'x0k1   !!##$%%'()*+,--./01234556799:;==>??ABCDEFGGIJKKMMNPPRQTsCsCu 9DMg 2eF(3>O`o{)?`xxuvutsrrqponmlkjiihfeeddb``_^]\\ZYYXWVUTSSQPOOMLKJJIHGEFD/      R0`+~oYC68?C<) umpoY?8@LUBs;4,('&" $(/6@LX_ehlrziN7l]O9  !!$).00169641.*&$   tworld-1.3.0/res/bump.wav0000644000175000017500000000341410125477410015442 0ustar breadboxbreadboxRIFFWAVEfmt +"VdataWk7#MCU"v!wU M x ! o Y  j - o h [C|dl}ytnic^YSNHC>85/*$! {v<k>USPQ $)-4:=DJMSX\cglqw~ %-ij H|zunhc]XSOHB?94/)$ {&%RvX.2GIh w ( n  ?:3['zX9gN:&{W,tYKB93* .D]x .Nkt[C(zdN7#vhXK=- u]? cN6wng^RLJC:71& t_E2s[D9-|wsne\OD2"}wuuurrtw~  &))1;AHOV_chs7Tq2Kdz!/CPYdn{$1ALUcr~  "$$""""""&'&)/0249ADJQV\aefjjjnnnnnolhfc_]\XVTSOMHDA=;;99;89;989;=AABDFFDDFDBDAAA?=;9640-+)&$" ""$)-/2689===??ABBBDDABA====;;98846899;tworld-1.3.0/res/chack.wav0000644000175000017500000000355610125477410015557 0ustar breadboxbreadboxRIFFfWAVEfmt +"VdataBOhFSU2ID qA8}j3sD434iw(/A8 WtW4[N!8 |A J-?f1] = ]+ q&:@>(Z `e cn\}k <Y^D T { gP~iz|}[_Bմ;9b " ڴ_N; J 1&@ hA. {" /_&^K< V]  I۲f8Q  ս&ڏްum"D53 &$  +$л}01ٱՀn E?:6MkGQ 2 " &Y #o>P]{ |Dh$ <ވkd '  \30 P  J  M> |U)1 kD +G9^~hd5UR% $p0=[ x"dh^|U&Z Tvy"Q5;]+&A Y1 Lp{ %r* h8HIeG_UNR Zn8 y%xg?MRodXe.v eW F.%HFy: @n8*1h "df93x+CX LrlTEh6[ lJB[HWm~FT X?T=3K(6jA3jwlVlnuW]?=/@ 1H\&)?6=Q3uCjxH +"/~=z=xvpSFMtworld-1.3.0/res/click.wav0000644000175000017500000000325610125477410015570 0ustar breadboxbreadboxRIFFWAVEfmt +"Vdatar^L??=->7(Ou'4@fA()DU&I,|)b>pPc(cK7$BSY$ 9-9sQGThB/J$DD<.,.b@Ț- dءʯւ 7+Ў5lgƪb. M 6 Wv!F rwn`O NY7_ ( ~uSP +: _?8 { k<aU  sS}R j$do"."XkdgK&i1||(6sYm#}vPRU ;*2\ umGo76<*{!/_7?W>jx=0Y6~T3em;MbLO<4 =0PJ *T P7a\5P0$SU 0JCVlJrn93_Ht?fBKD5Djs"wLPT%Rnb (GRS] ^4HL+F>) R8zCgg$)fa%| *$7+">Dd*Sp+ gFYJe%""NFF;e(x~t(W'NSfcrtworld-1.3.0/res/crackle.wav0000644000175000017500000007045010125477410016107 0ustar breadboxbreadboxRIFF qWAVEfmt +"VdatapcqOjau8++Twox$h[Qo,pSLR"][0v=Iznn,W ~VBqN "=,'E9 8+nsf;w>0ln4eqDB;M01>i|an(~^:hR[j0?=xJ.S42 o^\>5 cF o^`j!38J_C;SQQ0o) o6h_[7!/O1=B0h]wfdUp:\5MY?W8)8+6&u @zGm_hH"O09+$&u%%M@. s?a7K!vRn@I-A(Q|?T~2c?MM v*WRl- (KN t<FNBBaa~WAD}v $67$4%oh. dhom6d;2u{0qnew)zFs;)H MO-fzxlu5Z;D MI_ D(q%aASZ&f+ j~sX0[jD?%;vHOD[aQ.V|02Xwx73o_p\6ldvDDao*xKx  a-DZFJsqd@z4dmvI0}P<BL`;BE%l\VF@$lv?? y yeQ BxBq2|Dc%DOZH%NB; z&iD2q@qc $qe9-Va"en+lJs--' Bkimkf@t%@*nM%bxRZB_B_"/aTi1)67jK z.7o,Do$d)2]v>3DJ V]Bx=) W]u|90+caK/B O|~ Bx&a7v'4V+]P?R@K ao2[)nKu7VT.dz;E[EhU9f g84` o_T2K0d#OfFOR62VvOu=9d nD)_4qzSXXd-o$JzBv\yWHHZu2=vj,tEr*BH hl@cleZ"T~.0?+wflS"sn6|HVF<%=!'h'dFM9VlzXHV2SeJs|J[dlEm[Awn;_2 FQ$6u+TKx\HDRHdK6_] 09MT%<r8@Ja2R]++V X=KuB9jM[+%I8<>P-&u=0d )?6lT@"ZRwTf=e|_%sz6f "Ru9d)s|m?huQs j&q<WlvDa' F9;ZQ9. mZF"4aR=]MOQK_,oSl+BOu Fz+VJ ;n HBV$fk:faP4t*x "fQ*)X?lj D)f[ $a e?_.l+OhzqqxG0.9~T+K+"Kwt@oScB<|fvh$Ao6o\`;6doxT>d{B!u9BQQ@JQTW X\<|4Iw-~Du7@ oZ IIV+Vx; OnQj|n[z zhX".0d7K6M6'$"zQ$)zc,vTEDKY%xIXOFe/ | FQQ?W m[m4H)"*oh MVKe3[DW4a4R^ 7'-3M2 ZIFO]'< c= 7+-FB*ZK svD9  g#VNQK%8x&/.. a{r~&T_wQ54QH#0q0V"c_Ar?VPHeHNo;9%7AHZI.Dl6?B-?H=H%qfRMO@F .Iuw$&Taz\\uEaq'K+qU)[AC+2S0&7=0T EHZ" bX Q wwAh&MR!DxxD2zBOjM /=O'[{O @MO_qQ,cT f~hg`XJ N 7K!wBv{`Z|wF#V+e6|+n N#T3*u*V|4VBw|K-8%?8{cUn6qixD8:!!!1+& SWMo8 | [uX{HjDZFTM97Ba3v.N)ozf7sS|"T-o4H) a[Aw_x; !ad6l hT)DD-HBm'R+-xsr_)P6~ay4'xsZ8'Y}O4w-2cjuCybd4=T=z4DTMBZW}\toH%@8Q8z30o{ ;,_47}BtfuAn" sJ6W+RSmFxKI9CshTh D=hqjNO{x  F09`%b-Qm**KB" l8A4-8FNAJ6ac$:?n6lx 9-~*]q[N0D_KQ[P[rz@<`: *\#g0Akm. K-:\RgPOR`kyr!>)44Imb3x5W+4sIs$sC3T/}'X407&%~7;O]ilr3V 7Ki/V7[J1DG[caXbH?5og[#tf U6TOBa<.+sMJ~w%I[G2.H6[%[DWd2KTMcZ& wL~cl0 Oe$;wQVdd?@$K4F9H.Gz>O'?fK U+?HVqwc?WlVb p bg4S$!A+N2j:wMF>lDz % 68$]xV)4*&~x+ Dc'/V* 02Aq u4-K Bz\BHlo0lD|ucF6@HH*Aa6CO~)? xa+. uiygx8k hl$bl[B F9 jH[%F$ y$zOQ +K z DI6 a_9_VjKaTOX'0Ph'8u6F@4+Hl50B~XMFBz0x#~jQc%fx  ,kNAFHFI]?2VOvb[4Z7J6 WZ-v MKDM7xz?4|V 4Rc4ujAj2JXfwsMZ2o?H0jR|jK~hX-vH $DK]"$.H )BxRl"@-H9q'QhoRkv_B-O w\ A>Q4_'K~[3+tN S2os4Up;\ *|0H2@8 XXQ_asV&; mz'Mn;'\ & K@]'f_V9Ll -A'2M"!QSA9'D$?+v"?2JHc  c'9hq<V_K,aHqoh Zh4j O~~.TH "'|~5|wv~l' Jl6&e+a 0@ +OKwezF=M$QFh X-"R TRZRV0-n+u%@Js6-B6H\'R;uOfK&TF3z <'KMvau%q h@Td@ O zF 2@qH&=];"%uH29q0V]xB=hz9=&4ZD}23m;U~QOq4"u)V-Fuk=w6`Ou%|[ ll22uoI#_#ROiY;h)qw[ mQ0OH_[+f0q;N[S*ue,%XFdouX~-\eJ($[]4xzM$fuf9\a$] oD]s|y4D= j=vL{3>ME47&]X|c$ \y*1 J%n/%W_<7|W) dV0 j?7A_?m@NjaNh.6;z'zFn/Me67D}>KoE?slz2$%_ RHK/w]; {ZVG0moaXFlDfD3KzqlK)X2FT ) *V%K;.+8Qf-?_[;n0(2_%V ~=zB|j\hjXgMH]Das+7OQKB_k #l6h^wyM+cT+a@Q8='B fD4*)?=uxI7a"MH"-u=cF7[EAKZocozMjO+4?Zg?_ 6__-X";; _TR7cTx 2zh0lBKn dlo7M,On]%. ~Ku*BKu0vpK=p1[ijR%e#C#7~@|Qu5KZ[XZV7<;o6>v03HF"V z)_xhu"{|eJ*:"zKX)@V]W9xq)f+";I|:8w&lcx$<iI)7BGf;J-->lr?8"-hFjw nf6x>87]0{0K "VTgCW@#%r kozzc7M |S=TTqY["0|sH9;D_R _WB/.x| ?mZlqz^$9rG2J^N1[K-F@jR[7+_-<" A+jKOhFZ"t}<8tRB2G*hc%@E+_@~?Bc&3Q^(NKwRl D 8Ax6nwx" ?F'j2[Iz'ZQ;Owwl?o+@09f]B@'xTB9@hXdMh.' f"YgV$I0\ZX4HX"SMIv26d;] 2'X027B4Bs7.xza\FDw;7f Z `n6~'O}PtB2{+loRU4uQc0o[~,Wir0~2 3+- Vo VTm=c%dl'0uS0'86TBqj%y>F;hh Fvh&+Z-;u- ?W+1eAD)R`4 %9sF|4qx`2M/2Jr"Tm6`,]fYojAXZeV1;2 B02/Ug4ifHT_.,`z;]avAeX+'R2o0fzf 0;~l+6um].uxDH?+=2Xq|FZ"$|h+_QzF3$=XB;|F7v6jIN"|Zz u_)xMzdFTzma )'| ;s4$Bmd|BhjSH|0~/60Q9 ?q7 aqwO.h%]OmsTfK2nVBh;T0 @]).O;~smMc ul uZ6qO-z?=Z$j ?h 7BD_j26cE,$afAsZh9scM!P{cFj lX6$2Koq dSWI +'20nKq fcT_) fD6D@HFjQ}f*S5MB|<N'_2 qZxmka 29Bev &I}TxkK%.==@V-=x__ G6=Io|6f-zu@7[[oXqe Vj)ThxqOj.X % ')s)c=s;$"7F.%,lI; Uok 7oHD+6[J hdl|uZ| 2f x%4TTX%1PS "Dx!oMIm!KH 006of|/cF 0 .v|.2)"D|Rq{Yd3Q7D)SHS6sl&OsWz\ d -4cz@K'e89w|l26jMm #7FE`~<8Vt)IF0N8tWVPdVh-H^UrA:8FaE|`ys/&F DQSmX|BxB_ 7Wrea(mWI;}h<!"Q/j~UIZ5R0 vy)KJ6R1%HU{aKlN8bT>-JO]+M|$X,=u0'`;.r.NNiE] xloH`^aW>2DM'7]  s_H))ahr' g *-N8cBD+~OzDDh2-I" [2H].Hmm}[9?/ozjFFJiEz?lH| _ !zzHk[,(MmRQ'e?*C$ ~EKDjf 2KIelOQVADRTd w$ ]6s]i$ZB3]F7"w=-~"I[f%0 ' oc?_%j9T)=QlT46~] qm!@Oo,[qk UAB 3Z]Oqm`,UNc6KO B6x|F0x x jsT)lV6l.[.|V/']o. cJ2Zz\x@*DxEQOd" M9OV|lTdqq 2=~=--ZV BvZ J$@+_o62 X I$K-.]~$9V8f2+2cjT4_HnaM"{2azF [KO 5_-6%2_?+$)Z !x_fTFB0 al 9mu0qaOq=9 ."PJ|A9R Ma :UR/y~f<z;m'Yz<_)S2MbtFV? Q=a9#7u@ 2wd7l+e T04| 9?66oVwTZ{sIhW;Ghl_J_?]62M+ln"Z0=ah[Dv 6 0a%z+'$940ef#E>s_8'|a\&.zFQ$xI;u-.3`Zf9w O*WwGp @`vh!u$-_ j'hk o8u$n4 D"T q4)0t3- ecdn4D89oZh`9u]0 ZD_?fND.luHOq4a\fZKfvaz +n hsO$esluu`h msO"'$ 7Qx%*| $H!"1{8OfHR-mj.0F;V.$Od;;DnssQ Kl_|~W[?+|7]KH+6+X| oB~v2|B$"V8_1vh:<OO0a\s2 o =x,xeD_-2X.Vafv=P>A#VTd#"r%E+jT/4BTcR)TXx~B"&64nHa /;a|9pa+=vI._qb#*,H^Mbo_hvs mSk<B_9.'T26xO@AO //a'2"o~7R Jy;z BK7 %F Ka s9'q%8-V?vDmMj_F]Z+|~Xafnf~JQ"'"eQi%! %mY]Zo90uUNS0FcHq6|~ L$+O#792 6dD@7,I.aD o![;@zsb+$aVMjH.?l8DD_!ywV:lMR.]&/BRDV %azvc )0.\9w[]o]X"z-n0Q2c- zS1MV|2[7he@+4"@tworld-1.3.0/res/death.wav0000644000175000017500000012106410125477410015566 0ustar breadboxbreadboxRIFF,WAVEfmt +"Vdata2MO9R $O" ~94[zHd=4'MVdF+IKR;F=@xzOK 9 w].ezfox7?R|a MX6e; \qn sX67_22 $xxcxjH67nx.e9F-sx fd$dM'2o9Tm2o-\$"47uB;$es)9o?"6@2F-=cq79 x@@Hq s7Q.)q0Z~0h|BM_qXqOu>N)0o%TTx.m-lf$8rS8H6.6Q]<3r'VZ%fBuoZ=&lZ#QH$9B_72Q BqV"- _0dM~ ]+m[mN~H H5q0iW_[K*>!p^>nXl OM5mj`y5N4>tw"8O_UnHS4=A'r"?T)QCe>%wa+jh|VZ;Z]XeFQRB0+IH/^ENTS )NdLr!Eh.;h[& JGwsyX _~F)x=;JN!,C\q2Y4h,H)b92RN.*vOYe ~ {!n@RFe{OjiIRT'Afq%~J,Lgf"; c7OB1r< X9b<e[Gv,0'p6] OGUNK Oa{$Xr_.  Q' j:4bgdQ^tL"aN r M4 (c/B+^ H K,\ c iD_ @0<_{GL%xB mnxp y@r ` &jg=M fP~ f5 { a] zK( &EQs  0  &;^\ sy$* K\6FUDFg7- " g|  $ pD>$N =R9Vo/=R y n2C2?  #1I A$ W9 zݎ9!=}L  qz  3E 9;cK!X Bw a51aPj=%  91مٺ)[@>8  \#g$S,P߱!$_DFeDT .  K)ךS!W/a3gy%bX!YX7+ :(Wl  mYO(زkE qI ! Ԃ mރ 1#] : }k< %Z>I wYOCU&!J&\1mT+ 0  Z(VɈ&*a$,}10Y ~[| CH Ks ,mIn;V1' >"':= 4 V  u)@+*]dSCݮB   P { 0 z.\b}g dk X%lȅ? 9K%uǕt6-ݲt!GO Hu;U ft@6cᲚ'&"ȓ\?D1  )DD ?!3I-ЂM )|| q ] 3!}^ ,H \'%Kpjqߴ3ڸ i _  ^_? gaL,) d 8ַ5S   p B:(  ,<<U$ lj S] !>& G >v1\ F5&˕D%p3  yRR=u!1_zSGS #=_ ] sU.X&;Qe(X) m GU > $uH) &yrgu ['  a ^Wm  %"o  L ~ /ѬST@ ձJ - I 7On''3* |ܴuUŹO;t L^MTyr"{f\1@. s$0& ys  ܮ _O#  VF9 j({} >3t܄h#~R   tY]\"}]׵6  `S $W q^&_] ZeZ ;n(:K?*5O"rkqap}  -%;ғ 3] &N ^ޚ`F96 ??-fiR* []Q5Y |Ư-608 -6t|ίt$']n wT 6hP} ,#frР$Ԗ w zrL4:/ ;f~ o V*ctR۪nU"|ۦaJ,t E}! }X _ AP; !e04{1a h[ \x \$# @@f ( X O*Q ci $! . o#iZ)2T8 &'AZ e~_2cNϒ(Pԡ \ T S]dVXME~'ZJ" MX q4 s  8?ۅ" Z ܛ  ,b2޹ 8Rpz_ "Pb$DZ~! % m1,-{(rjz_:= Ja~ u-s s xfC2Y%%:{>Ov~!-$),Bn  &#zhh$fUH^۱L Mb 0 F  \LW/q X- S$ l1  \sc.XHI 3   O v&g[."c`b k f @ X$N ݇]?5mY{Ib HMyB3TOO"92`S1B?H ZH7 S ]>l9q-'` ]K ] #E 3 zM =!$> e  'ZtD! H y[ 1P"K/L5 U[b (CT%=VQ$ hw++T X61* ]  M F +<K; l e8>X6l tdANhos@, w( s   9zZ i7Pp n4 r^=zty(%A#?] P \M\sAw< FVRD 3 rCyQ1VA< faA 4( V sdwA. x r :(CNP jv J p 26 w{0tu]a2 PI(| % U? ] ?bu* T+b\ ~ } S/c B y`o/WJ~ %v\!' gl iW])n _7u}'tj E x]7_CO~GEW(#Q=D/S B3y Y5tU\Y6CPrnz_< o. L [ Jb>q f)RdT-|CYP <dEEw ['KIWNJu2RPN>)JTXv|*<06|)d5 U%d2l'CT^KJ}t+@8fM(bV {(=/^g iD[Td/r}VnQrFFK%qm5 \%e !MF_F}h$iT_} w;@JH1R.x2Xl{8RXpsAKk )x=;v nHS\QQ3hBBq5uOe9("$Uy[>/d'tD$!w| )`05@[}h[RY>gUL~H!>Sn 5KI%N IO8wpR"o]Mt [K_#*} gwS`-!m`[HzWI_)%SOvC[6AD/ % E9q}HYE#rV`PAd)D5@P= Y=IWE'`Pg]D%;.`fVN>vWD=~47Dbf_9[7&?>ek2if <.PA O#{ id2qn~6^8R<At*^q `w`:gmKaWCDn9{_$60;@h<]lx!dfds<lr\ [Z jKt*+?m+x(Bj eJ!y{OaZ_Zb_Y IKjvq?7!B3_DDdl#$d_dF][ !u'Hms !0ZZ% z ;4bYAQ y>Yw0:0oHb?ULnsR%K; ` ,`~yQa{~ 6[j4WjfHP=#lQHr94]BR!Dt$18YgFck`0v 3Ruj9c < *Scl>O?W4O&F \f- k5F &{td i]N 5JA4 $u: zfhm8$9iM 7$o'Ui   8Cf!ycXJ nKZ 3 Tm&UmCM 3R OO Y: )n`@p0Lxn59Xh)3 $ :e`^Bn XOz rlh-L2I'?xo=)-e 5,Mf ylC]l!%/ d9;7BvMDyZ 6}+( \X1KLjc9 . n ]{,Mn})5cr x !);x *,j,DDFWJ S] Z\e&!  6tw~1dnL */ nV^0 ny } hVw : AGP qt' [x \N -xU+l/) sH R'5[<`$jR -/j  C|w6ip=b ZI Ll %>Ac*Mv Vr [(/?^K< Ll J CJb+ k,bx +t`X(%M Sfנ : E+7 )b(S 1!s e# HH5# X'c={>g  t  %r-+a!jRf 0s`<3M%fSj   --tԐ*3R<  LPf , z "z [tR)(J͢ e%yW! ($HB$"`7 lCE"B)t:k*{ tKPH*h 7w C fb"%P-")uqQP u /[[ Er g i =lI\#-ַ % uxmW{dS Jf v1 P   Zxn'wb Ny_ےS:]8Yd4-#(x ` 8qK.s%:U#F O i | I#O@)NȽV!a*,L %f|0.+h@)'l _O3!n֩e7|yP'=Ux T$U89$P O1*c .ؑ $`´F%n,̖ C?9B <5 (8~Fp؃0t0Q#|TV{! e%F~zrӪ!- }RK)l K /}"+#֫vA b b W. ]-#:' c-;_*sn iǻ%%2iC:5. fIϨD =#\ N&V8'h 3X}@/*pO7  8k) <eϥc T K 'BiiL :2)! 2 g r+a1'ob<9 WEp Ho A V k*' ݔ $ <L^dTiy8O/`Je"$6 ԓ{W=2/  ^i)Sԋe G{)3$ֲC  Ԧ I)OD fn -Ie#=AB6 ;70J⃲ N4- 3  hcQ9 #T2j!'=U7"6@;͠t ,  J I= w 7As W`Da jב |X$l%C  L1hMf$%i)I}!&)a!{ݚys{r9&LAJb 58 $")o҄ ?=OP{=  l[(FC|?Qz5% @ 8.P~W v3. ]Y k!DSaw-Hs5Q|@Pje ?I v'>%Zz   .+} ( .`Iq+ $y. :$l='11Rr &W"oܶ j Tێq 2 gl7Au$.EvK}\-.D X QwfV$ vT f 3VY"@ eB]g1=L#Լ 3$+ޜR`W3N| {Zu I:*joO2+|"D Rv\#v+"& 7i Z .^"?##:{9 #yj62 `Ql$m> {2< x 9Z E)o\i  | 5*Yg; Mg WcXb j =\  gJ2m E! % /, `%ܵ |Y; Mw[M !VP Qf ElZEu4%DxY Yp7. ^I(-k  K"F+s %  ?[] u `3={J^ kV^lygG Ij D8 6hc]=S[3wzM.ULUL ,[Q|T=+*kj% R2\SJ-8 sBBKV >+ t7y)z (K"' 5% zw ]d ( kj"hN` ?dph)C#PD `]($  ! &n "3G= ,"uK.l'lM jG_ 75 xe ol Z  F `^tRMC]9 6a z2 QrFz* Z)z, &$'d0L#RNߴ t!wF _ :&@W?X?iYdu W{ef)|]1A -15 ~ m(,Kܤ3a JЕڅ 4;" }5 ,.e *RL u nZJ%N{^xiUo7>Ur* F 5 " C\ ~ ] zV q-0' tZ;<B!1H R^ RBmRD _8`   cc rs /|D:I3.us+pli %(Gg]u QPHC\a%GJ&r|vbaxv2:ED  4`  r< x7 ;3 afc < J # ) - z  j$6UXq!rIX0Uh , Y W JTW!! A lze2` 0Hl.4I "x  d- #$o  P D  SA D &  ^Hf,*VPN s ܷ8 !0H@H3UO0"   Y2A! \ ` I B P:9 =χ '  n&*}e  Ll dWA) IZ5Tljeni~ C0,!2d*ݯ CU0  IE B1`':<=i . )%Zp _3 [#X_M$?R=W7 %=Fo  w/# /TةK(** tʓ Q`*__=)~!j^ !`f#hvE Ux9  "! r W , %f_Q :/_u% ! X , vJM?asf6"R;m>| vsY_< , P\% ?V.ޅr I=? H@;l"M I12K B9rިz % iR Yj", 9U _i;Z!\?^ zTMD eG_,rX Zu4F5y  [J{#h <6g R  t9$mU tc [Z  eAQ i.lHDD 7]Gc3 0Dۇ: ( n{ 6s wz M!c +V7Zzߐ  Z_;If M &6- % rh&"Kd V K? B7RI!4tc 8 G[$p+s ( <)S*7  :~A| 6?v  ~ * + ov 5 vO(> z/ p t7ZSH *",v 3 ovv  Mci M &X  `? >z{aX/HZgyUPR* "Vp g fuikz9a \G%]߹zPP=]#z2 /9  {l52\ |z7x ?P yJ D A@DC U` D: O7 'r fWAo [5 =k i -0  / 80,5 $ n % r  !-,Je# V&F N Fi$   V 5s"3 A8 8%0Z A 2%le. & g f [k'qllCC &4, / 0  WF3l W [L/{{}4?'K xܧt+ :-I{:&4 ]n &_a@;ۮA AdB' j\4 sY! 4  8- Quh!%{f+MaAtX ES 1~ E;ys{FPu~ N  " M i1,:uNxv *bl &o [)f&$fAgpt>f Y$ jVw C *>IQ> }%Xfz ,2E"C t m k+KAG!@dMXyi?( $& t99 [t i R  >.P ]a ) y3y 4F}  )^X e`cb XYA+b k YB >{9 ! n'i 2 XY$m ` 2~ d0G _,` ZI& ROk%^>BQC4|q 8* < / ? @d A I *  sU-@ ;` EH/>7 . o/  &* Gw jP  pZJ 5l~B +a ;4D \&y/^#~ t  lxo ('jn4R@$qGt)@, %%p l0) o$` )b j oRP"~`&sk_ K @aM*} _ 5/V  , p[k :"y wApsjqpWH|4`9Q +Z %>) >g@b 5L$ 3(  0r2^ d Ou  l B% b}t2.Q  W jn' J?'y +H V   f<Z:6 , OALe\  | 4 rH t * *X0jmyo1DA D5 $Wo Q G3 Myu+H l c9 6O_8Z :27 \  'C 8 E;T'8Y=U 26m kE #f_rV.)n=]"MTO @ 5{ ' P7U.$q wT  EPZ4L%f(3 I ] g?}B7(E0URO  /P- TgR;( E@lZ  4S^c)(oeW& D ZS rcu\M v i Zb( ~d\",S  @h W hX~ $u&~ < Yt. +OK#Pi "K$';! f $U |^ e<&_nd Y=8pgR_Z E?u:Yv<{d{ 'O #B1L"d i6 f <z8\ 6} f 8~nw :X?L KZB -}K=B1XF }L)j Bu- B; J w 9 -xA5Ep `Tb$ n 6 D & K 7[UJv=Jdp lu  a."X'Y=Zf.`/:4n f fX +uax!iD { |J}B|eH X6* - - A !" yA]Eng-YOO%5t q|{YN s `N p>Q{,}:nQ  p 2ruJ#z$< 1Ma [< _ iRPfQ 1=^6?DZq *  :-I >+BgkUD z2 R  KhUfInMC*i* gJp UX !A2 > gݒvec8G* o1T\> j!7~q  !{J\ ,7? + N #)< $ 0 jl =O63< D&oPT 45!. | cA }'s \OC | . a B: ) 5:UEW!anE#Z* Ni ".z 7 RLM1+ Gmb= ;3n?_f 8Tye m3#.Yu S;BK>o [OF :8EzK H *?DG !vbO_ FP$s LX"W@Q U \MU~ 6rf 7   n? `" {O$i "hUV^ +j` QPF*q  &a e|S~_{KcOj7 Erpm fB4  "p٢p a{Z` A6޷C'nzg d}^? n F+qxM4K W c{b ImD\s5St - t43 6  Xg  1z^Fa( /6   | U OC tB:Ur #V }9~W[Rdӹ[:m2 e _B'r ^EhJi% .+bg 5 Q a 9PId % Hyi@":T  ) [-3Any @#TQ_' MiF %    i?1yyg . v2t G D5=KcJ-C =~ m9g;*>z  ,.R4Sn62Nu[ \? N2j9u #+ .)^6)e ,*W 5߻} X\ %GXU%8 y? $f=uy$- C) _  _ $=@pdeP36t\3bg-   :L *)O Dgw GL o5!>Y k;:0 5<3eMY$B 2N s ySh{*9\%'C 1R( vgT<&_[k  \ .!|QJ=mw] yq\8&NmY  z 0LI u[ L y 0I Kf] $W }iy< Io 7 sa t:OW3um} VAv[  HpB & iM tRI@ /` cI> dH|9'3_ 7 A p9ax Om|>%2& B  gtWB2 ]G/<%fH H h a`]fP#0QA2P d$*!y .mc  uV_Yw S? L_0i/ t  >e~u C ^;g!` rAMv+lmB RN  (  ?O% 80 iZJ~0  ? 5 e3 /Ee&hzH >& #WU5}B m:<,u4U t67X?$ [ ;  od!Ni2J2i!i/T \ U_dP>xT^aK Lh vZ8  6f=K40brzPr= q ]1@ 9-C o& : iEQ;oS /J Su*u: Ly2  /*_ **  X  Dwt6M4I( \s4z n [&SR Fc)S e;t fuWS#>A bjq2js !rQ uM prX >#4p CRkB#~HaM   Dg %^PjPonyT{  ^x#@m9d'l5RmN nQP-* Z (%wx|4* lS ]f4d L" @ CxZq:a~ b [ a] !" O>?4@5 c;q !A Z VCEi=9yW3Myjxo' &HE*_)(EfiTa2 c Yd~e:PP]( e>s7:s%-~V Q $`c/L{ -'y v% J9 yHL fs  d7t Q7 0vU[w z9&:{C p` #Q6 b  y5]pzrPO J = -(Tr y f0jYzr6.0w2 qZg sJ x/ e qgjo-\;?W":? U: |( 3  0 Lh@^ Ao ?eG[tY$| hN ynu{P47W`  -m!va}We386f.zja q oMo } o]288f<y6 ][ q ~'ucSswyn j=pCU Fjk Keu[Kw~nTC <+~L,ba@/y!7d)?  Lm.{5!7:='=sA !H|jX}I;\Bs7v% c[V q&6[)r'|  M & L; )]y4R>?3{FnPK1jt k A$ )p} 'i. fY V E.f1Ez; e 3o':MiD< =33{0*@-\n!:5 sBxi+ T&:r < |yN\Gn,Z`by l0 { Aq T3]}vp2vfw W0 .~XVD!DYn;&@eoC.CD *A9wE 1?<A$+\K5&a6) E!-uyz?<\I_[HgWI[/~ 0e cSK7>}mR  G : q<$>v t.iK !7)UqQW>vH4hxNv a J R Nz b,Em$9kt  Ji VW O48`Ca tbR( 9@704=xdsZL@ VLp0 R|Yx* 7j<_9(k+] tssa`V=43, YbXCO|9V6DJV"Sx^&AZ]m=Ryd\?Ss8sX8QxxRB,^7 XG)"sMAZ";)y-uk AO  P-eukgHttC_SDq QH&.; "q%}nZ\ &W.=hUK8K06f/; !X{98[|$\_i>w^t1khs[KeGrzhBvx6:S8$dv U4i%h*}O\u;t,I f9)3Fa5Vmb2iLi/KHbqZZdZxP+#( KONEj@Pu .mH#7ezE#"E sq10/\a% TIJkri+`S8!(EJa#7e%@_V*Z8Q-C0TX3!|wxgXe N7?76Oc"t4:_w )EE 1bzG'00'87yb'<R1o~j;8>[)c\=gXlzS  @0XOhZ3OD*i2 *ofP; E8ugj'A36'09orq;~[l9 nsn$~4M.QBd4KB= F +"gqnzd!h$i OoZMz=0@t$8`,=Mngnv0]f'N`~YnwZ1Wz}$Icqm*%@ cI4;GM$`4erJ+,_.{5(K#Mcp+47z?OTmhR,*q-y`V]'fc6 7oD/DZlC'`8~~/l~qu4s+0IELSelVuhs9~^P|?zlw;IO_o R}.#TjIK]Y_3z{v vqDTHJXZNqcz!,2  ]-2!0.Nb BFnOZ|JMhlXwM$M+}M8MOzhvE-[3*I.7}3-\ Gzt kBy=26QCn83c=1yo|5+ < eE1{&1Bd7"cmTM@^|KlNog8K_ _Xe aP6@ ++/M7NEjl qOX$wZi +IEN?"NlCV kRY#HoGN p dg x "t;tz6_MQ 3D& KIrUM*fn4Jz/D6S&8}| 8+9Sy5Vb>i' d-5R]vEW#CM'lrd$loo,z{3yln`nLmOyn/HV XM q#se$%cT5S$cX|JVj'> 8fLT90;xN|:~[y[S*>o,N1<`},Y$d o@qHUMw+:AG %T'Ed-k/\z]  S; &#c~(EV$0bIt *u#aW~_*mIxJ+osOB21KzAlSTM@nZ+>*wdR""R St\e/)("bM&x8 wUeY]5&*h=%h4] 1v7Tb?lk m\[x(WzmM;; vbmU,.1vqWuj?\Z](@i-%[%1_9(Tc]KQ 5a;Py  l-Sy:PG\{*Nm5+  o W}?|yB2*XSStk F4zE7$(Z7^ G(u&!D:-e-$W?Cd;vb ;Q2i+ 8k6  Y4T*}>k9I7$] |OdW.*kCgHs&>$"9Mw5A(OP359lRPvjX?RY N[Vf&?V WL3m0<U Nr9!q *x.+rmixqw (]2D* D <~]zqN]}0 \O-bwggI  1P(O3 fy( R:\ Es&  (@.Nme4g9 -o%A#-  Sl- G3gT{H/y#S6V C"f~Ivc6 W`{'v ' Q_!L=d* r 22( &=( E$ q8u60jB ]nn _KN_Y<@C; e2Rr; =2(gZ2mRY  {pvi_/isoR\. , i=hm $IS : ]F1cB 7] '%btH cG+ P R:O %J ceR*M {j:Ii. mMme  PPIS8x 0.a$n bK(7 zs9W9'`:C `{/ F N8  [7-E; X=HX>& 9 $5O#? E` 5Z&dU 'uh fa  U4 6xQ79iv | h,}r ; o?   .n^ m\K~,  (&u p rGIA +  Xp=8T :  phA/ {ErH?  M:pW `VSj$, Vy8G~% J [ +boutQ  zE<Bm9' UAwA US |KeIp E &74T > ,[_, "5N: & Q [Na cHFT CgJO F ]/~D  s-~p} J.& P |*1:> '8_ NK\  a}AQAMgP2  'N3  yd^1sB@uNUAlwn@<3  @qfP  d% f !sDae}\ _ = ' ƚ0GLN$\d;oDm0I6S" X1aZs ;?>27%b̧?r1+!$iwϲ9Ų17&!Lki?ƣ5{('`^ bƥ8)Cp3N4>‘\u "#- R -(*6ǐ+m ']|Ⱥ=+~'(A!HAo$/v7V>zn'2 Ʉ׮$+ d[89yX#3M \̝҉xZ!^ 2N8;3}n"1"h0ۡZ  Q7I3:(( f>>V%g%26<52;7(":x? j(') N4ª-4:g!Sl-D-,̆=9fu&]2%5؅3?- 9:z %+ Q˳/9/߀5?E)tRY6|= <**7P`2?z48"qQ#:'+S"5[+4> }01!>ިQ&.$*F;4::iٝ ,*15$MUZ˔˜_D%1l! Z|0 3J&5[&a(ٙ%-2#r//[q_$h8)-"նłVպ(w"'L{./g$:-YhűTG #j$K./б@)D?/I;$w# t //e 0X1j+;5TͬGz L' a mhɰ/.'А3s3E73M)#-!_ -Dg,0mQ s54Ĩ0t 266c*),. UZ,69 6?) ‚3;rmH+-#'#Dz.m8`ڋ d38& l7؂#>)0o(!s051 h-*5c(z Ǜ<Ųr4'93e'R ./I(6* I@%ȥx%2"!{}ʸ+y*S9!%9-'-$ -<[c*y(8K#_<41)?b͡9"(3~Ǹ)({&4osӦ>8- | &\ *")I-L6w9B2u& -((#e") ,j(2@ǁ8ɚ4^.Dƥt "-%'ɹ)(M5LȪ7xK0.(91`%]>ʼ''-Ҟu621E c.83,1d&D R ) 1*c5?+B81T9rr,]2*b\+/v0 :+,k@6T>0V)5,8ʖ++q~*9/Nd:s"8'd5(P(=)&Ƥ%:#1~H=5ΈK& 2#ɩ&d"#>4KӤ>=aE+$,O"'_t%!ÚR$"%9M y<6ĩY '")#%%")? <p7]/Z߀ )%O<ş'!3"o0=W52)? "v.( l&-!fe4>Z>SƝ-'Y߼ 'q3)oe$#P,6!: M**à\,4<*P#!({`6ƞ3Z>*`0Y.5@-s#&]){3F0x;/M6),60Gc'%?b-< 3v4{:Rgr4*F8.m&! 0'<5'Dt89q%%'*/a80k w!ýI4]7)=(U-ŃlS/<93g" ?7/\7/~p.2w -:4 "9(?:g ʻ35vEL**:0!5#2='65ۺk'6+q3 !*m"7+1;غs%k2);'2"&Dҽ3)66Q #/+4žU0u(Zə)d.P"d2(J "0~.Er0s0/<(1fȾ( 1[ -%51Ȏx*4Y3}H2$o#2՘ *]:2Kʜb959g> O74ر/;f4;_'\l|;vf47?b[')6/'=d9 T3h*Kn>Eƞ-S.~,a=N7r>.3$§ &2/=Dt)8;}2uʵ^ B+Ľ%$;Ҿ3=-^7&27.Hl )_ ʱ+ҟ1&0Ъ %3k.b -(s#0.ϴ,+x #3F15~ '"*$՞/& )Z3$65g /)YJ0э,'!)Λ )  *D;% 8KʥG45,&$ '<"81&Tɾ(8ً9, T)xQ%98'^ Ȅtҡ.= ϼ#-?8$:y;(%W܇n=B>ve&N>?)0\ܩ+29-4?O+5V*̖2O.ޣ۰3e?MZĤ 0n-',-K/; T#1 t3uh0P}}O*@//=(m+3/1d0}εق$w7 1g*x9 0CǼ-0E2վӃ4=%d(1? ,QC+B !Z ז95Ө(!U> j)>*f ]vb;? .R's:-&=<+ iր}" n]7F%<>-[ȅʬ[C  6-L%?:Õ.Aʬ# Т%W\lìH@W q7qoq)Ƙ/̨ )v=:.r'2C Z5ؐ*lߦ8nb=r<2>, 2M@I5V TS n(wل6<P 4>͠6 R3u #Ҹց7|6 !>? p2W4 M`Fט:;!;d #/9^ʹ1 l=ȹ@e?: x$,,7 'E+fž0 Ύ W[:F$43܍'ˆ0 Q̮ 3ճ)?! /%? m2 ʜ ?ܿ͸{-,(a%>%4w ! D[?8#ܼ3J<@_ *<ѩ6'ǂ* O5n05̊!9BҊ >'\͸ 2О h0 -]e6go B:U ·! !f+ fM)K:5Q)067 Cl%d&a&x76=/4Oڙ @P#xӟ%vöʹ96,T"j6&]z;gB C;?  $tԸ*`C=qР a *95i¸!o$1պ-j=4|jI$%h3P{t/j'ځv 5%8λ2ߚ-) |!u̮/FƆo$ml1)b+΋mÞ։mώ-#ƪ'hãVd+a)J*.&$J[((yҿu<+ڮ (I#ʟ ȳoҼx'/ r]%Kά܍ʘz "ueb!#P)vo)T3&Fded.di!2KY'Wco81V7"f# F"ŒƳ~2ؾ'ҁ"?@A\*

(st9!m0*S;%wq!- W?49":PrΒ! 21 94#3"d$'-;7&,I*$٦$< &=* X'M^ "H >H/ٙ)} K>:1܃)i;r"̊< U0ڜ(R> EfI'ե 9G-d׮Q( qa /5%)ӄA(b7902%=k}Ҵ(faF-=w/"α(l1=z4 /@1!XЖI)9Zۤs0" *܈ -!32'ڣ-߫M-44+-c0o j*\@5.}yv18+ 35/ 0 hZ/P֝ 0,۶߯/6,,a!)b/?$(g$/%d$4!~Dܝ0I%-X 2#Aw61$Tqս22K&"3&5-)/:P)'08'?5*vn+;_:5)n-9^S(w8\|&+1N8K;>' k"x(Dde7bljih.$77>S! 88\Gx\}sDr9i?ԉ\wܟu:d!ݙO2=a ݝ"MbKCs@&bn<)Ac#-)3SJV&H}VIϚe"۲*4Ɨ 1ؔd3((^'Uq?L i_l(D߶y V'7f/Wأ KA'k'ֽ3Z?֑!D0՘R*%]^*ϗ=E'&̬4O Ղ$CyD?OA  ɍf8>2>n|ۄUMʒ3?q-S}w^X3 eI 8_yʊYЕa?Uw+ˡ҉čh6EpqpOa\(J3{\5f!=f:݄ &11?pW *d{)f8šjYԌT#<7[ .IN՚0!G< ? #PN J?+*_?k݋J0s)2U„F0l2[*:+"R;aM>FjJ2u8:!:n.*6T 0c3} 7_82A $gM 37 =hn4[ )jZ53 V5 Z 4le G6l<2=g `q,GK. l O%)h H5J I$,"hl&*-V *I$-$6D M3 ; $<)<&mK'F _( 9 _9 ' 1/ / z$B dC $Z #iR|*5- C2I""0<~%nP,) 3 ] 4j! 0> # 'U># #/x!u " - 7# x 8n zJ~# $ C"D $;%6 c2z0'Mm4Rz n6.7I F ):()9v)=.BR70Q=E;a M=~41K=O'h=bd_{/>0qk9X~*)wiz:/` ߩCEʕ cq0^ LES! y *vu](6h`:jф~MJ7I&i.6t1Ն mH"*Ϡ#$.ܴ&#Pݧ(~QҪޠ)!=u)O/8>> a)l63>d,r(j/$!r=2*!3n(?$ 4o36;k4&6a3%1h2.-2+v3&,Pq6+/9@-pV:.30.==0-.b ?(2B-K?$U>)7 3$o?h?MN?mS=aFM= Dwt=<d ~?<=!Vb]' $? 8P`4-384f8Qv=T?`?60f,w12Sb4X ([ 7:b>':fH/?g-L_p#Q3cVgRMY5]K weAe#A:!D?2!;{,Fu(B'\(K**Y(l::#%G "c+Z+!"b&' ,.\F;`(*Y'[28?? jC# a6w%![y$Ak&c)M ,!R9/*24%`/K:`/>2}4840au)6_^P/ l9Io2 j+ X2[#6~0~OE!<9LC#T(=R/-;9Y08EA3g6<:;j/q' #&""T#"#s jw<Q2)$-< 0 Q+"# "yS[0?m>59+c0&"E,t%$=<M?9 ,P/+29?/EWI6k xrc(.?8:0.-A--9/(a?q0r^v# G?5^D2J8 e16N$98>v  M"E285 /CPn 0>p= +$ CA"tworld-1.3.0/res/ding.wav0000644000175000017500000005077010125477410015427 0ustar breadboxbreadboxRIFFQWAVEfmt +"VdataQ5B'M=UC}VC]ג,*||EFqS.T:2%Oγ\K| L ~T62nDH#&30#M (&TR!4= "  0 /;ߞ".*I/G؟e6_;tx2k6W[N3Ii 4%TI(V!9{@W S?V(b7l{q D[ZՈ 0&5  #Cjf hdoZr#jx ees& Z#۴f #<]gob;df6 JUO2'hL Gk g ^('6d%6 w# +Yܧ .f m ݉ s!} ݚq P, #؜R >Jd GA2\0!H " ; -CZ%nY&Cb2%^i) i r H *L} B )gxu5(v< 9h}t`*$ J {Ay? gqJ x0})! H$J7 aU>J Q-Z'>x Fn Q /NE9Ct- 3Y66V{W.9@LOU o9 rT)g^|e{#P  u[`PU)i0S ^ v'vG  u ! d& S d4D8u8ilc.( _1HZ#k9 ?{+?w 3_'~l?jg`l* ~%4Y S@ U+E =aL/B.Owvytq% !g :^:Q r@By ~ = s # W  v 3 h H v;P !k jNl  7 0Ki p J8b1 FO?8 n3M2 k v tM@ h p< $tng 9/_&r>v q _DpQ5!Q(`X ? =4G-R K r; b iY# ,fCG ^ cN b[^S 5A U ]K |>\#da>} SV rNAlv^ M_Z &7H y Iz j q u* j0m h ]w R2p Q }^j p O$ 6 bR I$CJ%: 8IL% u/ bh M xd[zX}\  yeYi Wq ]V V8# H I[R 9k g @]z r~&mi5 v +(&Mp 0X +Zb lEz_ \W@ Kj< MJ wE 2t> ns` ,E{ FR >6 c `/ M\kiWN5uHF&T6!Bzl!&|OSNn] K&/vI|QvBuW V9PIYsiL\ge `2LT*ZMo0LGA<z[V09 r/= lf)P[Blu8Hs/) {5<Vo3 N\9F3C*s~/{@moZ \? .D^&hKN+sAt[SI@7&t9w(Dk]kK< I{9B+G]&6E}NR|XW8+zrVR)5/;)n @A]ND0(']-=z.$ a\DgQ2^4Tuc#Su"%H1 j-v"IWL9KtD *fQONc # N7EZC:q{X'S!k7fw~8)3uxk  FlZKjBF2tI&a&&jk9/3bT}opu(E {?uO&E33%6m#m%ax#Q{$\dQIWa~dFt4I_1!StK`34#h<!j!Z)&o+0f~I!0qBbyd@Nur5:&sW%<YAZ]dGdc)XRv`Iz\yMq`-Z:JH-Di  /16e{Po vx{QUzog[foi= h`']#fOr"@g*ne&I[&7\R&zec_e.>r{W%/&`7|1J_fC~bfii r< Dg?{x x-\Wm~ES>SyM s| poLs!H_W"5^d$d1co)N{X4's:IEVT`hJa0Pm=t6" m-}f,s eoT4t6/MDu187Oq$ &fvvmGtBFNumlqPI;oH{Z8--^N;h!cGqV!kH%s}u? 5_:3(<yOFhw=M_`8.M Z913tT(:v3t%,a( ?Nki y3tjZIN I\TuI,L2t'E$2*,%so!\OoXg+)/gg#No]6/:%t0sh/"Jr,R P*"*xJIHu,\)Ep{_5r0lHD<'-Ic4 S5Y.YF?K~\A& |fwg \:b4;K;h+| b@c&f`qRm"u*zXP.k <b`"ff$"|2+*nQ# Fqd`? 3;)<9;!Re_+[ml/`/r_{JCO]nKMd>eX[ -L+{pC\B9JC ^x$iI]az-a@aKEZ@&RlovAc7E#,([]&uBtaP( <s|eVaCC&h&s;@M?B4eE?8l~{o H_\/WEUjq>wY0ZXd< q|ydN6 W^9d$Ag:U$]Rs}4MnIgu`Kzl |#7#$,EDDfRv2 U(5h  $xTo}n9_rj]e}0gcrB lLVKpP n`Jwi6&+xyf k?@4f{kA'  q}:9SPzpr?M s":1- 1gt!|k@O,Q/i;D(zm6 }xV9!D +tQ[ x8OO\B^ED7}zmQ7d@L?u;"#VK)-m|iT:)H$mzoG^)L/3f[mWsDy/"4`4 HDUOc]?A\cq'26FP}\$7)/$mF<u  SgnmlCN8-'3Ar"p-O, 90<l^=)h)or32oulWO~$agERSA@; P?n8d| 9X]|HD2f>r@`??9Z; VlN6FU=!#!,h|]vfr}dOzUxdVx'_ L!"W.yE| s$otI@ rT;c0,%lgo[,)A6@T!Q#H+Efdw%fK(l1-: GIjxd J, _t^;1@ B&XNw7~*fR9-m  ?Y o]BO5POu+=|&ciLa&P=FbePG@*V07`1 pqK)H(upIx[ZKSWK/72oGHU, OUNZcy8?;?c^RZl?6YRO8? 8pZ.HJo[x[?8'Qop@Apq~HV 8y{R=+}d7g Igx-]gyPBU #iK:=mtL"L;<~q`j*ooQ=DdEEG?]`K<;4kqZ~'(OU6Gx 9>`sfcEQm%(Qu)|mHZ;H:n{*&\lvy1Bf9<4a^Nm,#Cq-7& +w72;C#P$ !h-oQELDBTCON43V_HJSX~mN|m*Hd>f ^"D+'L\-041r NoTcq4NKJhJ_?+ps$^gi=9daXzPux&f7 9;l.9Gfd2neu7E$5czo99H4o<K]?<T[PZ+M .voV$% 5{"v6I-h4(j:(&)!lJZx9D^j 6; 9*0tm'|uVvTl<]KmV2roytJ7gAoX, vt>lplxD\jv .#NE>OZW<T^PXr0|;cAxD<Ac"D Zq/^iuoji0T%]Jqo&-6K+!c& ?`>7B%y0FH>Ez[:/6a"Sbh2YP9*u^?9KCw~L}d?uH T[| %rME (cQWQ.[^q.fEtT*GpJP~g0Spi6(0>TI<.[?~z?+&bSM|2=]<68UPubKB];70"$qG+Io N PZnNTFZ)%P]U6fo00`W OF1SFe"*ZHq{{ FUG%u|''rDubTC 1R1b^l&jx~)u ` /-Ll"3 jn86DDDSp/$8c@w|Q'l3rka)X,zq *cxIW/, ~Hd/Xqc.imr6UDP3Mt,i=6"5h0 j }D6%~ fJg2BW"Oryn!6T&iv :\;N%++&1-tworld-1.3.0/res/door.wav0000644000175000017500000001463610125477410015452 0ustar breadboxbreadboxRIFFWAVEfmt +"Vdatar 0HTN:($ !,' $*))3EVZH)*65+ ,T{m'!1%   '-4X\= i 36@ g[ /4MO4/ͰKI{%ٰHF-$LL0LVVU˺K:?"EKĜP%@8]ܶAi=89D3' (~)5  $ n oSf[!ڑ;- A%% |&$!r M#<_2xI A6Y r }W>O\[O^tl*Yil&wP ZF(Q=/D l_EAzsLR~vH[iLNZauayx)Z{wa*:5\jZqTi"w@QlvzmJ5OSMH=0$ +QggQ0:kfVVbtNTl3'YzvV$an? 9jvP'  5:!|_]ipwo^W`vhKDY}{iZXeyH{%/*vK('57'bON_v,CT]T<qZI2"$2CZt'5<:0' )@Wjwyn_QLSe}qcg{l_]gz|mc]bnz}tbRE:>L\d[C#)793038;/ ,,$%!$" !  jW^~.VCKMZ(2PeaN<2@\vpO88U #1=GYjvoHD[VE<>K]aWH<7639!':$j2!30B0&|]y:ϽFo }qDfۑ!KR"X q 4Pt8tf|r V ({`O or<$>o?[Q%WX  Zady[w + 1`!Qq>9,  (j;I 8!h5XK U;HU/X& =g8Y@PenIg}j  -=.DOg=}f`PXP(.Z>"> vC\_& >x{vYtA*NbU@D*G\5bXmyAvo  Icnb8NC/Q")_|A/~h`n,>XfY#>eZ/\/k 8"55:(hOjb\O /P}m<{* A, G)Qe2@.tV-}TYY|BX1+yY0 I wzw0(xU7w <C K5 [  '|   *gʤSӉo^ Wu 8 S + 3ol `y6H51 \*"y3)q /t0{ (v~ dOڹי{)SR p1 t 79 Xd M\y-zW!P}'t ecEZ} 9h! N 1Bt n~#nFlG` F ~dCg+Oo1@GDn!X" a` BeyUH&Ai~+ KX^a)DUXO|:ȈSSX\  CͼƮ=mx!c]Kҽ'n8jG#()j k(>Ga?* "+# "C Ef  e 6 ?huc2 #(4)y%?WCcԥ[F1=v4 AYG&o`wDhdef}/rT\Wgh8FX =Tb"  lv\>&ybw+ngM@' -q;rRTQjqo}(WT?Aj.I<*,X$9 zk`Zv_[.;UNqy{u%~J$"BrFE0*J{^7D]6" . E3EcQz:vMO)QtgfE3s^e }@)ZGMAEg2xnek\:B+g=;J2Qx'NcS%0)  >gg^b^^\B08B7   5PHE;~!oN, )  "! $0;?:>O\l~{c?   \5}W E`^my=$JSE,  .IajZ@ tworld-1.3.0/res/font.bmp0000644000175000017500000004636610420633701015436 0ustar breadboxbreadboxBMLv(f33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333323333333 33333333333333333333333333333333333333333333333333333333333333333333333333033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 #33333323333333333333333333333333333333333333333333333333333333333333333333333333333 #33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333333333333333333333333333333333333333333330 #330 #330 #330333333333333033303333333033033303233233233233333330 33030303033 333333233333333333333333333333333333333333333333300333003330033230230230230230233033303333333033 # #3303 #3 #3 #3 #3303323#3# 3# 3# 3# 323333 #333333333333333333333333333333333333333330033300333003333303330333033303330333303330333333303330330330330330330332#33003303303303303033233033333333333333333333333333333333333333333003330033300333033303030303303330333333303330330330330330330333333003303303303303033333033333333333333333333333333333333333333303330333033303303330330330330333033303333333033 # #33033033033033033003303303303303 # #3332233333333333333333333333333333333333333333333033333303333330333230230230230230233033303333333033033# 3 #3 #3 #3 #33333323#33033033033033032303333333333333333333333333333333333333333033330333303333033333333333303330333333303333333323323323323332#333 330330330330330330333333333333333333333333333333333333333333333333333332323333333333333333333333333333333333333333333333333333333333333333233#3#33333333333333333333333033333333333333333333333333333333333333333333333333333333333333333333333333333333233333 30#03333033333333333333332333332331333323333333333113 3303333 330#333 30#33133333333333333 330#333 30#33130#333333133333333333333333333333333333333333333333 3330#3303333332333333333333333 3330#3330303333 3330#3333300303330033233333303330333333333333323333330333033333"333033333333333333333333333333333333333333330333333333232333333233333333333333033333330333333330333333303333333333#3#3333330333333333333333333333333330333333333330333333333333333333333333333333333333333333333333333333033033333333333303333333333333333333303333333333333333033333333333333333330333333330333333333333333333303333333303333333333333333333333333333333333333333333333333333333333333033333330333333303333333333033330333303333033330333303333033330333303333333333333333333333333333333303333333333333333333333333333033330333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 #3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333033303330333033303303333#03#032#3 332#33 333303 3333303333330333333333303332#33 332#33 33303303330333333333333333333 #3 #3 #3 #3 #3 #3 #3 #33303 #3 #33033303 33330333333033333303333330333 303303 33#23303 33#23303 3333330# 3300333330033333303303333 333333333333333330333033303330333 #3 #30333 #0333 32#3333033333303333330333333033303003 303233#3 303233#3 303033323033#2303 3#2303 3303303333033333333333333333033033033033033033003333333333303333330333333033333303333300 3333303303333303303333300303333330303333030330330333033333333333333333223322332233223303332233033333333#3033#30333333033333303333300333330330333330330333333330333333030333303033330 33 333333333333333333033303330333033223330332033333333330333333033333033333303033003333303303333303303333330330033333030333303033 3300303333333333333333333033303330333033303330333033333333333033333303333330333333033333003 303233#3 303233#333333330333333030333303030030033 333333333333333333 #333 #333 #333 #3330333 #3330333 32#333303333330333333033333303330300303 33#23303 33#233 30300323033333030333303030030 33033333333333333333303333033330333303333 #33303333 33303 3#03#03332#3 332#330333 303033333033333303303 303333# 3333303033330303333033 # 3333333333333333332 333"3332#3"333333333033332333033333"30#33"32#032 3"33"3"33 333303033"333332 333"3"3333333333333333330030#3333"332#2#30303"30333033333333333333333323333233303303333333332333333333333333 #33 #3033333233230333333333330 33323332333303332333333333333333333333 #33 #3333333333332303333333333333333333333330333333033303333330333303333333333333333333333302033330333300333333303330333033333333330#33333333333333333333333333033333333033333333333333333333333333333333333333333333333333333333333333333333330333333303333333333333033333333033333333330333333333330333333333330333333333333330333333333033333333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 #333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333333333333333333333333333333333333333333333333333333333333303333223333330333333333333333333333333333333333333333333333333333333333333333333333333333333333333033 3333333303303 23333333 #33333333333333333333332333333333333333333333333330 330033333333 #333333333333333333333333333333333333333333333333333333333333333333333332#30303333 3330330333 33333303333333330#3333333333330333333333333"333333333333333023300333333303333333333 2332333323333233330233333333333333333333333333333333333333332#3 303333 33330330330333333023330#3333333330 # 33333333333333333333333333303330033333333333333032 333 3033 33033 30303"33333333333333333333333333333333333333332#3033033330333033033333203333330#3333333333 0#0#3333333333333333333333333303330033""3333333333333333 23320332333320303333333333333333333333333333333333333333333330330333333330332#30333332333333330#330303 00#33333333333333333333333303330032#3333333333333332 333 32333 3033 3233#33333333333333333333333333333333333333333333033#33333332#30333332333230#33333333333 0#0#3333333333333333333333333303300303333333333 333 2333203332033320330333333333333333333333333333333333333333333"33 3033333332 #30333333320333330#3333333333 0#0#33333333333330333333033030333333 30032 332# 332# 3333 3330333333333333333333333333333333333333333333333030333303300303333333322333330#33333333330  3333330033"33333303333333333032#33333303003 23333233332330#233333333333333333333333333333333333333333333333"3330330#333 3333330333333333033333333333333333333330333333003333330333030#3333333033""33333330300333333333 33333 33333 3332#33333333333333333333333333333333333333333333333333#3333 3333303#30033 #333333333333333333332333333300333333333333333333330#3333333333030033333333323333233032330333333333333333333333333333333333333333333333333333333333333333333333032#2#33333332#3333333333333333333333033333333303033033333333333333333333 33 33333332333 32333 30#33 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333303303333333333333333333333332333333333333 333333 33333333333333333333333333333333333333333333333333330333333303333033333333303333303333333333333333303333033303333303333033333330333333333303333333033333333330333333330333333033333303333330333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333333 333333333333333333333333333333330333333333333333333333333333333333333 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333# 33333333# 333333333333333333333333333333303333333333333333333333333333333333332333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333333033333333333333333333333333333330333333333333333333333333333333333333333333333#333233333333333333333333333333333333333333333333333333333333333330 #0 3333 333333303303330330330003303233330333303303303233322333333233 3233330#3333333033 30333330333333033333333333330230230230233333# 3303330333330003303 #3# 3# 3333# 3033# 3 #33 #30033 #30333033330333333333333303330233303023223303322333033333330330333033033333333033033303 333000330330330330333333#3033303033003333303333303333033333323 #333323332#3303333303332330333333333333033033303303333330330333033333000330330330330333323303330303300330333033033 #3333232323303033333 33333300333330333333033333333330303303330330333333303303330303330003303303303303333 3330333022322233332233332333333#03030333333#3332320323230233333223333333333023023023023033# 3#03330333330 3# 3 #3# 3# 3#3# 303330033033330030333303 #3333233303033333303323303030333 #33302333330303333333333303 33330330330  33332333303303233003303333333033 30333303323230303333333333233 303330333330322303330#3333303333333333333333332333333333333333333333333333333333333333333333333333333333033333333333333333333333333333333303333033333323 #33333332#333030333033333030330333333333033333333333333333303333333333"332#3333333333333333333333333333333333333333330333333333333333333333333333333333233330#33333333330330230233230333333333232230233333333033333333333333333303333333333333033333333333333333333333333333333333333333323333333333333333333333333333333333#33233333333033333333333 3033030333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333303333033330333303333033333333333330333333330333333333333333333333333333333333330333303333333333033330333333330333033330333303333033330333303333033330333303333033330333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333323333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333303#33333333333333333333333333333333333333333333333333330333333333333333333333333333333333333333 3333033333333033333030303 33330303#02#033233033333333303 #33333332#3333333333030330330303330333333333333333333333333333333333330333333033 303 33 303333333#230303030 3033333300033033#23333330 30330233333300332333223323 #33033233303330333333333333333333333333333333333332 #3 #3 #3303 32#330303333332333030303330300333330 0333233#33333 03023333333333#233033300333333303333330333 #33333333333333333333333333333333332030333033333333303333330333030303330303333330033303303333333330 #333033333333330333003330333033303303333333333333333333333333333333333333323303333 33333333303333330323030303330303333330 303033033333330333#3333333333 # #33 # # #332#33333323303333333333333333333333333333333333333323322333333333333033#30333303033303033333300303033033 333330233 3333333333330333030332#333 33333303323333333333333333333333333333333333320330333 33333333303333330333303030333030333333003 330330330333330332333333333333303330303303300333 #303303333233233333333333333333333333333332333033303 32#33030333333233"3030303330300333330#2333233#3303 3030330333333333332323232323333300333030330333303333333333333333333333333333303333 #333 303 33 303333333#23030303330303333330333333#2333 303 3023033333333330333033333323 #33333323033 #33333033333333333333333333333333333 #3330333333333303#3030303 333 30303333033 3#333033333330333033330333033333303033330303333333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333303333303333333033330333333330333333333303333333333333330333303333033333333303333303333333303333333330333303333333303333033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333333333333333333333333333333323333333333333333333333333333333333333333333333333333333333333333 33333333333333333333333333333333333333333333333333333333333333333333333333333333333330323333033333033333333333333 333333033333332#3303333330330333333033033323333333333333333333333333333333333333333333333333333333333333333333333333"3333333333033 30"3#33333330333 333"3333333332#333300333333333 333333 3 # #33333 # #33333"30333033333033333"33333333333333333333333333333333333333333333333333333333333333303303320"33 33333233233 33333333333333333 #33 #23333 333"303#333033033 #333033303333333033333333333333333333333333333333333333333333333333333333333333333"333333333330333 333333330333332#33333333333333330333333332333330333333033033033303330333333033333333333333333333333333333333333333333333333333333333333333333333333333333330#3332333033330333303333303333033333333303333 3 #33#3 3# #33033 # #30 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333323333 33303333330333332#333333333333333323333333333#33 3303333333233033# 33030333333333 3333333333333333333333333333333333333333333333333333332#3333303 330"233333333033333 33333333333333333333333333330333 3233333333333333 # #3303"32#3303333333333323333333333333333333333333333333333333333333333333333332#303333330330"3 33033232332333 333"3333333333333333 #23"333303"3033 33333333333333303303333333303333303332#33333333333333333333333333333333333333333333333333333332#3 "33333 3333230333 3333033333333333333333333333 #30030333 33 33 333333033333 #3 # #3# 3333333333333333333302333333333333333333333333333333333333333333333333333333333 "33333330333333#3333333033333333333333333333333330333333303303332333333303303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333033333333333333333333333333333333333333333333330333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333033333333303333333333033033333033333333033033330333333333033333333333333333333333333333333333303333333330333303333033333333333333333333333333333333333333333333333333tworld-1.3.0/res/force.wav0000644000175000017500000001066410125477410015602 0ustar breadboxbreadboxRIFFWAVEfmt +"Vdata)1"uS#l%o +#QQ F$!Gq NP +Hw~$-# $C `"$ݕwteX>?ߓ iiog ) ,ka? ~D3 =u 0j EgT _^ ^)  =*  !B P!0QK Oe[Z%DI F5f'r J s^Sm/O ye_)E]F>N x  @?K 6V@inH|&X;|l`j)V*s6?6}e23xV6xRS W^kvp<iozI5QQ F$!Gq NP +Hw~$-# $C `"$ݕwteX>?ߓ iiog ) ,ka? ~D3 =u 0j EgT _^ ^)  =*  !B P!0QK Oe[Z%DI F5f'r J s^Sm/O ye_)E]F>N x  @?K 6V@inH|&X;|l`j)V*s6?6}e23xV6xRS W^kvp<iozI5  z@ VBk I LD'WVuw :lSj3E lu,z I #d%mFw'yQz&3? 24 xl0 s; {98H+DU!0(e5QyXBEQyKa* xI&E4{54\he^zX[Ku-Y{<##R?w=19d-KiN:O&:x.O@"Qgj;:_lF0qB`d~TCIR B W0"tworld-1.3.0/res/oof.wav0000644000175000017500000001263210125477410015264 0ustar breadboxbreadboxRIFFWAVEfmt +"Vdatanwu2O%ukl {.RH|/WsSpAnt3Sr+A~]i 5  r'Aef+(c%1H$*b )O <#bKp N-TMa3 R h Ul\n|2hYL\RW I Y{#C8F,!jf aA5k (+ y .]=^7e Fm0{o RKN kD;,&b* C3 eL3WM  EP<2^+~ge(nS i} $ 4 E %'8W\;x$t1;-4@ u!65A Ob"_] HspWD@     ^#6wZ1wvxURn )z  _a{"M;m2?==U %! N\z=0?*N>g'5 ikYy be(}^}}U.uejo ~ K ;:npO5vx{Ba5`Ke)g+1 7v0*uTsoQ k z&~G$WZ z0uAR\VQ,I08N!M&cD J>nI{p7.I9lXtQ>_Lm #y-q e! 1IgVh K@8?Vg\%K ? j$ `w/D+h:|xOoTEMa"#2%"$v 2^v!lvB\.8)b|olt%"%+%5 r Bv|h^!&7)`- S&,M( 2] #0tVJ~x~\ A /w pq!-2& N\oweSfsL 3 S$G.23+ ^ U)) 21nqKsxa#aQ t>; &+041"K_ ]+AHC J6n<-CV ya#&++ o&l r'AuL'h81%]( NIE  uB5"&W'HISWTY$;q<0['YVi_& S & &Vo" s#z Q i}i@%U{\P=F!  Z ? ] E_o}hsXc !!~E"/) a y j  {DEc{OG/O[d\'tf}_, % t j =@4h?W  I |W29qY121?OdfEVEx% T T  / t @ ` [  @ f;mTVQ8)Z3DIM {^^8TmFkr8 :-p;bY%\oD*O?V*iqEh5mf0>0({U LCD^[R]+uyA6pe,c :6%c_.yaWc U.iDl0;) TQa.J)m6mM5 !P O0 Wnr1?U*\psK|4a2x|KFNvG)EvWxV;>MTRB[%BV$t$;JXR$`   z  ? z T O o j   1pIj  goZoh@lJ$6 Es1}7Y2F;=ha],f!RE0)ITzG+:Ji; ~u?f9J[ M|dTi ` --w+w"B!,f! ID\20uW&Zw'\xhsnHF4!/Q|\- DPvdk.z]6+ZB $Jl6X#`{d2j]nCiY`dbrS ]Bo59IYE@G_dPhoo qoqW#cF4nej_QTMS=?DXo,%lZ=%fD2lL$ "***!18EFXy$=] 7?F_c;Tq{hizko}i`t{]>2hXH4u~% =KO[XcdXh_IZ@tworld-1.3.0/res/plip.wav0000644000175000017500000002121410125477410015441 0ustar breadboxbreadboxRIFF"WAVEfmt +"Vdata`" Xv&nTHlVv|x~-X[4. 0B20Bq\w -9%6'2=?;.'9VIR[V72? w6&.K_HpJNC*navdn>OiEw|Et59 7/N\:`M!yVJ`pwN0KR4@v>7?9d_{$E"`&*kRf!H5h_*?Qq)qPI Q]%]TX A :I*) |\&n{F1( c- W@I ik7 #g ~ i*qz ify M Bc1/&Dov&$c\H/'/sr=#;.qU\GR=09VOKj 49VldOBDz.~Vds"Vl)ulafH+T.9nzQs?GQ$oC<L0*]Tgi"LIw/EVna9"uVO$;-k0GL?d~p  ]_l`'FkvtQUrgU)Q__"~v"&:xzTa/6KI.{!q0[<,.&;@-zX XVIdO Q9n)wa2mhZ'9|~V?;+D2xQ~4 o Z2~ITVOzq6V6h-T "I sBuJ%2da2]QfRh?lAjax'?24%%daT) ?D6RunI0?=_6j -oB-l8ZRj&;zX[qoM\ qsAjVO"$X@8_oX'07\aTFTvuo X 4vzQ@V"4 B+ols|a\Fu0%Q@)~eKI $"QQBOc  72)K %$M.) ))Q|d2TX4"_?   ;4 % 276I)" + 9TBM@ '  '4ZvRqQfB@ZI0;9RfXTOT7 "%4f'B.Z7 $2oj?dV=D%Q)"7%?;$OR2      9--O@_F.'-Fxf 6-?f~d2%;=?K)$Mo4 +TzFaM~ 6~\ ) w"%?0 f\a=H6Fq|uKzshOosw+$0O4 4?KR9?R).=j|9 ThmDvZHOmqVxomvVTTu_'O[) .$ "QQv]f_/BoAl9jsa5B~X fxlo"6@q$ qx@Hd )?@B7;h|T%O_mD7O- ;BIO6 $OR-B0O2 %$=%7D+R)DRZZ)'"|ZIs %"$Q)%.6aFBO%Q4G$8Fg E, nrV~;hA0[sS}f8E~HA|C|Eime:fVYM_5; u+"]N*@[$J'Z 1-$s<j_N+"c5c:IFJ_HfchB/2BSyt--3/FT<9$~Sn0x@jq\P6R qJ MKT@hM<vMH6Cz A#}aj.C  u [  YY w ( # *kp iB2"W ,=hZ%tbk/ 2ru _{S:) U3V^ kA2 )uhsYQ>2awHdK230C>B 4/9 )ey7_rr~ 0  * &A:5agZ,-&YiC15FDxd>% xIf aDR~Rq ]``aOp r.7,+QE1qfF''24Q' Y_h+Fs_~zF+=n0ZM2%-a(Fr& ; |i\R3~Vfnse{F$j4zc&jJXg^Xs&V84MVA+9uO|oQ6VdK0'jvhqTudvdD  "6FHTmzmZK=" 6c]9" 0FO?% $'7KB | $ )4467.'$9vBDH aKOS;"+Oehs$ .70"%+0+%   "+0))..'  %)"-6=;90%     %$"079?BHMTTK?60$%9KM@;BOTTI6+ )0 .70 '67) )6BKI=02-    $4BD7-"$.-%  '6;6+%$2767762-07??9) -760-% $-2-"$490%''.0+--47."  %'$%  )66$-OfcTK?4-'$  .9==@BFF?4) "%26-   |x$460)    0=6$  '%   %' +22.)$ "$$ )6=DIQOMD97@KMMTXZZI=046tworld-1.3.0/res/snick.wav0000644000175000017500000002136010125477410015606 0ustar breadboxbreadboxRIFF"WAVEfmt +"Vdata"'>X3zu0z ks 6 AOf-4+1y "\hiLQkSxNH# m (z @]H<D u P.5'ex7J1|c;J5!7<kq4 @Ab_G(Tg,YCV-#u+%Bw_uvn$CG2-f&0kk`h VoC'p;8+H*%'qdx)_?k[em Fw23H94d(uPdTuMnuPz.b*n y#.~@B )gPvwrc$!Wni9%N`>lKM6`^pxz$9;?2!A/$$ -4%=)$6   %34).* !$3/-RA?L_rcc{~uwzmQ.%/6+%" mioXovowgrsx  #$13"$B:<ncEVVH+.2  iy &  -5 !$#8-2GNWD?G773'5073;O?1AJ)#5  &* $-'/2//) ($&-  # #;9F2  $/),0CL<17>6<7+-  -2(-0LDQQ[yj^gF -) < )) ) 2`uZtt]_H6:3(  +$ " !     (+#-%$ " %- (%*1#7A:;30-&%9#$HO3-1.!%5A4"# 3(0, -:0!$)#(')&$!    # ,  $F9-61$2-    " (" #  --0</(6/+?FWF,.0*(B$'$ &-#.?*, $ 7LUUF:5.AFM`PXHNIC_IMHOR>-#?47G/-1@*>OcentA>B7($" ,+   &  EV0m5[S   w .0TbtQ~&[m"&G<B?EkbObZx-PE]1RMpm9y6oIJ Hdxq j x P nb_ ~ $4EU*Ppa\;CS%Yd 2ZW0c[%-y&KYQUnGW|ailwZThYTrEChZkmYVWCZMH{  %EC;F08-742" .8-/=LQNBRTP_WU\~~bchoq^dZH55MFWR6+  ' !4=64O55H<G\OA@1MU?.   }~yo%#!3&+==;B8'%?NMVK)3, - :]Yl{MhlNOP1 $+"  # $-)117$-- %"$  (  !  "     $,5, !'!#    % -$!1-,0*6G-+=6 $         -:JZOF@?8-         %$ !    !,%).$"       "!!35,08?3/26=5>>68) $'$       ')$$   *7;R4l2R *6                tworld-1.3.0/res/socket.wav0000644000175000017500000001327210125477410015772 0ustar breadboxbreadboxRIFFWAVEfmt "VDdata-\ > 9K C ) |Oll TD@/.X  4&@ p Gy{ {% F f n'yzILxE8w?ICV)fo.(-@.>͡? h'/_@th/:I*_(E)Ը2L.' c uF3U1H(F(3}W(w*i|05 ;d  M S1 & LX5mf=+ :Ks]" 3HᇡK:6T/EaܬT:Fz=ъOTge쏾fX6fٍ\ZC5%SA*.$ WI Q6(#@2 q0A=E*X"9.mL|';4L14,b΂7P&%_y&WF\Ge"8"k!R?!QO|F[=z'EM~a*0X}br|Xl sC{!PW+$~yh3Fk3B-ژ5卢Ir!֑6ϧ\XCĤ7z9pXCc1\ɩN#kO͠/93iA}KWo@䰥oօN,Y"!L#,h7)?aJ#.euy:/K5b4pDrr&YJk͉%~r@dALnV]/y.M"A"׈60CyϦ]͓3hSsXõ/Xi?AB}Xw5\@8:(w+8QR0pˎhφc!S', "C@Znz̃j15# X 3cIAP"6?jҥsq!~8"0;::)6s, &Ugz$նRfΣ@<- ۭ  g[p=‰h-3%S0K7a:7Y 2+ !u0ꊂk}#NFdICY _ʉT,"Tݳ5as="$kq߸{>*r/᭍B.!QEH')n 8 "37=m6K1=<š8SK! k˻>n1@벟C73H'2)(Pdh6 o+/a׊-0 f6ֺq`.7<'F7d:*( b&pPk7]$l)$)Sj "02VLߵss_},J 7 ? sqex.]*h , h I<`V m :@H K L (.3B6v JA e s  # IT4 zJ L Zۉ~IIK/= 'G6F4+چ]!aQiNr9\!tU/B%9:cf:8  !z)e" A|qnc"BY/OB({yf)jo&& Xd4rB+.RK..wn-@`Qu6#]|e7Lt{ n2?f4h;6+C*FD\3=0<//"&D27zqtR?{ms,R?z=]7W:<o}*\uH2z oJ#9=+oY_Aa,cY'Q \0Jqv`fPJKhVb\$JT(&xQKDR[%tpVX#hAZ?ZBrSfv?>3rpBu, C%.Rj#A5mDl?vSL')@H9M8den +T2b\DyW4x|I-Xeep 9|:3Y jM6ge,uLYtworld-1.3.0/res/splash.wav0000644000175000017500000006023410125477410015774 0ustar breadboxbreadboxRIFF`WAVEfmt +"Vdatap` $%$*(  6  "%-:;  .'! 7@6;4)""$E6=ZIPRMUT?ILfv}cKH7"'/6K2&4i~c{r2*3 :IU|so@\: ALpunlifHcC 8.D2yC$Pt;dS[*'h}"MpHC$|cg'R,dta/V.K0XfMz^RxyHtsyGVF+Q P}LBXs5DnJv{|84n| z'  &pZQDcI&if[peep`9=.rCJ.% g  Y>6F 9V  / *R0e;I@#@&UDdS1fe>TMH`6QKME`$b&f[,gMW2+[*\-h",1,@Rx I'{fzo87u\T2{5)n+GUZ5A:$z`KdZ JSZ_7J/ f{$qh&Vb b _3,= rp.bD\'.5q`*Y 4Bmv2#lY"   2t\fO1Dl )[D `8w(kartqfb`ST2vuY%o-Inb'n*c?@4~ 8_X_[]mmiB2/(M;,'/8Q @" %dVxfr[+pbS 2$C@;!DM+> {w[ 5 +2| T,Aݠ(kTQE H Z  q % V  &s]{%1E  CbmO)6FJ@ ;h x l T, Ev?5 Vd:. Y,nmi N/mj{|x`;lRW8/Qy_}CP),WEx\0'Q"\0[yVT=OD#g?K|Z:a8&^^( "+ U|UG"$c+o a vg{u6 c ,q%aV |tCORTBe ;  +\ kY9r &*[  P i-$Rd7T kQ }Rxi  ,~? @  ).!Rv 94 <n{{ao%2?d i(\wX<fVil9 /u@! A0 AZ'8y n.tj t"R6 wM)[ MS6" I6 $r y1c6TA1f 7 h   G 9n0,yPS%p > = x~il`7(n r Y/C+qCI|. S Y7?iG/ W| o\% =E bUB'y>y ?z" fM \0>1x[_}07IYM.vHm5Tc<k/jz,AZ?1hHh1T0JP=AEOg'O!={eb'F8V50zLV:'c UM { :P %d% D\^->~L _9Ouq5p79\ Mr jjnl_ '3 O&j rLv pT `# ` `{v]5 'I[0IIA~yB%v]X[8Y+c@W=tXJ{aFm!?-N=gk"{ wFsujl!!8Ja GS:/v/NTY80.Az& ,k PQ14.]JOr|l&$ql?$-<'5'VN9-5CS"GS &xt R{X+2=JQW2fZg&W . ;sAWoAac0 Rh@  P!vEG @coj._KUd8}\X, z [-c.hp ] Q9$ v~H g jn)| f %[Pi@=$Mj?L y5 h 3sf_ L q D 1 V>|phDM\gKJ#v@ .R Rla(CUbnV D`ev ^/ >F@?mgr/,[M4m-n +UQ gruc8 * LLa6^ ~ 2 ji Z ΃l*s =&WkЮۈ "G9t%.?oU VCs#Dm*6J $>A} 0Q(rUd(mc 'g j^0a> K. ^i[w[q U- < L Zl[G& ' z2q a*l}f<+2 ! m{l=BFEH\  n  ,|fLYz&k G .5ql6a2# i=Wq EjW  e#2 _S2Q13 Me Dy_1}jQ -78D sqc^ xl !@/ 5u u  madY3L Y  L+c(1b0.ns2bV00 / d t*v B /2 \  q"&  ?NvBME]m8"q1Zr1 [%;m# (. S~x m s,a t Y0F (%H)= ? )Ed*  N*s F,*;d%I^aoem r*2(Y )~uK P:BEYr>=b%LBi8o]{XP UdqO{u8I+V{)q!X@Z". LV d&#_EO`ax^g H `o4 CMq!0 y 5KXpvK3? ?'vbn xYw CN jS`z+~p l mGZ K|akތ/ ) #}Y>u&HA1& A`h 7 ujx < X\k Fc_ *N] /hYEF} %Q~ t 2 [t 5 w=IRRJ !5MwC*B>"f  hL Q JqHyv c {oC<}o ZF_MV# v nA1b G6`5m P8RG$l 7 ` sc=M=QhhP< (_H>EG  P  Iݒ~# +h.{z C_RSr]&\_U2| g[HG(^  8 S4xT%Nyb!nh V4G= ]o`uo=o9rsr _Y@ # e#nW|:xK = N lb<.Pcd( & HA-b8 8pDzg'"=m 4!fM4'*%3/ ݐ!FD ;>)`   16F  X{$8 r @4s` Jn^<"<H/w ? {Q2:n,po/TQ]s0FPI[^>N% ^P2LTFf Q#D1.SO N ]zQyGj-JbL  9p\Bpnp<' PZ  YR;B=%{ Nmw= ' 1,O^`>']IGZ3`_V ]~IR"FyvrS\@3'W/3ZzU]R7y9-+J o+ {*l B_ew- I/"~>! 9  <$ ! d4Y9uH^Kglq }20 fiV%]} zqp/ EgN (c]\XW RA XuL^\,& k]{+lhz+F&[w=kRL*yCf  gmFe_V ciG~~IN-k%G.@I2TW+ *NV6a[[x5 -R&yz#C ko@OD D}P NjRjpIt]$ +6>O;,m#O%]wy;>8K@>(o~/YNpA:bZU 40LG{'j*{1[p[g+C<5fqc>F_rX+h}w TlZ[3er,YEr ~/tvm>^e.CJ'r}VF}cac{%#o |_w`ZA8,z Q D%zg}DgiV `) J!q(!c3sM&1_"!z,&N.upo6NJQ6J;na3eb}<LC}W7NH8'#h# *E0ME3kH9iDT V/hf\ )+8cc 0I({D}$~!(p6/0iXBr ^0Nx w',-=ga`{? ,D`3|3i'_@Sd1uM'\4nsIII%C<]GG WI_X`aWc{ /TaeAmb)_)\k E-n>r]*N3FTL%H*'oxj/GdzC;%g+[pf?k[t} O` 5b&m3m0F<NS- i= 1r[=OQX  ?=nxgtfNG>g3"'GFu!~p6 SmQA _UHDZAJcb'I2"map9:'W366`R9>B( T9zch8Mh(?Mv .1#qVx& 6 yb%T-Q :jUAru[m:&)\m#62DN7BPr!fn>y:M&3OE#H-hs3k U>> c&{|y >VrRfX&V7I$I[jy}W`3(VSMnMc8Z%%);qgf@$P7LC59a~MxGc,c6 11~4|v1cg3 .Z9140UsE`/98OP6:fa/|w_". 5-{T]?qe,1uA1m,K7Dh" R?Aj 5 ,qMg^hyi'Z VC0>6NFA,iPJIba5S!hZ} $#|G3|3>06jP]X@EW?sgBD%fFuQ|g\0@,vW7: iG*3<8 W/RyQ2N(.'UQ,?uc=hY>E3 sYm/}0= w6KZtv_Bsg@c`kn-0'2+_h0DOjI]*#V A KZnR%%CL<u"LpCUK |YVH/Wl'.5W^i7HzBCbGF^P~ ie t!vc[ !5~/m1xHq:pQ*VO1wgD'q fJJpDTuB< =u HW u6MT!))K'h QLzYO|N(g_W/DRI^i +.an?7pin)7*?A6.u0*A:s%`5$3T/c=$m.5an?~?"88# 0 j_88! )&Qa *Q =Ec Z;8wZaF7I:F6Z5-d 3Q,Ag?TDz<n$W,.d {}<7NQ'jeHI(0|I HPT,$I#%$ )mvd&Lol.0wtnR,pD8pDM$6iB|(?$#q w#Z#k,0#m&oEc]+j>cN/ | Cw+S2 - rHf$FUN<XAwD7nH'a"{>3[ NQt:`4?_Mt$ml^tyu#J d9p> (N0t\3fxv<4)?=j0{>Z-."6}QTsD@EQ)2w V(l8%y.1! LQ$?I#!4Jp?ze8^m!C9cw>ef[qj5i :>J#;$51-lr"/)WE# AQm- (T2j^i ^o I@0c.@?-7I,iN$cH3C# uW!(;] "IcVx@U s*Wem:(7CD-lD^l") o c )A/uJQ 7+XQ8qUr& 'jTx"=e)7W$QBNF1#X GT8O14-O)DRrB6K n0 '\ (h43lZT'lw;G?I%UdrLq#,6C{1]_VN$6KH(dH9WO2 =_+6K.@S)/% JS;tFc|?8Q=0* eH6[-5&t ?r$cBY # }]qHGT[t]I!I Q{ye(tkn7`2{^x~lV:PL%FFm@rY+"-E*t$iU? wf0;%*f$+x#d]V av9skZC]FD0qjo v.TOB@kte3]Kk]0]qyxgZ[u M'pAQa2*(U:f)->:Y02CMa(^tb>#TQs7zQ$-fn[9 DB* Y?f"J FE 6}o'} -^1P@C%`+F<? pOa3P[<4:POVSD)/ " [LP7@vS L] k! Xu[$8*bH l6Ez6 v?glN5"6Z"u HzIdgovxV HM2 QA Bysq $P"| hG+ L D9v "oYcha/n{Z@4h%/6%C*NF [(OF"[;o bs LhL`2{N;wrP$3 /[`8*S_ vw}1&c"? $ O67)f9*B4g}'_3\y`\7mjuS(c Yr .G,|=3 kT"P!@OP%<YL42@)ed$P0 pJuk4G>L\:{vQ[so^@ &=--&    !0   $6   +R._3#+.7c<(L6NrOdllzdx4z(*6 !cSe_mNCTyA 8AY~*Y,!$@(KK]v&ih</~U5>q#{0]x25Z#0y]R !^Z?C~?0OY& aHcAu PI2&a?P0I>k3, )U?:ErEV.^'uH:AW0?)%,  $C=&L  M?  </-5"5-I F ?B ><?+MK?EiuHi>eG onja$Qm-QZ ZStCSnGE+AefWR3J\cn 6oKcQblnym m D* %9 ),3)9355&9,   tworld-1.3.0/res/tada.wav0000644000175000017500000010603410125477410015412 0ustar breadboxbreadboxRIFFWAVEfmt +"Vdata6RXI=TTZ~z;;-/no/]_2qbR$2DGc$X=~V[hB6nDhV?c4va]$0TFO3OO924Xj2nO4T= iu _[d9_n"lH4F~s$ q+h__%o~ZO]FB 9o-;K|V]~2Fma_H4z9lOKX9 l@hXZ|;]R?slxO._=\I6?VD3u9_mz-Udu # -F" ';eM_ Fz96Q 9m)cXShoqAh072$;T9|=K ' +yo^]:M;^2F.Q Yj"I=-YIBzX)m_]C'wMXp]~E`8u\<$BA0U\dy5;4@E&W3Wi#7b?t_Wm*g97Wi c jf$| a4hK '/y6 9 1HM ~veܑx i tM>9STE B q$r W5'!\ 6C ْ .&.+E FufE) G 9\  9ToAYJ  0/RV.{!zFv] q _vi3"A0ϱ$ JMA HB+ T [i kyhUlIi ^ -/\ rb ~V =E <`[F(}J TvO H3' yF/kG i8$Wh~)r W l *hz  E &CGVz o,>bS" Vm$:2n6 h A } m z n okD^!_Y[e7 Q;LL<IX{ $$1,H4{2 ? +bfx~ GKA "% r  VW sO  f  4lyEYmo  PE { D(+0 U%.` W~1 v2 #g3<; #+1^ 3;nvyG2/sEpK ~Q 4`:"?L b=2 P:w:K4DdA~fs4Z2  ]6T m<1I\w3m 4 o| sBWF4.#eRz=9@m+gQt `w # _g}?{~j | : {f''q4hT oGp;oRJ! >:|0+}C2U]$=-E q,U 51Ha0 n-[ !S;h4S8JMFQ~#zF!,_{\\!zhnTwlDI sxkWM\ +;tdN3x-)nD8S.VfB+7 VXhSiAFn/Z]=3^=vWDZ9xv=$Nn^a|mj_=EXX^;pE=1ji O@+7au0-]&zI?"d,XM7)u~x6lB'+8PT7TvZ3I2$xd OeDX*X\-noH:nS6[0z ] 1d Kjs'NFHD v})G;Jz~PO/F2-6f]T-=$X9aMwA)8~J1"=HR4'u.IaS-Hw/[%'u|8T) X@MXq<7B .=6oQ~=~xV0^RQgm9~' '~9+:Rcr~ V2*J/4J s=P\rs2Xhx?sX&(%2XJ-J"^~qBhzV 9DH~4; V[+Kz-u[$F8$%m7Ux+9HaR!_?Z)> wJ:r+\MD dBmBFmr?&Wfz;# 7#T%l=(B| FHz VqP3BuoI|z I70'xc")w]5f m_x|&Z-zB;$C%%'X-T\T;XQ$[}B7l6=z6_T+ hJ:w o$8P-+E00_$~YZ 6{{X[@Vo I_4aH@6V:: 'ZufHRF%-qebR]NT&pyc|i6a9~XM_3qdmQ;]- s&J&wHQzi:nL8$.OH?.hX[Wqa99?[40vz;t|\dk A"+ }l+?U]^{^l$bF,. MC 0WA!s%,o8>)? " |!4 J^.yb*   pJ o ;6GG  BP/}6w_=7 |yEQ@T ScoVU)U^ xdC!4 X 9a U!PBE'dm 0[Y9  wOLv: \{a FyR~ A.+o l" p| *+=nٚ׾_ S : EB?s'zgڥtjT f y_}ͧrF`*txn1T %jcI#} v e6Qg'8#m-nE&eԛ-5r _^  zm b|1ݳ(6!τc(*k4C0 .GQ;c?EuDH s$\]d `! *:'imD08 _^U-!o U i% E^4@|؍.Ƴ&_6U><H)a_)'&. / %7jgݓ (7_Ƣ't"Dגv%;O0>һE5 qѝjdg#9;N%T"rð6 k<n+̵ŗ/&sUj&-Y ,L&p<1fC,[T<_bf[87Q@*r# R9bB70]Z[ED ZlV@tW﷼7"\;кC Pl6*,0TV*=ӈ՚Z0 F ݧ4"Oe #"?Y- F9& #٨E! Y2 㧳~Ķ1_M4$P'FIJĎ@4x !f6r"v<#jf )"ﲜ&*# 8 ,+K0^Ш+bP;x*%ֻBb4^MŤ'$ Le Ռ{*-Z$~  H h1 ݽCN66$5D d>Q +\Ѿa(ٞ40EuG9%CHg"ᶬW -D 'fP6D(-2qav}sG3 u['͛qm/ 9:= D([Uޡr93/@j#Yzm:FJ" W$ &L+ Pߣ 0 /;"9/~ IA,~ V2 r# 2 %(0u3Yʽ P.@& Z 4@ M(- ;$fT-:kمr)wf.,k.sn N\&Ƨ(0r+\pJ*SF *U8%a-TO0Ҷf7I!4G=ĞͿ&2v- y/ =r_2~'lSs ./Ԇd4߁;];w;K }3?QJr AKJPrޡ"'-E.H| %҉,;# x$߾!=>*uKw h@Z縱Έ#/;1#s`S0; o r>cی45 !(dE A#-Y>q1̣*6{'b0Y3Ǯ̀M(*L'J?8# */.bܾӡD?Y')2-(Ǜ-6#&*7u$ͦ/  z: :389 N8".Wa$д  ^} +Nݚ˂ 'D, =/GJ;",?/[ޤms 2J60콾< ? k U/bT _%, <"Tm) F  KLX  ++=%>00OZѺ~"V'u'/lJM jQ^Y9$ ] Ӧ+z rLF:I ~UQ92/iHJ7e X:n(ų %Q vL'k.Xe  lH%o ghɊX`#>^9.r:c@@ӽZQUw780 =J#P[ ;\,ك(9BYOVPB`F 2 E !{ا$ $8x *}ع/:'/(*ᮤPH4G x'Ngٓ3I.$2Ok@ [xpٸ:OZN!Qz%&"u9Κg"D/tD8ch Q /"/od)9 ԵP 0j-XU*/ϱ7:#"itD5=Nq=!#%6ZeQ3C@.m]%N' _s,De <M'<]0dB#^X?[4.D EOZTsY+ ~$Y.Z6O Q$ҍ-"cc/B['=LOM47*<JN< ] Gfma$]uM]7){i:lG$E+ E/ ׌#۵4.<,ZΪx K5&" GbYMu70O1صҐo |`H):y yӳ p0 $  FZ \ـ?%P7AK  ңHuDI$Zĵa)3CgR ` DUB ~ "vxʚ865;ǘ80q2+-89Σ,JPTZI ,W9<( {Ϛ0C@/ "dj Z΀/'bT.z}Bu!Ga$ڇ}8^ Q_ bn,2 !(=4ՠ (ݭ 3_%vGj3/# p?}+_ 9DvN-_ ON q.%:#M? 4 M ! F^hŎq(B.OT hKxRbDciGUƯ!( pM*3 HX$ 1"\g,^C/4=,!/$h֋CP-n>a  ?  *ZsSeW `a6D M?*)޹n>`!S(t4 IP9mI}} ߴ  23; 8#?g5vb+1/98D% 'L+s $߄fnb(m7/19k&'8 0?1x /N{iu : qM_|O x/sRi rF@iFA|(-&E9@(de$H* hNB!otFu .]A0TZq(}ؾ?&;%v. 'G*U/Ct?1g&8i&?U8q ` (p"\4]y  y  l8I9 (̸$~ +1Ԟ\7:j,~ ) lRS@) Q%˖%.(T @ 0 "H 305C&Թܾpc)8 lӝT 3. 6rޚD %Z$L& $O#ݟaP#+{rL#T-9en{<C)GsU !|_)2.A TJݿ%HX:FQDOT)C}n<"*gV>_(, 66 <Ʌ$LciQR ra )dSIG3+s sl٭0Gr,!BW:DS}cҘ7) Жs0 /Y&2)/Bń >$ɔ1p'ݤ%_%C)1 A*otVp/ V E t/J'Y*";ȩէ,,y] X'6!8 6Z%_;p157$=> Q@,JR?QD3|ް@ aCP  -705Xȉ%03Q!7r;ݷϥܘ + '1e WFj0~ B< -+I?:.%%h@&bY8)>3up$ 4-w0 /dzK?49-?O X"j՜U6^۪$T*8н'8:)ވݿh(5ԏ/o@G+2cu|$4{ ) q evV1*z("(n1Ƕ<*@ ) u6k#I{jETu 1/*tKj$9kݽbT!@ZQPw[*դq [73[p0.A J(j8 fDRgs Paף` #3 4Tv &Vr*")BpUzaQH߶?Jm% G,g #%~^ <325^N0g +_5LQXz$*BZދޯj;.Fm!-Ȃ->G -Jc}%k.f.S5ڹ7W~tmo._s"P 3 ]J  ,W)Q /);$ XQD,=-H:tWy3<3ޫ K,Q:j s C2!vE2@wJ>״ E+Jݧ ..H ZT !E*˱ݣ4E, -a?Mr*z".+(j!"_GCe9R@69 #"wрl ft!p bk&!BV J"z1<pa T!AbY B|!K<_j('n `^ . 6,|B !(E qkGF>; Y/܏J < 0' )4 uP'Z j|߽-8y6ԃ_E'YU Su&r '2>nlSp"< xP+Ɛq<`L+ si PO޻z9G5".7P7atd!E6$  a2'-(C C)>#ZL&"tOPs۸d>f!0  =1 q,tl܋f+>mb S_ hA@ !oTG   > B.J }N3UH!By* tK@ I! |bc۠R9^p:޷#Wەܾ B)JPc 3,!nN  36Jݫ@Ie6){F(  j$ )[ z T +ddQOWm @>$#,!{ n" tNO?[S%Gw""!j |s9k * & 8e8L}x< 7>& {O P  (Eo{G&M:(1 1*z|] !#2E%!; qa 0V 6 9#2>%x Q 0 c*ٗt   ]} ?Y%; %hGBe7O B6  S?K.jpW4x ` =kJ*2[ *=.  &tQ %K@(ѳCx 8_V_.<}!U . 9 {zG#$d mUK>8 *  :v|h2)!) Ha7U- #*ڝ:  .?,F^C) սYvۙ%s02pA% "մ6}4;Y*JM&]8@Ha[x 7 Rk*l< W  '!0Es\  05pyWNZW7*8T؏ /i{'Bi3ޙ2 #0$.-!W(͆ xi-4}" u >u '  G'u$})u iv.EoT9- ءDE ur* ye!4X_ yx _ $ 6rfV";VCUm') -dR}PK.x-Rf_w  B` ]K dVR- qP3Sk{ aO4{*a>ަ* l$5* a=LI0 )o&Z 3N/ I!(oz4 >ppc}`F |9G$9af&'!7[ssAC%C.QTa c<!R (#Cf<p?*!Q"9 Pn2&bY+W gKn2 5^d$2    _ ) >)w& ^.؂X%yO2| 4&RBe0l <m2D " fժU1 Q v)&IbI ' nGfn@# l  vL'@&-^1kM'C6cݷE, pr!t'p6B@2G"'R{  BjՃc HE;<91) ^? ) xmhA5DMסVOHIcUvyig O_S+( aG Gx#g8) - `R%%Z #hI"cs@]g 9Xk ' J  A _a+pS &t~+g 4U8% &w?JR&5&_/YH2NsK Z[M5'oy"Y61 (% [4S lJLS7 R. z. 9 aD D +k3_=hjEb`?_}wޛ6 _r'Jf& 8A e9 $CO% khۓx- *N9DNM! ac[1)U3BL2$Mu sj  6 /%ni xNPS6+e#*|pe C*"&  yU +Z1  >?{jM,2n( `!7Q_ov7od%Fw D_3\ z  L 6gS 5[]} :cxv2_ ` n gr>{  YfQNBr u 5{~m Xf@ Dp/ x=^3D&k"{kigX_[/X KS{  R,xf&W  5q5 %}\ f4D+2  H} mb7:  =( >mD K[x <[bqmTS A z8H)  [ +nFg D UUf 0  0lW F^ eG !! 5 qc&;{hC / +*y .Y_ >  nCc&[ CI:b%Xf lZ#   nF . J ; {ScT4q_Vb@51M6 i  6V ' 6R K!$ 5K+ z;G^ e N%\_e. W3 Z>,%D%|FT% aamwHr \Mvl 6! e +RY^A f<[a) - aiZ fOX&(  ) Z\H H k8 m sU  | ccC6C cEQn : pK' "[S1p' qj -@O@ D '*=- v&3#s a6 H %.K @_qfxf \?V 4 ,(, F bG6XqHO $yA J, WRc-bb| D n~E{%h  l^ Gv7 []H?0i/s?k S  @! S5^ G+C8 Sg|b! lejh"G)5r5 w5B m-M  k/XVY}-9b+ ay;y3i @ck' * 4O~UVhQ{>,{^tdu% f 3lui{ !>_ = ]D   i V L &K7M5`5 }M)u 4@i> *k1F'%Nm fi|B 1Hx px89CK$j>%=l  ":wKH r ?%7uK TiOB[^ !w) w3Y |"<$=*)Mm c0#xP`8-=mI+m~ \sB~(A+T}R_`9<v 177* qTa@-)S#\^hAR,LThd/hwlIqr.#./jv% `t { c``8' 5 e%=\p2Ee>suiod5y] 2e_K-  ?,Gv( .ha /\$<i*CPWMP#l?'3/+zBzHLq73 ;$j-nREz{__9K@aYBVG!0 YA#X8=pM[P T4. {'\Br#![#kT'3A6]\& eSJBl$N; q?4$x'%A"@Cn6JU&R 0?an1m\3OO}\RA( 6^d'n\\zXY\8#&9;3VzK v"I;N>7r?th%_s{*Z2'u4f,=DR`/vFnWC.FExi$3?ozh3`6iQ&@wOjc9 X3mpk;@I['9;aD[G[U8IMtxd;oV5Y@mum4nFcx?VzOw/'$-l9MS@If9w 0<]' LpJU%(J4\$X'9l IR|;U=bHV7 x 6TZS<2 ]]ok3Z60 E8np23X]mkcm{0>`7q8niha/cftH.=DjwIHH&\=^Y:9{/3c9'T>F+&!^<@g?qABK7q],Io@   Ca +T<M~t.j1Annr2.HHnfVa mhf2s'~~?x-4/UuH(u OZdv R`'X'zu\V8]XdRKO sln_R%xRRh jc~(@X3x8JQ&~ +6; @V,VT=&26L%=4"X/'&i!eEX><[FqBVfh'|K|flB& 'zw[R]e+QhHOZXXzd~R7ha)h Z{9s8D_0c s>&*7aw-SOn&SIKu"4u:z"9-]=j?~@h2$XhB-@6j4zT _E<PdMfxH)F q__o|\1&$Y|so2d@ 2X09O h]ATosR_)7uo$aqq~Bj J6-7;aVT"Z8E5IxcT]h\6Bu$TdVQx?-/2n;zK2"uZ;Ku6?|o;qcx_cX@&e;8 ,%I*_m2 7[q@ c%|yqfBq)q6VbzY qF'|dG=6.)fZOZS Xo6nQ V+BTJ+eIMI6wKOq=2K Gt;uF aK6So9RnH j-=]ZX6JMv_wfuO 4$_V26q?m;lH~s=MBn zVFsha46@68MXd!z"ZBseDHq]uK]HX\8 O' 4+ h- 9zuQ TT!s;whcJeIKeBx=FK99FJcjA9q] )%s@  mX]"Hqj\|' Zc42Vq ?M)-hXvF2DRHMD4I?hc"=jSlzV|sls;+ov|Q- ]X$l4&9Qz~]o-ooXas;l8]nQB?B%B]hjO'TM nVO0 e6ZmdjxaKD~D sOJf~ssRclVIZZOTR. 4fj? .l~lVSFM~~uV@~hwK+nMOcZQVo]Ow Oaof;"6?Mc|T ']"cc\QQ;2Sae0Zda|TvfD)~.]hRQ_oh; 0QD2 6?6'xDS~4DB?029=2 w dzI|F|j|oMF0OKF]Ouus~2TcH_aRF%9$xVSQVls]]'HcdTqfahZQ;.RjXB" 9D@TQ;==.Q[2@~2w0R]KFHB.' .? DfxdTF ~_xzu @xoov]; u\Qz'RMH_j~jVTK2 "=MF) xo7O?6B[V==2% ?9  HZZd_9+47".2 sZT[V;~sjajz7jv|~s_ZD-??$?xhfsx 0MKRamvR4 '@;4" %'BB?QOM=)Z'.HKuzV[I 6DRx|zz|qRRX6) @MZZZQ-%=. QI)nq|6M?9OadVD0'0KF 2.6 6F4  0=I[V4 9f; +)OlF'=K=-  -6 ~~ .IQ]adqsq]OM?0"' xw%?DmxKTlllIHhI +[49IQ[]RTT;. T7Gh9m6 0XxoD+zD?T_sVI?X]XM4F]H+?RR9 4? "KOFI; '229= +-4$     4j6"2'@F2TV9OM2-     -7-4F9.2 "|V4".;FO707%   2B7=2  %$ "@QRcZccB;-VoD% "+)  ++$ ".KH=4''tworld-1.3.0/res/teleport.wav0000644000175000017500000003065610125477410016345 0ustar breadboxbreadboxRIFF1WAVEfmt +"Vdata1YhP+QBMs Qgd|]`Kl/\"h 0+/] ]ZMd =SKvgc/XGQ^>E[L49HZY${dt9~wGwH3-k >I_Y~ Cf]9\2*-dGg'xrn9-T kl&5{\)9|0X"Oqa2KX@A3M,qg2@ Z w]7T[+zc}I @Z+$[k&ErI`}f_]zY~5+_jO ,|}*?~yv$[BIf+[`+I0;H2BB0R\IFu*M8r46dm!Cn!]]>7xCiY3!i$e3Z? I0@>$g+<(gewOHHHt]Xj. 2$!vB}__A3v|v(F0IGe2%E 1Z';B2M:|uZNlE~J?HU+hik9'&VTp88dw Z/crU!OZ@\W,qNeUsN m> 3xLEv.4umE 0dRZel|\g-9:5g2aUU*Ttv=5ej! 3&}0dm697ZbLl;aFWu3Hn 3>,1[tw  3kN11!k` 2D AT_qQf`%|BA^_<}v,^xXa(NFL Q\y3f&=;yIIl3xZnVZ?Gqog[7k@W"A R eiF&Al`$'`t)R6*8U dVyZh&!Z|8OPR=#Vq LJUQ;*J 7qtaGWbrl[$+@|!RMVnhcu\. Fo3R0W{Q>JY0m"|C3{`4u,Ae5U|81`nqcy3]}0c:hzma0 ^J25Cjpc/n5QT3$q&HAG gzC O4Zm4Va dyqaZJ"p@5.AMs qY{unocRa 2j)+#Y>E igMp[/rf*EAJ s6$YX %Q+[?E] p4w,X;</Vw`)1Da~;rHC5%Ajo ,jq9c0+DQI[[ t2=>; 659u :`X|hQ] %  8s RWt?b^%it@0u1,(e"5Z:t}eX:<:2BeP,JF\lXNUIB.atAE$Oyj"ZSe |)&D?!A:ZRDAmrB]x\yB@m${t tS d vZ48]4`Z ; 4m>=NlGR $8 b 7d $ztyyhyTa  ~E-n\[ W  mM" " s aZ}sI\3 Xd<F9Ip}mIT$TjC,;m$CNoMN~s RNVeL2!3 JWsjo4%?`QR*A, gM"Fq ?Re9 0y/@ (b ~:R+Fo}a*v XBx6c2yDu oIIv,%, A>0|B,nN>l>Q07VJ{~~fo`SxmVO t \    z I%7 vpl%`|i:?" ^^-IjG  c *0].>t`/rW6#d ZX moa "F? s9db%, wO|k s  S%,^ : 9 O[mo#~0K% TJ [Tb>ioLtD,%2H=i :R`W\ 8?I$ =]V\0 a7,i> :NR= oAR`" "= 5 B IvL }F!T tp { 2 kk D   8 M1A;xy} ~?+v s D !v~eb KURe C&$ @v~ U"n ZhtN |'rmw90#%jVr"P )( ~{u[ .lI- R/ X?x z8a ./&0 O D2o 4W aZ ( n }_}%E' |$ L_ >HRC~| q V4`Iif GS2 i?14? %4hO { mQ \<FvkD A5 Xd5vhI/ 68 t q[' HqR* B 5 p% $ ^; >G \ QJ`pSl01MIZh~ k5 TM 0A N +1&v "g> &\QB' {Fpi1. y>X3 Z+ e`fn ReOcF@Mj |hR&*LBm1q ] (Q_BMY )!K ,JEu NCE)ws ) -'nj pO   C9 #/9k9,  7Y:" ?4 6)n0 _Sc  x  e & (q ?\ =U:7}s 3'5f< _'QXT `teW ^Ak Aj e YV" w$6 @^| ^9AA"chVP{ o 6B-k{P>H!i Q %S%+Og!FAR~wq F'V[.; ;  `ro?K!h]U%Q8!m(Tu> N[ U T3~ h<bVn;}fR Vr.+ d!U u`C@XKv nk/u k@= @zRJf>%Ov~ V - j3 b 2V $`[ N 8t =8io\oB +sy>;=dG0 =0=B_W\L p}s x q{t.iZ[JC 'k8Xq  H1aG!  r\ ;@ :E?< avh *" ~  0@ G"u|:SL}%   hg< \) . J* ~]J{8 3L&&[=?^7 cHa1I# :1L 6 Q -}@n4P `z+ nI w! =C1K$M_WlU- ; 5 7 =+BjB D U  5*fu!T/ pj  NDn" X]F{| {ZX % 5# WBiqX;\~ zwh o d qN/0=0s&# Jme#? - ='& 7  } )iHA|v? N = FMW) e 00 3GafSQ.KN)I}cPH B% sKk )( @gxuH P '^j"  82,k  9u=hN!:f G y"Ij u6M Q3 #x 8k ,/;{TA1e()` ;K" ,_~6>.\b-,#% d z  &B. C5U\gpIov MRmb?1Y& Tw"0A^  'ND}q "  e'r v9U5 J(2m ? 45|}9Q.)QE YAQ#Q[O + [uwaR 3_)obB' 7!*R`RRj~ ' [*  M. tt^ | p9f7 @_ A B \!g;S%$xw OowH"6: ڛ4 jY #!/Yc Oify 6v):NE'(lߕ:_: | =J&K`- ,Dfi,uP:j/#VbQ8L{o d3+k5tި'+S7<+ A t[fcOA? .B7=>#{,`Oxu ށlm4<d6?O v"j# `EC_M A#<ݪ O'TI/~Tv,4W3*tm!2Ԍ*O0ٞ} .z^v -j%&nԎY>C {6)B * -S$z bv#_C8yBt!zOpRC#c=: 4P'V 3 [v=r J3X B|AT R gi "<)2'YWInk oAwEB+ߥۛ 3P,UGݹ= D5ўy%M%j%/\#N+M  (ev4 (Dc~5 $z9kx= /[YV@fv7 CI,&H%H 3t db} = [n G!a).07 :Y r} \d\3g6 6_ 0ix ck+Km $(a !o[ &7. d 7.Kk \tn u,G J8 eM( +;N^Afji/!` cD5!U{(&y}lJG3O >Sq=e S &6  MU$D? ,@MY t c  d ou<1 < @ gzgj N'>{]= -{g^n UZ]SnB ?r { * m? mP{ %5zf<S So>J KL] U( SrJ_},icH1c)(kǑ6' '  tworld-1.3.0/res/thief.wav0000644000175000017500000003075610125477410015607 0ustar breadboxbreadboxRIFF1WAVEfmt +"Vdata1zuK]t VTy+P=S0) `F (o5*1( >_:}!YG:"HPW#U=5X~=$Y-&+%261_(& V s ) m ~ 7~ZK;R KuA{x#ly3:; [%kad )(( ~&$c+w% vAz1SO hr \  Q-4p@Wp_=~$#m  }iF}6cv*' q-]vO(pt" YGBpoqQ,V_ "+q W%ElvJdo\6} e # A\u"F)& xc T6^&bf$ml 1`IqM`| ?gXc F z2^5{67;- y g~7z)JDs?/ eX # ;iH mi6k. s  Q=f_I;UK_>nR r Ns} - M ?_'Nnv{HiRc% ),|4hX2D V  >c K;r[c  7&+<s9q ?*-/ x1o  ngGO 4:y\LcQ{,AN!KjS8l!x s f0WfIs - SUy @@ -;1`m4 61 rw}kk8 r4.%Vn~cZZu+.<.!#32@-(4T(ڕ@#D@]w~ 2PY(~T` 'B C)  (V{ 6= O%i  ~g޾"Tgtd$I ܾ ~ [%  ,/(M ~o2 f\V>  %VrPko+w P'WXJ &)@S&*1f7Mv =$R V/x߲'W.LS9X Jd '-. u #+\@JQ!hlJ  EU=a8G ,."iD! J<<TM'I g=ULS<7? RWc $'f]iz{qy 4JH|x46,3VF  ^  IMAa% 2 h;]R6 a 1 ,6^P B  P+;Y * ~R9T _p0RD%@F+g ,x y v\=_WbOg i1  ^ -_E2 :[f/OFK>60  &#VPWlG ~  T A 8q*^ KX  $ 'r&R W!.,4p+S%.L "\9Xy]!i";Z0j} V {Kz g 3k Bk- -7WT!(h$bh>b Uy=h).ty h*׫3 u ٻ E$z!J `7  V}2g|H s R RW wPO?#h;  O v ;* |>2uG Cnj  .# 4 kKL'o v .SXE)!! J  Nk[ܸۧl\Z,LX byF& 8VSD+#IBVAI,1fr7~۟"7"^-5 +Px][ q)6RKO@Bk*2 0  !AH#V V zN ] :#oV0 ~(4::U1!ncQgEzԼ-PF3,E5b9BQcMqk; \A#,k/'3 ~fl M > :{p )i!!# y3YM 7*i f}bk"*1dC \ U)/%'  }^6Hl N&o)#LVO  Uiz  h %aE]{DJr  !5 Vf <pPد1ѨnEK@"Yx O54j)P 4 0K 3,%' ; ~ ^z. Sk ^)q:t3~|4 DO]b~=I 9:8!7܏1ڬnV]L^NE "e:~ | * iU{ A\"5%4 ~ ] & p Nx XFCwF  [L"0 |aw ܄=7X* )ph!v }('y =As !rm  V  $)jj x J a +9oBI xs8} "e{N=v,b On%co|@:t RL * >pK\w< = |:j eh #uDl0 a _Bx7uq)]"m'*[&2ei9B?%zsg )"JjH Vj``$Z+SMZten`L [ G>}(Tq[ `(r 3 @ e.|4afTB-\@aX 7}Gnwssf ?۩eςџ"_U,d21T*hI9<*Htn4S . t# 'U (+2;)Vq~-C?ME.IN-,` B] ҃ɪM )ԡJUr!#ʹPlS\%/(w6KWf0Q)&8Yp #J#/6kOs#߄$l 7_H  lI+ 4 5,I #E A^m͐f}39~1q@B;d ! i,9=R w>%W[ D  oAO ) xv !8 ](_lB1YHmf <} A? w-Ѱs_]Æؚ. ?\!h(M$ t 0-@ yZ s LDb.h?K,dk%9My@B +_UQ,/!WOV%*x!AY !"hblG /w ?[St*O  nn5EtrU/ Avr""B/33f|%p ebk ,!AU48>8 o ~ E{> 4'|@6R>SBA/> { [n Q 9'mUb5/* iX < wKU7 6 5G*  B hZ{+|D c vT| %+p8654Z^AQJ56D-q);JlseZ "`m1Y T<ONJv[!NSC;P=2qBJaM@2; Y[z# ~=7VLn,'s6-t-b[\ }>v`$x1ML557z|R  wB"c%sq=8\/DikZiN(J#5~VLg Q u 7Pev &rm = | |{)HI4` #o`:7!!D1I 3"  3T$z8&5O\1/O:M?=6 z[.% c ` [Mr%^WtY4dgV(?4??f>#G-=;2qjcJ~nQpOv f +[?z77a&E"W'Q"h]azOWIgW=V/S*Jn[ IYud(TKrM0Kz!G1~_l0f)As_|0dfM0H)No0*f~8}l XAt ij"z.0+@zVoQ#N~=?qzz 0 f +/nW]3 6U,]m0)B@ -0Kuh>D[+dB;d+7SV;R#2@IqX$KeF7j$eT9e'jVsM?AK7#vFuj z%v@s4\+6au_X?$FXSq H`|QF'|cTh+Z<'4R[s$&B';HaZVygT u[KjX2~'l Xzo)B%| DqzalM[4Hyp=?tC'-Bv5#l8a3Su$ w xszia{z7#$Se`w\g J`tEbHB< [  MK  NhiE0"Qn} .`#)J+8$IB F=a._ӧ<;Y%y 6[\x` _ - " V(F$g1 4jb=?/I6V.F!4 چ ?H +|7@P7CT`/LoF}/{ & @.ؤ"{Ϗ7:M.du&550;c-l"DN[A0  X"jtW ne|`' #R$M*:T # >  A k]W ;\^Y=%R\~ J LP  Mt U ;V: 6> Ufa=E3 8  o8NN ``Y W$ (#@X ptworld-1.3.0/res/tick.wav0000644000175000017500000000205010125477410015424 0ustar breadboxbreadboxRIFF WAVEfmt +"VdataRO*%7:'& aeyo-(Φ (#zPQu!DJoK# */[q T)<I F8 .re~ X"? s _ c MvdC2 3ihqHw[asJ  %Z==W|XKn}.2^*7=dzu:'UTAV~;8 z h<{v|394f|N([fc8=jth{Y i{b#/0^_kS"1d|; [X}xH3ER>l2U F+2'f:Kf^/e a0(Ueujp~eZMySU]qlR@z6tworld-1.3.0/res/tiles.bmp0000644000175000017500000275006610125477410015616 0ustar breadboxbreadboxBM6 6(P =J+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2NNNNNNNNNYNBeP2kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'jR'fP2ZPBNNNNNNNNN|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY@@ooTTbb""==22""``ttLL''..++ZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5NNNPNLnW2_'c'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'~_'vZ'oU'gR2PNLNNNcccbbzzWW..wwHHYYWW22DD]]''++{~Zm`uTfL\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5NNNv\2i'm'n'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'k'f'}_'rU'gR2NNNccc..'';;ZZWW""BBDD|JJee..""''@@HH..""Zm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5eUBj'r't'u'u+v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2{@{Fj.}_'oU'ZPBdzccc==zzBB@@jjLLDDBBee55~~;;..22;;''DDWWbbRR55Zm`ucx8p@n~ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkTeL\=J+5c2r'w'z'z'|2DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDf}{Ff'vZ'fP2dzccc""22++""BBnn``''22RR~~wwDD88LL'']]\YYY#!-"2".#Zm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5m'v'{'2D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Pf{@k'~_'jR'dzccc""FFkkxx]]==\\..~ggccFFcc""t{rf\YY,04!.$ ,'8.@2F8L5J2F.@'8Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dz¸ccc;;}22\\;;;;YY..88++|;;++mmkkBB88@@BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++YYYcwwi]YY.5;8N.B+;+;+=.B2D5H5H2F.B.@+='8Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzϸccc;;;;uuHH++BB==DDWW==LLJJHHYYHH++LLBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++xrjkmu}|zmY@W2F+;+;+;+=+=+=+;+;+;+;+;+;-6Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dz׶cccLLLLooss88~{5Bi=L`"5r''==ZZNN""PPBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++vjijt}_$=OBWBWJb;D.5+;+;+;+;+;+;+;+;+;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzeLRpʕųcccccggYYjj\\~ZJ""NFF58Z''o22s|..FF''@@BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++{k]`fs|YIRrNkFb=UF`Hc.B+;+;++e""NFFF'\'"N""L"FFFFFPZPZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dz_2FFFFFFFFFFFFFFF5kkޖ׳ccc""""88~b"N'J'Y"`DDFFHHFFBB88''ZF'@BP\eeegps}''NNWWFF@@nn++sgcir|\zi\YYYY%G\Z|UvRrWs+kF'_'"N"B""=F++gHFF.=FFFFFFFFFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzw2FFFFFFFFFFFFFFF5kk.۰ccc55BBJJTT==v""82222'"JDDJJJJHHBB;;''ZF+8@JYcbeijksv{YYmm++miic\YYZmwZs_YYYYIS]\\~`'`H;;5|5+f+'\'.H_''\FFFB+FFFFFFFFF/J/Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzF2FFFFFFFFFFFFFFF5mm{ɺϳccc''UU==NNeessBB''''"+F";2222''\DDJJJJHHBB55|''Y8"8@HZ""`ecinnsuv{88""++u_YYepZfZYYYY@^r]=o'W=@@885|55|52ZU++c""NF"D"L'"L"HFFFFFFFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzuuu"""""+۴糳ccc++iijj55DDZZ@L.L.P.P.L+H";"+ZFFJJJJDD;;''Y.+'8@@BUf..fipvx~zt}++iYYmznZ|e\YYY%aFb5z=;;==;;.@b..o''_HF2;FHFFFFFF)I)Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzT""||"||"||"||ޕ游ccc``JJ;;ZZZ@W;b=f=e;b;`2U'F====55x"'T2".+'";;"@@@JZ++i''pu}~}++iYZ{}xmZ}g\YY%XuBB.k.2;p22p""RFFF'@="BFFFFnsnZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dz8"FFFFFFFFFFFFFFF+uupʸ³ccc''cc]JeDpDsDpBm@k;c.H+;+='8"2""'@F;"@@@DT_kw""..\\..++_Y`rvv{|{wnZweYY``DD"U"2;o..i''\""RHF';FF)I)Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzvvv'FFFFFFFFFFFFFFF8ccRҴȳccc{|++R@cHwHzHwFtDs@k8\2D+;+8"+"2+;DFF@@@@BNbjv++""bbJJ55PP++++sYYfxwZ|t\Y+4A222@5='+;]55};;8822r""T;"FZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzkkkDYYFFFFFFFFFFFFFFF+uuްʳccc88H;bHzJ|J{HwFvBo;`8L+;.5+;D".;';"+="@D+;@@@@BLZep{@@22''DDPPbb++vNFH\ktxzuo`H ###***vbY.G";222228;BBDDBB==22u"J."Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzeee5FFFFFFFFFFFFFFFFFF5kkޭȳcccppDD..D;bHzJ}J{HxHwBn;]+8P2=D8="+;"2;"2@".'2'25"@@@@FNYfoz55UUZZZZ++22BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB...777wvcYY>IZ+H";22222BBFFFFFFBB88''ZF+8F:Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzbbb@ttFFFFFFFFFFFFFFFFFF8ccޫijcccLLPP""LL==F;bHzJ}J{HxHw@g"8D+2B.=F;B';='8@.B8D"+5"'5+==@BLRckpw|==ii++''..BBUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUmmm888~ssiYY%>|Zm`t`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`uJZ+5NNNTPLn2w'x'x'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'v'r'j'v\2PNLNNNccc55==ffmmDD"";;||HH;;||ff55[[WjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=JNNNNNNNNNr]Bk2o'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'm'c2eUBNNNNNNNNN|||..LL""""..iimmPP++"";;HH..iirr88=J+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2NNNNNNNNNYNBeP2kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'jR'fP2ZPBNNNNNNNNNBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeee@@ooTTbb""==22""``ttLL''..++ZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5NNNPNLnW2_'c'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'~_'vZ'oU'gR2PNLNNN222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppggg222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppgggbbzzWW..wwHHYYWW22DD]]''++{~Zm`uTfL\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5NNNv\2i'm'n'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'k'f'}_'rU'gR2NNN222NNNtttggg222NNNtttggg..'';;ZZWW""BBDD|JJee..""''@@HH..""777777%)-Zm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5eUBj'r't'u'u+v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2{@{Fj.}_'oU'ZPB222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttggg222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttggg==zzBB@@jjLLDDBBee55~~;;..22;;''DDWWbbRR55888...***IXb.Nb'FY3@J146! ATBZ=T8N2D".Zm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5m'v'{'2D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Pf{@k'~_'jR'222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttggg222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttggg""FFkkxx]]==\\..ggccFFcc""UUUBBB t{rf\YYYwZ|YzTsFb2F,03D\BZ=U8L5H+;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttggg222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttggg;;}22\\;;;;YY..88++~;;++mmkkBB88@@S_\\\\\\\\P22UUUBBBHZZZZZZ\\ZLYYYcwwi]YYQbo__\~UvJf;P!('8D=T@W8L.@+=+;#Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttggg222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttggg;;;;uuHH++BB==DDZZDDWWUUUU""YYHH++LL++++++++++++++++++zg22UUUBBB`wnmnpw|}Z++++++++++++++++++xrjkmu}|zmYcFw]UvJg;R'8N;P2B+;+;+; ,Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttggg222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttgggLLLLooss88~BBjj55@@__{{ee""PP888888888888888888z22UUUBBBowxzf888888888888888888vjijt}_OcseoWwJg8N*5H+;+;+;+;+;#Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppcccgggmmmrrrppppppppppppppppppppppppjjj]]]HHH222eeetttggg222NNNeeepppcccgggmmmrrrppppppppppppppppppppppppjjj]]]HHH222eeetttgggccggYYjj\\~++""@@ee]]""88LL''@@==================22UUUBBBuz}v=================={k]`fs|Ybi;mRp@W-@*9+;+;+;+;+;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppccckkkwwwpppppppppppppppppppppppppppooocccRRR222```tttggg222NNNeeepppccckkkwwwpppppppppppppppppppppppppppooocccRRR222```tttggg..nnFFeeJJ88DD""@@''++22++PPttssZZ~|BBBBBBBBBBBBBBBBBB22UUUBBBx}BBBBBBBBBBBBBBBBBBvnku{Y!_`YzJf8L*:*:+;+;+;+;)8Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppfffpppppppppppppppppppppppppppppppppfffWWW888___tttggg222NNNeeepppfffpppppppppppppppppppppppppppppppppfffWWW888___tttggg""..;;RR``''""__NN""{z..88BBNN++''22}xDDDDDDDDDDDDDDDDDD22UUUBBBx{DDDDDDDDDDDDDDDDDD}mY%]zWsJDD.@+2528@+B"@'.5(7Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppiiiwwwppppppppppppppppppppppppppppppfffYYY===bbbtttggg222NNNeeepppiiiwwwppppppppppppppppppppppppppppppfffYYY===bbbtttgggz..JJFF22''__eeWW..|{{~""==PPffBBFFFFFFFFFFFFFFFFFF22UUUBBBtvFFFFFFFFFFFFFFFFFF}um`YY4\h"P.HFFF3"R""T"HFD"--Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppjjjxxxrrrppppppppppppppppppppppppooofffYYY===jjjtttggg222NNNeeepppjjjxxxrrrppppppppppppppppppppppppooofffYYY===jjjtttggg""''jj{{]]BB@@""xv{|wx{x~'';;88''@@;;FFFFFFFFFFFFFFFFFF22UUUBBBkxvFFFFFFFFFFFFFFFFFFre\YYYGQ]1f1"P""L"FFFDG'W'"T""L"FFDALZZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppkkksss̒ppppppppppppppppppppppppmmmcccUUUHHHoootttggg222NNNeeepppkkksss̒ppppppppppppppppppppppppmmmcccUUUHHHoootttgggttzz;;DDkkrr++|zxuontkks}++""BBZZWWUUFFFFFFFFFFFFFFFFFF22UUUBBB\frFFFFFFFFFFFFFFFFFFr_YYYYQez7CSXj~+e+"U""R"JFFFF'Y''Z'"T"JFFhtX_jXcr8HYQW^Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttggg222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttggg""""88~''55oottDD''}tsrjmojgjrw}''NNUUFF@@nnFFFFFFFFFFFFFFFFFFr22UUUBBBHY`{FFFFFFFFFFFFFFFFFFzi\YYYYTjBKVTj"T""P"JFFFF"P"']''Z'"T"JFFU^UL`x8FY@ITZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttggg222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttggg55BBJJTT==..PP@@""''@@{""omgeeefggjjpv{WWkkFFFFFFFFFFFFFFFFFFmW22UUUBBBFYYZmFFFFFFFFFFFFFFFFFFs_YYYYYoFZob{8V8"P""L"HFFFF"T"'Y''W'"R""L"FF5N5YnBTg5BT6BRZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttggg222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttggg''UU==NNeessBB''''|~|ust|~~~22}22u''jebo;;g..g""egimksvv{88""FFFFFFFFFFFFFFFFFFw22UUUBBBNs_YYeFFFFFFFFFFFFFFFFFFfZYYYYi}]v`zTiNT\s{s'Z''Z'"P"JFFF/J//Q/"T""R""P""N"HFFI\oNc{BRf2BPZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttggg222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttggg++iijj55DDZZ==++""sJ8;+DH"D8=N._fT8@B.DF'B5;2BTe..egorx}{t}FFFFFFFFFFFFFFFFFF22UUUBBBviYYmFFFFFFFFFFFFFFFFFF|e\YYY|gXcp:]:+b++`+"T""L"FFF/J//L/HJ"N""N"JFF5N5NaxPcz8HZZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttggg222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttggg``JJ;;ZZHH''BB};=F""L''W""U""NHF""P""P""NJFFF.Fe""ns{~}FFFFFFFFFFFFFFFFFFUUUBBBiYZFFFFFFFFFFFFFFFFFF}g\YY\cN\8Dc'Y'+c+'_'"R"FFFF&I&FFFJFFFFqqx2;Y9GZZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttggg222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttggg''ccPP\\TU"'@""L''_++f++b''W""L''Z''Y""PJHF@.@Tep""z++\\..FFFFFFFFFFFFFFFFFFBB22_YrFFFFFFFFFFFFFFFFFFweYYHHt''_FFFTV_V"U"+e++f+'Z'JFHHFFFFFHJFFFJF;=OZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttggg222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttggg{|+++8n8o=HU;@'5'8@J++`..m..k++c"'R''Y""RJFFF@+8+;+P_oz""bbHH55PP++FFFFFFFFFFFFFFFFFFuYiFFFFFFFFFFFFFFFFFF|t\Y>>q''WF))I"T".j.+g+'\'"R""J'=88;"8@"5@5;;2D"FFFFFV^V--OHFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eee222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eee88~=++bJF'N+;+="@H8HT"BRFJ88+=8+;F2N2D.'8F8=FF"DD`s@@22''DDPPbbFFFFFFFFFFFFFFFFFF\cFFFFFFFFFFFFFFFFFFvbY77p++b""LFGYG"T".i..i.+`+"L."'LHFFHFF"DB'FFFFFHF&&IZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'...222222222222222222222222222222222222222222222222222222222222222222BBB...222222222222222222222222222222222222222222222222222222222222222222BBBppDD..Y+`..j++g++g+.i.@.B'@FT.DPBkD;g@=W5BN.=JBBP@5J2@N5BF+D""LHF.8Lm55UUZZZZFFFFFFFFFFFFFFFFFFcgFFFFFFFFFFFFFFFFFFwvcYY55{22u++cHFFT"N"'_'']'"H2"DJHFFHHFF"D=.FFFCSCFFFFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'BBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeLLPP""LL==R.k;;;;;;882T2D.B@;"D;FjPfL`v+8D";B2@P2@P'.J55B'J''W'']""L'=Fi==iiFFFFFFFFFFFFFFFFFF''..isFFFFFFFFFFFFFFFFFF~ssiYY;;88..n""N11LE_EF8+=FJJJHF""N""LHFFF';2@CSC11LFFFFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppggg222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppgggkkuu..88PP==..Z5|DDDDBBBB2;|2F5F.8H"8@UmLcz'@N"FL+@L';D5@L2@P++='2";""R++c..n++e+@Nmx''FFFFFFFFFFFFFFFFFF==eeiFFFFFFFFFFFFFFFFFFxuwiYY==;;22s""R//J+FFFFFFHHFFFF+9;<FFFFnnsZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNtttggg222NNNtttggg''WWWW;;JJb@HHHHFFFFBD5J=L+8D"FJ8LU'BN"@L@Uk2@T;H'DL+8H"2=+5'D''Y..k55{22t.Fi~|{FFFFFFFFFFFFFFFFFF..DDmFFFFFFFFFFFFFFFFFF;;PP88rnuiZY==;;++e""L//J9;>=HFFFFFJHFFFF;9;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttggg222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttggg++..==''ZZmmmm@@..ZZ""""@@HH]]DD==__HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH.DY.FJ'@N5T_2FR.BR@FT2DT.8H2@R+;L5;H2;.5$/<Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttggg222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttggg""BB..BB++"";;DDjjBBPPggTT..~55``ee""FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF%Ej'Fc'FT2=R2LT8PZ5N_;Nc.J`2;N5BR'=F"5="8=.=$/<Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttggg222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttggg""++''rrmm88''RRBBUUnnTT552288""BBBBBBBBBBBBBBBBBB==BBBBBBBBBBBBBBBBBBHz+F`5BU2JF8HU5=W'=P.LW.=P5=N2;B.8D2L2U+4AZm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5o'x'~+gָҳTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;|2u+m'b'kR'222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttggg222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttgggFFjjBBWW__''22DDDDDDPP''""LLff''{;QnHzJ}"Jj5@F'FU'BP8D\.DN+BN5F+;B8W@i2U9?IZm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5k2x'~+ȥvָàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpDz'u'n'c'eP2222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttggg222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttggg''xx2288PPDD""..@@"";;kkxxee++HvJ|J{Fn"Bf+=W28P2=F";PBZFpFt@i4SijlZm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5r]Bw'}'=ȥvgDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD2z't'm'_'YNB222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttggg222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttgggDD""""__PPTTTT..''22DD\\cc88{{++IuFvFtFtFtFtFtFtFtFtBn>aZm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5NNNn2z'}'~+~+|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'{'w'r'i'nW2NNN222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttggg222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttggg""..RR__""88@@DD~BBii55RR{{LLDDPPZcsZcsZcsZcsZcsZm`t`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`uJZ+5NNNTPLn2w'x'x'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'v'r'j'v\2PNLNNN222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eee222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eee55==ffmmDD"";;||HH;;||ff55WjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=JNNNNNNNNNr]Bk2o'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'm'c2eUBNNNNNNNNN...222222222222222222222222222222222222222222222222222222222222222222BBB...222222222222222222222222222222222222222222222222222222222222222222BBB..LL""""..iimmPP++"";;HH..iirr88ޖަ޻þ޾ޯޙގގގގގގޙޯ޾û޻ަޖͺURN============================================================================================================NJHλͺͺͺͺͺͺYYY@@@JJJDDDBBBFFFPPPNNNJJJHHHUUUDDDNNN@@@YYY;;;TTT@@@BBBJJJLLLBBB|||FFFHHHBBBBBB;;;RRRLLLTTT@@@BBBDDDNNN@@@@@@BBBJJJ;;;FFFDDDJJJ888@@@PPPBBB888@@ooTTbb""==22""``ttLL''..++þ޾ޯޙގގގގގގގގގގގގޙޯ޾à\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@λͺ͹͸̸̸NNN;;;DDDLLL555;;;@@@TTTFFF555===@@@LLL===HHHDDDHHH@@@===@@@FFFBBB===BBBRRRPPPNNNFFF555HHHFFFDDDNNNDDDJJJHHHHHHDDDHHHPPPFFFJJJLLLWWWBBB@@@PPP===bbzzWW..wwHHYYWW22DD]]''++{~þ޾ޯޙގގގގގގގގގގގގގގގގގގޙޯ޾omkkkkmmmffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbTTTNJHλͺ̸̸̸̸HHHJJJ===TTTYYYHHHDDD]]]```UUUHHH@@@DDD;;;FFFHHH@@@FFFFFFBBBDDDUUUHHHFFFBBBDDD888JJJHHHWWWFFF===888BBBDDD;;;JJJDDD===NNNHHH===FFFFFFNNN===DDD===..'';;ZZWW""BBDD|JJee..""''@@HH..""þ޾ޯޙގގގގގގގގގގގގގގގގގގގގގގގގޙޯ޾gggtttpppppppppppppppppppppppppppppppppppppppppppppppptttzzzmmm\\\URN͹͸̸̸͸͸222BBBWWW@@@RRRJJJDDDNNN===PPP===TTTUUUJJJBBBHHHBBB\\\HHHDDD@@@HHHDDDUUUDDDNNNLLL======HHHHHHJJJBBBDDDNNNFFF===ZZZLLL@@@JJJ@@@===BBBBBBWWW@@@FFF==zzBB@@jjLLDDBBee55~~;;..22;;''DDWWbbRR55:;<*05#%'þ޾ޯޙގގގގގގގގގގގގގގގގގގގގގގގގގގގގގގޙޯ޾gggtttpppppppppppppppppppppppppppppppppppppppsssvvvwwwuuutttsssttttttuuuttttttttttttttttttttttttttttttttttttttttttkkk\\\͸͸͸͹͹͹TTT555HHHFFFBBB============\\\@@@FFFBBB___TTTPPP;;;RRRPPPPPP@@@@@@BBB@@@DDD@@@jjjrrr@@@BBBHHH@@@LLL@@@JJJRRRLLL===BBBNNNRRRFFFHHHNNNBBBUUU;;;DDD""22++""BBnn``''22RR~~wwDD88LL'']]\YYY:ITDYB\=T5H'5$þ޾ޯޙގގގގގގގގގގގގގގގކoo@@@@ooކގގގގގގގގގގގގގގގޙޯ޾gggtttppppppppppppppppppppppppppppppppprrrrrrnnnkkkjjjjjjiiiggggggggggggggggggggggggggggggggggggggggggggggggggggggonk͸͸͹͹ͺͺͺHHHHHHFFFHHHHHHDDDTTTDDD@@@===;;;FFFHHH@@@NNNLLLDDDBBBHHHLLLHHHLLLHHHJJJFFFBBBPPP@@@@@@BBBHHHFFFNNN===HHHBBBFFFHHH;;;@@@BBBJJJ@@@BBB===RRRFFF222""FFkkxx]]==\\..~ggccFFcc""t{rf\YYAP^RoRpNkHeD];R2D'8!.$޾ޯޙގގގގގގގގގގގގގގގކoo@@@@ooކގގގގގގގގގގގގގގގޙޯ޾gggtttppppppppppppppppppppppppppppppoookkkiiigggcccwtrýμ͸ͺϾμλξ͸ͺͺλϾ===ZZZFFFDDDPPPNNN888888HHHJJJHHHLLL```DDDFFFBBBDDDDDDYYYLLLRRRBBBFFFRRRBBBBBB@@@PPPLLLFFFBBBLLLFFFPPPLLL@@@DDDJJJJJJ===BBBFFFYYYHHHDDD222FFFUUU;;}22\\;;;;YY..88++{wx~;;++mmkkBB88@@BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++YYYcwwi]YY,UmWwTtTsPnHe@W5J.@+;+;+;'8!ގގގގގގގގގގގގގގގކoo@@@@ooކގގގގގގގގގގގގގގގgggtttppppppppppppppppppppppppoookkkgggeee___ομͺͺμλͺλμμͺͺμξDDDLLLDDD@@@@@@HHHFFFHHHRRRBBBYYYBBBBBBBBBJJJHHHjjjFFFDDDJJJRRRDDD888FFFFFFDDDDDDZZZUUUfffFFFDDDFFFHHHLLL;;;===gggHHHJJJPPP@@@BBB@@@NNNLLL;;;NNN;;;;uuHH++BB==DDZZDDUUNNJJ{}YYHH++LLBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++xrjkmu}|zmY#RlWxUv5cDgHc=T.@+;+;+;+;+;'5ގގގގގގގގގގގގކoo@@@@ooކގގގގގގގގގގގގgggtttppppppppppppppppppooommmiiieee___wñ͹͹͹ξͺλνͺͺλλμFFFPPPRRRHHHDDDDDD;;;===JJJDDDBBBPPPDDD]]];;;JJJNNNYYYBBB@@@\\\NNN@@@HHHDDD@@@BBBHHH@@@ZZZBBBFFF@@@NNNHHHNNN@@@DDD555===DDDNNNDDD===;;;HHHUUU@@@LLLLooss88~BB\ef'=c'5w88TTHHwz~""PPBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++vjijt}_SsTsRpJgDY;B;.25+;+;+;+;+;$,ގގގގގގގގގކoo@@@@ooކގގގގގގގގގgggtttpppppppppppppppoookkkgggbbbgebμͺͺ͹͸ͺϿϾͺμν888PPPBBBYYY;;;HHHPPPJJJ@@@RRRBBB@@@FFFNNNLLL;;;TTT@@@NNNBBBJJJYYYBBBJJJJJJDDDHHHTTT;;;DDDHHHRRRLLLLLLJJJHHHWWWJJJHHH;;;HHHBBBBBB@@@UUU===\\\RRRccggYYjj\\~g'U'']JF.8NY`o""88""@@BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++{k]`fs|YiyGWjFN[HTHDF.FFFFD".5+;+;+;59<ގގގގގގކoo@@@@ooކގގގގގގgggtttppppppppppppoookkkfff```c`];μμλͺͺ̸̸λμͻ͹̷ͺϾJJJ@@@===TTTHHHFFFBBBLLL@@@UUUTTT@@@;;;BBBLLL@@@HHHBBBJJJ======@@@HHHUUUDDDUUUFFFbbb===BBBFFFBBB===BBBFFFHHHJJJJJJJJJFFFLLLHHHNNN;;;___PPPDDDYYY..nnFFeeJJ88DD""@@''22v..k""RFF;@Bb22JJDD~|BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++vnku{Yp]vL`xBUjKV+LfZw{|HN;;..o""U=';+;=+FFFFFFFFFD".5+;EKOgggtttppppppoooiiibbbUUUλͺ͹̸˴ʴ˴˶̷ͺμϿμͺͺϿμ͹˶ʳʳ˴˶͹λνͺͺͺͺLLLHHH\\\DDD]]]HHHFFFBBBBBB@@@======JJJ@@@@@@FFFBBBHHHNNN@@@DDDNNNrrrHHH@@@@@@RRRJJJ888DDDBBB;;;TTTBBB```FFFNNNDDDYYYPPPDDDUUULLLBBBFFFBBB@@@JJJ""''jj{{]]@@|++j55|====88..n""L25@DP_mox~'';;88''@@;;}Zre\YYY;cvtW{8f5H@@8855w..k""T+@D"FFFFFFFFF6I=dfigggtttppppppmmmeeeYYYwoμμλͺνϾϿͺ̷˵˵˵˶̷͹ͺͺλμͺͺ͹͸̸̸˶ʴʲʳ˴͸ͺͺ͹͸BBBBBBBBB@@@DDDYYYFFFiii@@@ZZZFFF@@@PPPHHHDDDDDDBBB;;;NNNRRRTTT@@@LLLgggeee@@@HHHYYYZZZRRRDDDDDDUUUDDD===DDDDDDDDDBBBDDD@@@JJJDDDBBBDDDLLLHHH555ttzz;;R"+"D.@@FFFFBB;;..i"F@DP\efgpw++''BBZZWWUU''\r_YYYYFcxf8m@s+i]]5J@@@@;;55|''_'BFFFFFFFF)I)gggtttpppoooggg___LLLĵμͻͺͺͺͺͺ͸͹̸˶̷̸͸ͺͺͺͺλλͻͺ̸˶˶˶˵ʳʴ˵͹ͺͺ͸̸FFFHHH;;;LLLJJJHHHFFFbbbDDDBBBNNNRRR@@@DDD\\\PPPJJJFFF======FFFDDDBBBDDDNNNBBBYYYBBBWWWHHHFFFFFFBBBeeeJJJDDDFFFHHHLLLBBB===DDDNNNFFF@@@===DDDWWW""""88~''+'''YDDHHHHDD@@55{""T@@DJY]YZfnz''NNWWFF@@nn''sgcir\zi\YYYYe'mڤ2m5o@HDDDD@@88""U"DB'FFFFF)I)gggtttpppmmmcccWWWλͺ͹̸͸ͺ͹ͺͺ͹ͺͺͺͺͺͻμϾͺ͹͸͹̸˵˴˵͹Ͼλ͹͹DDDWWW@@@@@@NNN@@@BBBBBBBBBLLLDDDDDDDDD888@@@@@@BBBPPPJJJ@@@UUUPPPBBBHHHDDD;;;DDD@@@@@@FFFPPPDDDBBBDDDFFFBBBDDD===PPPHHHDDDHHHFFFTTTFFFHHH@@@ZZZ55BBJJTT=="2'""P@@JJJJFF@@55|''W";2222"+@JWcnv|WWmm""miic\YYZm\s_YYYY2gfi"jf+mf"PiDFFFDD55|'']F+B"J"FFF1L1gggtttpppiii___LLLžν͸̸̸͹ͺͺλλνμͻͺλμνμϾμ̸˶˵͹ͺͺDDDLLLUUUWWWbbb@@@FFFPPP@@@HHHFFFYYYUUUDDDWWWDDD;;;DDDHHH@@@HHHDDDBBBNNNJJJFFFNNNFFFDDDBBBfffNNNPPPFFFHHHRRRHHHBBBBBBFFF;;;\\\888HHHJJJ@@@@@@@@@''UU==NNeessBB''''|~|+=+;2''Z@@FFBB==22u""RB222222@J]ouu{88""""u_YYe\fZYYYYcb`]UWJ'JJ@FDD88~..n''YH+B"J"FF)I)vvvvvvgggtttoooeeeYYYeb_μ͸̸͹ͺμͺμμͺͺλϾμͺ̸˶͹ͻμ@@@FFF===@@@]]]BBB===LLLTTT;;;===WWWeeeDDDBBBcccHHHDDDDDDLLLFFF```FFFJJJNNNFFFBBBLLLDDDNNNBBBDDDDDDJJJFFFHHHPPPDDDNNNPPP;;;BBBHHHJJJ@@@NNNFFFFFF++iijj55DDZZ==++""}+.B2F2D"5B..k88~22v++c""N"="='@'B"=522"D_u~zt}""iYYm\|e\YYY@\R"T""L"J'\';|R8H}55|..o''ZF'BFFFvvvvvvvvvvvvgggtttmmmbbbTTTͺ͸͸ͺμμμͻͺλλ͹̸͹ϾϿWWWJJJJJJBBBBBBDDDHHHBBBJJJLLL222BBBDDDLLLDDDJJJeeeJJJ===NNN@@@TTTBBB888@@@LLLFFFUUUHHH\\\HHHDDDDDDBBB===@@@LLL@@@BBBFFF@@@NNNDDDLLL@@@@@@ZZZFFF``JJ;;ZZHH''BBHH~H5=2F5H2F+;.8FFB8'B+F.L.L'D5"+Db}~~iYZ\}g\YY1a1"T"JH"U";;;Uv;;55z'']FF85FF5N5vvvvvvvvvvvvvvvvvvgggtttkkk___LLL͹͸ͺνμͻͺͺμνλ͹͸ͺͺλWWWsssFFF@@@DDDJJJBBB@@@@@@UUUBBBPPP===BBBNNNBBBDDDZZZHHHTTTDDDJJJNNNFFFFFFDDD===DDDFFFDDDJJJUUUDDDTTTRRRBBBLLLJJJDDDLLLBBBDDD@@@@@@PPP===;;;DDD''ccPP``{{iiFDD;@5Y+='5+'"'"8'D.N2T.P'B"+Ff..\\..""_Yr\weYY+b+"U"FFF2p2'+_==22v..i''Z""NF;2F)I)vvvvvvvvvvvvvvvvvvvvvvvvgggtttttt]]]FFFſμ͹͹ͻλͺ͹ͺμμμλμͺͺͺͺ͹ͺͺμϿ;;;rrrPPPJJJ@@@PPPTTT@@@___TTTDDDNNNBBB@@@HHHDDD@@@DDDFFFBBBBBB===RRRBBBPPPDDDHHH@@@DDDDDDBBBNNNTTT@@@NNNYYYBBBgggTTTDDDDDDHHHWWW===DDDPPP@@@JJJ{|++++\\~~iiBBDD@@+2f"D""'".2"=.L2T2T+J".Ff""bbJJ55PP++''vuYi\|t\YJwJ2v2'\''Y'"R"HD+.;;8888;;55}++gJ;2='&6222ijlvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvgggtttfffbbb@@@μͺͺλϿλ͹ͺͻλμμμλͻλμμμͺ͹͹͹λFFF===DDDDDDBBBDDDJJJ888@@@LLLPPPLLLPPP@@@PPPWWW@@@bbbUUULLLBBBDDDNNNBBBBBBYYYNNNLLLNNNBBB@@@888FFFNNN;;;TTTDDD@@@ZZZJJJFFF@@@BBBHHH===DDDJJJLLL88;;@@''nH=B+2Y'8L+.J".5"+"+"++222'D.P2T.L".Fg~@@22''DDPPbbJJJAAA""WJz\c\vbYFF88885{52s2'\++'.2o@@DDDDBB;;++e"F222222!4vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvgggtttfffYYYJJJϿͺͺ͹ͺͺͺͺμμμλͺͺͺλ͹ͺHHHBBBPPPDDDBBB@@@WWWLLLLLL======@@@LLL@@@DDDLLLBBBBBBHHHLLLJJJBBBHHHHHHNNNDDDDDDJJJFFF\\\PPPHHHHHHHHH888FFFWWWJJJBBBDDDTTTUUUBBBHHHPPPDDD]]]FFFppDD..v8D'2\'.D'.="+;"+22=+."+5'+22";+J.P+J".Hi}55UUZZZZBBB888555555555555555555555555555555555555555555555++cg\wvcYYKK====;;5|5+i2+.++`DDHHHHDD@@55x""R2222222vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvgggtttfffYYY===μλͺͺϾλ͹͹ϾϾλͺͺͺͺͻνPPPBBB@@@\\\DDDHHH===DDDBBBRRRRRRBBBZZZFFFHHHYYYDDDLLLHHHDDDDDDBBBDDDDDDBBBHHHcccBBBFFFfffBBBWWWHHHLLLBBBcccBBBBBBDDDNNNHHHBBBUUUJJJFFFBBBeee@@@LLPP""LL==iYZe"H'FR+8B.5J+8F'85"=D25'."".'.25+F.L+J".Jk{==ii]]]\\\BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..is\~ssiYY@@@@==882gL".+""TBBJJJJFFBB88~''W;222222$/<vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvgggtttfffYYY===ϾλϿμͺ̸͹μμλͺͺν͹ͺλ555DDD===@@@;;;JJJHHHPPPHHHZZZrrrDDDFFFLLLTTTLLLDDDDDDDDDHHHLLLHHHLLLNNNFFFBBB]]]HHH@@@DDD@@@BBBBBBBBB===BBBLLLDDDDDDFFFHHH===BBBDDDWWWJJJ@@@888kkuu..88PP==..k"'}"WDj'8F2BH28F+5D.2B"+8.DL+2@.+.+22+F.N+J".Nrv{''TTTLLL........5522............@@bbi\xuwiYYBB==;;5eZ+="2;..iDDFFDD==55w""TB222222$/<vvvvvvvvvvvvvvvvvvvvvvvvgggtttfffYYY===λͺͺͺ͹̸̷̸͸μ͹͹ξ̸̸LLLBBBPPPNNNJJJ222@@@NNN@@@DDDTTTDDDDDDDDDLLLYYYWWWPPPNNN===DDDDDDFFFDDDDDDNNN;;;JJJJJJDDDUUUDDDFFFDDDJJJHHHJJJDDDNNNBBBRRRLLLFFFDDDFFFHHHJJJJJJ''WWWW;;JJ++22prmDW`zDYk5@J+8B2;F=@W"8=+.D'58".8+."25+H.P.L".Y~}{++..DDm\;;PP88rnuiZY@@@@@@5j].@2F.B5""T55|;;55|..i""N=";";"="822$/<vvvvvvvvvvvvvvvvvvgggtttfffYYY===͹͹νϾͺ͸̸˶˶̷̸͹ͻϾϾͺ͸UUU===JJJDDDJJJFFF@@@FFFBBBFFFFFFFFF@@@WWWDDDBBBHHHYYYRRRDDDPPPDDDDDDDDDDDDTTTDDD;;;UUUBBBjjjJJJLLLFFFDDDDDDPPPDDD===;;;fffBBBWWWLLL@@@BBBBBBLLL++BB88PP==BB55JJ\\''n'.]sL`z'@L2DL+=L5FT+=T';B2;J5@F.D.."+2"=.N2T.L"2g''==..~}++DD\++kkzz..""""roukZ[[@@@@@op'8j2F5H2F'55H""U""RJ";'D'D+J+J'B5vvvvvvvvvvvvgggtttfffYYY===͹ͺͺͺ͹͸͹ͺ͹͸̷˶˶͹ͺνϿͺμϿ@@@222LLLJJJFFFLLLDDDFFFBBBDDDFFFcccRRR@@@@@@JJJBBBJJJTTT@@@FFF]]]DDDDDDBBBWWWPPPBBBDDD@@@DDDFFFBBBDDD@@@BBBJJJPPPDDDBBBBBB;;;===RRRLLLFFFFFF===BBDD88..ZZss;;""''J`u+HP.BR';L'HH8DR5=R8FZ8BT"=D8L+5+2"2+H2U5Y.P"2HHggFF5555++ee..\22ZZHHZZJJumneYIIBB@umDD5=2L.@'8".'"+";+F.N2R.N'@$/<vvvvvvgggtttfffYYY===μͻͺ͹̸͸͹λͺ͹̸˶˶ͺνϾϾ͹˶̷̸ͺNNNDDD888BBBHHHWWWHHHFFFDDDDDDDDDNNNZZZ```BBBDDDHHH;;;]]]DDDDDDJJJUUUBBBBBBBBBTTTNNNDDDBBBBBBBBBPPPPPPFFFBBB======LLLFFFBBBJJJ;;;NNNJJJBBBFFFWWW""__mm55DDwDD8N]';N2P`'BW"@R2HW25L.8J+8F'BH'2D+5@"2+D2U8\8]2T@"2NNJJ]]||..++..==''\88ӏ88""\\zzbbvjk`YBB=YBBDD=@'2c"5""'".2'@.L2U2T+J$/>gggtttfffYYY===ͻͺ͹͸͸͹νͻ͸̷˶ϾξϾνͺ̸˶˶͹μνλUUUFFFBBBDDDHHHJJJTTTDDDLLL;;;NNNDDD===FFFBBBBBBWWWLLLFFFDDDDDDDDDDDDLLLDDD@@@NNN```FFFHHH===;;;DDDTTTFFFJJJFFF===FFFfff@@@@@@DDDccc@@@JJJ;;;UUU;;BB""DDzJN5JT5Re2H].=LTbv8=R+BN'DU2JR2DP'8@'+;".2U;`=f;`2Rt++++ggÀ@@88==++\..ȣYY88==poZYBb@@BD25i';R+.T'2"+"+""'225+F.P2T.L$/>gggtttfffYYY===μλͺ͹͹ͺͻμͺ͹͹ξνϾνͻͺ̷˶͸λϾͻμͻλμJJJRRRLLL===PPPDDDHHHDDDRRR]]]@@@HHHLLLnnnDDD@@@DDDBBBDDDRRRBBBFFF;;;UUULLLDDDDDDBBB===FFFRRRBBB]]]FFFFFFUUULLLJJJBBBDDD]]]JJJFFFJJJBBBPPP555DDD22..~prkBL8RgB`s;H`BTjFWj=J\;N_'=P'2N'8D"'8.F;b@i=g"8\o+ccDD..++\""||ƺDD{rY8@u28o'2J"+5'.@'2;.;'+"+8..22";+J.P+JgggtttfffYYY===Ͼλͺͺͺνͻ͹͹μμϾν̷̸͸͹̸͸ͺ@@@DDDWWWBBBDDDBBBDDDDDDDDDNNNUUU222FFFFFFDDDPPPLLLJJJLLLDDD\\\PPPbbb@@@PPPLLLHHHDDDDDD===BBB===HHHDDDFFFBBBDDDLLLHHHFFFFFF===BBBRRRFFFNNNPPP555FF'';;gg;;z}fxFcz.DN;@Z.@J@Nc+BN.LZ5@U'BR+=J+2B5=}2z2x2JJ++\..55++~kY~kubHg'BN'28+5H'2D'85";D.2'.""+'22"8+H.N+J$/>gggtttfffYYY===ͺ͸͸͹ͺλλϾλν̸̷̷̷̸λNNNHHHDDDBBBHHHFFF@@@]]]BBBDDDLLLFFFDDDDDDBBBPPPBBBNNNLLLJJJDDD@@@YYYPPPBBBJJJBBB===TTTDDDFFFUUU@@@LLLHHH```BBB\\\HHH@@@FFFDDDPPPBBBDDD888JJJNNNggDDFFss;;@@@@22kFF.JW;FP.HU+BP2FT5JH.BL+@@'8@PRWWDD""FF++\pYW25;@v"2=5DL28H.8F'.8".=.DJ'+;.'.+22+F.L+J$/>gggtttfffYYY===ͺ̷̷̷̸ͺνϾνϾμμμμͺξϿ͹͹͸͹Ͽ888JJJRRRLLLHHHRRRNNNDDD@@@BBBTTTDDDDDDNNNFFFYYY@@@BBB===PPPDDDHHHBBBRRRLLLYYYJJJPPPRRRTTT@@@LLL@@@BBB888NNNHHH@@@BBBFFFNNNDDDRRRHHHJJJFFF\\\@@@""88||À\\HH__''z''+DN2DL+BL+BW=B'8H+;J+8B'+L88FFTTNN++䂂TT_rvxV_v\uDZm2;B.8D2;F@@Y"58'2D+5@+5'+'25+F.N.L$/>55__ނނ__55gggtttfffYYY===͸̸̸˷˶̷ͺϾμͻͺͺͺλͻ͹ͺBBBDDD;;;FFFDDDBBBFFFTTTBBBBBBDDDJJJFFFDDD;;;PPPLLLPPP@@@DDDPPPDDDLLL===BBBDDD@@@@@@BBBNNNJJJFFFWWW\\\JJJLLLJJJDDDDDD888;;;LLLRRR@@@RRRLLL@@@NNN''NN22++22==NN..8855++++~"'`+8'@R8N+=B.=Y+=e55o8'WNNUU55''==..|{}zSnbLPXmYo'@J5FN.@L2@L5BZ'8@2=L5@D".@.2"+2";.L2R.L55__ނގގގގގގނ__55gggtttfffYYY===͹͸̸̷˷̸ͺμϿλͺͺͻμJJJFFFFFF;;;FFFTTTJJJFFFHHHiiiFFFFFFBBBBBBHHHBBBHHHNNNWWWBBBFFFBBB___TTT@@@DDDHHHDDDRRRBBB\\\HHHBBBDDDDDDLLLPPPDDDDDDRRR===@@@FFFNNNHHHTTTBBBBBBww""++55@@YYHHs2rHHFHHHBB55|{+""++22BBRRDD++@@BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++b\::Wp2HR.DR+=L+FH8@N.@T.BP8@R"=D;L".5'2.+F2T5W.P$/>55__ނގގގގގގގގގގގގނ__55gggtttfffYYY===ͺ͹͸̸̷̸ͺϾͺͺͺμBBBDDDRRRWWW===;;;DDDWWWRRRHHHTTTFFFLLLBBBHHH@@@BBBBBBFFFRRRcccYYYBBBHHHHHHeeeJJJBBBHHH@@@BBBHHHBBBBBBNNN555BBBUUUJJJJJJYYY888...@@@BBB===UUU888++rrxx88j8HHDDD;t@''++WW88''TTÀgg""''""BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++N=?@Te'@N8Rc.HZ"FU.BR55J2;P.;H'@H'.F'2@".'@2R5Z8]2R55__ނގގގގގގގގގގގގގގގގގގނ__55gggtttfffYYY===ͺ͹͸͹͹͸λ͸̸͹ͺͺͻμBBBBBBFFFFFFTTTBBBBBBBBBWWWBBBBBB===PPPRRRDDDJJJeeeDDD===@@@BBBRRRFFF@@@@@@DDDFFFDDDLLLFFFJJJJJJBBB===DDD@@@FFF@@@TTTBBBNNNRRRBBBJJJJJJBBBNNNRRR""~ffYYBB55..""'=22""++DD]]``==LLffBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++QCF.HP.FZ.J]+@PN]s;FW+BL+BR2DL2HR'8='.8"52R8_=e;`2T55__ނގގގގގގގގގގގގގގގގގގގގގގގގނ__55uspmmm\\\UTRͻͺͺͺͺλμ̸̷̸͹Ͼͺμ555DDD@@@LLLPPP===RRR@@@@@@```DDDFFF222HHHHHHHHHFFFFFFTTTHHHUUU===LLLFFFFFFHHHDDDUUUDDDJJJLLLTTTHHHJJJRRRLLLBBB===FFFDDDfffFFFLLLDDDDDDZZZDDDUUU++..==''ZZmmmm@@..ZZ""""@@HH]]DD==__BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++3HU8Tg5Rb5DZBRg@N`=F_2J]"BR.8R".@"+8.@;`=g@i;`4AR55__ނގގގގގގގގގގގގގގގގގގގގގގގގގގގގގގނ__55ssskkk\\\μͺͺλͺͺͺμͺ̸͸̷̸ϾϾJJJ555555555\\\DDDBBBNNNDDDHHH===HHHTTT888======PPPFFFWWW888HHHPPPHHHJJJPPPrrrBBBBBB===;;;888DDDHHHWWW;;;HHHPPP555NNN\\\@@@DDDDDDLLL===LLLBBBLLL""BB..BB++"";;DDjjBBPPggTT..~55``ee""BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++W57UZ`D`v+BN;@\2=J@Nc.FR.HW5=Y';N+BL'.BB5LY;DN+JR+@R2FR2HN5HT'=B'2=@DK55__ނގގގގގގގގގގގގގގގޖަ޻û޻ަޖގގގގގގގގގގގގގގގނ__55ͺ͹͹͸ͺͺ͹͹ͺͺμϾͺͻ͹˶̸λμλλλλͺLLLFFF;;;PPPBBBFFF======DDDBBB===WWWNNNJJJDDDPPP\\\YYYBBBHHHBBBFFFHHH===HHHNNNNNNBBBDDDBBBRRRDDDJJJDDDWWW===DDDHHHLLL888===HHHBBB@@@FFFHHHLLLHHHFFjjBBWW__''22DDDDDDPP''""LLff''{'HR8HP+=N'BTBF+@J'=F+=D'2Lގގގގގގގގގގގގގގގޖަ޻û޻ަޖގގގގގގގގގގގގގގގμλμͺͺͺͺ͹ͺͺͺμͺν̸˶͸Ͼͻμμͺͺͺμμ\\\UUU======NNNLLLPPP;;;TTTYYY555===888PPPFFFBBBBBBFFFDDDWWWJJJHHHJJJ@@@DDDBBB]]]bbb@@@DDD@@@BBBUUUBBBHHH888;;;ZZZDDDBBB===PPPDDDBBB===TTT888NNN''xx2288PPDD""..@@"";;kkxxee++6=G'BJ8N'=D.;H"=T25`ގގގގގގގގގގގގޖަ޻û޻ަޖގގގގގގގގގގގގμμμνλλͺͺ͹ͺϾϿͺͺλͺ̸˶ͻμλϿͺμμμϿμDDDDDDUUUBBBDDD@@@FFFJJJ@@@HHHFFFNNNFFFUUUFFFDDDDDDJJJLLLHHH@@@======TTTDDDBBBBBB\\\@@@```ooo@@@UUUBBBLLLDDDNNNDDDYYYJJJ555FFFBBB@@@;;;BBBHHH555DD""""__PPTTTT..''22DD\\cc88{{++JLBF@DDFBB88OOfގގގގގގގގގޖަ޻û޻ަޖގގގގގގގގގμμϾͺͺ͹̸̸̸ͺλλͺͺϾμ̸͹μϾBBB@@@===@@@HHHFFF555HHHLLLBBBLLLNNNHHHUUUBBBDDDPPPBBB@@@FFFLLLUUU===FFF]]]DDD@@@JJJFFFNNNWWW@@@@@@BBBFFFRRRRRRHHHDDDHHH@@@FFFHHH@@@FFF222NNN@@@""..RR__""88@@DD~BBii55RR{{LLDDPPJJHHFF==JJoގގގގގގޖަ޻û޻ަޖގގގގގގͺμμ͹˶˵ʴ˵˶͹λϾϿͺμμϾμμϾλDDDRRRDDDPPP@@@JJJRRR;;;FFFFFFLLL===;;;======;;;DDD888BBB222HHHFFFHHH@@@DDDPPP;;;@@@LLL===BBBUUUDDDLLLHHH888555BBBBBBNNN222BBBLLL===FFFDDDNNNHHH55==ffmmDD"";;||HH;;||ff55ގގގޖަ޻þ޾ޯޙޙޯ޾û޻ަޖގގގϿϾϿ͸˶˵˴˵̸ͺͺ͹λμμϿμͺͺνDDDBBBLLLHHHNNN===PPPYYY...BBBJJJJJJYYYFFFDDD===RRRDDDNNNNNN;;;NNNeeeHHHDDDNNNPPPBBBFFFFFFLLL@@@DDDBBBNNNFFFBBBJJJDDDHHHBBB___FFF555FFFPPPBBBDDD..LL""""..iimmPP++"";;HH..iirr88ͺͺ˶˶μνμμλλϾͺ̸͸͸ͺμͺ͸̸ͺͺλλͺͺͺͺͺͺͺͺ˶˶ƛURN============================================================================================================NJHͺ|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY@@ooTTbb""==22""``ttLL''..++D]Jf@Y.B"2͸˶˴̷μμμμμμμλͺ͸͸ͺͻϿμͺλμμμλͺ͹͸̸̸͸˶˴̷ˠ\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@cccbbzzWW..wwHHYYWW22DD]]''++{~;SePoJgBZ2D+;ν˷̸ͻμϾμμμμνμͻͺͺͺͻͺμͺ͹λνλλͺ̸̸̸̸ν˷̸ͻμϾonkkkkmmmffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbTTTNJFccc..'';;ZZWW""BBDD|JJee..""''@@HH..""PoJgB\2F+;#ϾϾμμμμμμϿͺ͸̷͸ͺͺλͺμμͺ͹͸̸̸͸͸ϾϾμusrԋ|||ssspppppppppppppppppppppppppppppppppppppppppppppfffYYY===dzccc==zzBB@@jjLLDDBBee55~~;;..22;;''DDWWbbRR55;VkPoLiD]5H+;!,λλͻμμμμϾ͹̸̷̸ͺμμͺͺλ͹͸͸͸͹͹͹λssstttttttttttttttttttttttttttttttttttttttttttttuuuuuurrrppppppppppppppppppppppppppppppppppppfffYYY===dzccc""22++""BBnn``''22RR~~wwDD88LL'']]\YYYNjRp@gYxNm5H#19ͻ͹͹ͺͺͺͻͺͺνμͺ̸̸͹μλͺͺ͸͸͹͹ͺͺͺͻ͹uspgggggggggggggggggggggggggggggggggggggggggggggiiijjjmmmnnnppp{{{ʗrrrppppppppppppppppppppppppppppppfffYYY===dzccc""FFkkxx]]==\\..ggccFFcc""t{rf\YYTt_2oY+g+L.Pc+?Mλͺ͹̸͹͹ͺμϾλͺνμμμ͸ͺϾμλξ͸ͺͺλϾλͺ͹̸͹͹ͺμϾλͺνμμμ͸ͺϾļ}{oootttшpppppppppppppppppppppppppppfffYYY===dzccc;;}22\\;;;;YY..88++~~;;++mmkkBB88@@S_\\\\\\\\\\\\\\\\\\\\ZLYYYcwwi]YY?Yl]gk2t2+b+J@81DSλͺ͹̸̸͹ͻͺͺͺμμͺͺμλͺλμμͺͺμξλͺ͹̸̸͹ͻͺͺͺμμͺͺμnnnvvv骪rrrpppppppppppppppppppppfffYYY===dzccc;;;;uuHH++BB==@@TT==PPNNLL""YYHH++LL++++++++++++++++++z}Z++++++++++++++++++xrjkmu}|zmYe.sR.k.'W'HB"@EHλͺ͹͹͸ͺμλͺ͹͹͹ξͺλνͺͺλλμλͺ͹͹͸ͺμλͺ͹͹͹ξͺλƶppptttppppppppppppppppppfffYYY===dzcccLLLLooss88~;;ZZ..55NNggWW""PP888888888888888888f888888888888888888vjijt}_Ul~e.k.'Y'JFFλͺͺͺͺλνμͺͺ͹͸ͺϿϾͺμνλͺͺͺͺλνμͺͺ͹͸ͺϿǿzwutttpppppppppppppppfffYYY===dzcccccggYYjj\\~|sop""ns++}BB@@ttx''88~{@@==================v=================={k]`fs|Y)eo.o..k.']'JFLWLνͺͻνͺͺͺμμμμλͺͺ̸̸λμͻ͹̷ͺϾνͺͻνͺͺͺμμμμλͺͺ̸̸λμxwv|||rrrppppppppppppfffYYY===dzccc..nnFFeeJJ88DD""@@''tD+.+2222222.2+H"c22m==u88tz~|BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBvnku{YAvA5|52u2.j.'W'F9N9μͺͺͺξξͺ͹͸ͺλλμ̸˶̷͹λλμ̷˴˵˶͸ͺͻͺͺλμͺͺͺξξͺ͹͸ͺλλμ̸˶̷͹λλμöxvt檪ppppppppppppfffYYY===dzccc""..;;RR``''""__NN""w+";22222222222''BLcsDD''''55}xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD}mY88885|5.o.+b+J)I)νͺ̸͹λͺ͸͸ͺϾ͹˵˴˵̸͸Ͽλμ͸ʴʴ˴˵˶͸ͺͺͺͺμνͺ̸͹λͺ͸͸ͺϾ͹˵˴˵̸͸Ͽλμ͸Ͼzwu鈈pppppppppfffYYY===dzcccz..JJFF22''PU+H";2222222222228@Tg22PPeeBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}um`YYff;;;;8~82u2+g+"R"F,;+;+;'8%ͺ̸ͺμϿμμμλͺ͹̸˴ʴ˴˶̷ͺμϿμͺͺϿμ͹˶ʳʳ˴˶͹λνͺͺͺͺͺ̸ͺμϿμμμλͺ͹̸˴ʴ˴˶̷ͺμϿμͺͺϿμ͹˶ʳppprrrppppppfffYYY===dzccc""''}JY+J+H+H'D'D'D'D'D'D'D'D"=22.'@N\k{'';;88''@@;;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFre\YYY==;;885z5.j."U"F2F+;+;+;'8ͺ͹͹͸͸ͺμμμλͺνϾϿͺ̷˵˵˵˶̷͹ͺͺλμͺͺ͹͸̸̸˶ʴʲʳ˴͸ͺͺ͹͸ͺ͹͹͸͸ͺμμμλͺνϾϿͺ̷˵˵˵˶̷͹ͺͺλμͺͺ͹͸̸̸˶ʴʲʳvvv՗ppppppfffYYY===dzcccY=W8\;c;b8_8]8]8]8]8]8]8]5W+F5"+@NYcn{++""BBZZWWUUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFr_YYYYVV@@==;;5z5.i.'Y'F.GJ2D.B+=+;+;#ͻͺ͹̸͹ͺϾμͻͺͺͺͺͺ͸͹̸˶̷̸͸ͺͺͺͺλλͻͺ̸˶˶˶˵ʳʴ˵͹ͺͺ͸̸ͻͺ͹̸͹ͺϾμͻͺͺͺͺͺ͸͹̸˶̷̸͸ͺͺͺͺλλͻͺ̸˶˶˶˵ʳʴ®nnnrrrpppfffYYY===dzccc""""88~J2TBmDpBn@k@k@k@k@k@k@k@k=f5Y'B"+@N\`gpu|''NNUUDD@@nnFFFFFFFFFFFFFFFFFFsgcirFFFFFFFFFFFFFFFFFFzi\YYYY@@==;;5z5.i."U"F'HZ"H=@+28+;Ͽͺ͸͹ͺϿλͺ͹̸͸ͺ͹ͺͺ͹ͺͺͺͺͺͻμϾͺ͹͸͹̸˵˴˵͹Ͼλ͹͹Ͽͺ͸͹ͺϿλͺ͹̸͸ͺ͹ͺͺ͹ͺͺͺͺͺͻμϾͺ͹͸͹̸˵˴˵tttňpppfffYYY===dzccc55BBJJTT==~~B8\FuHxFvDsDsDsDsDsDsDsDsBm;b.L".@RZbgjjrw{WWkkFFFFFFFFFFFFFFFFFFmiic\YYZmFFFFFFFFFFFFFFFFFFs_YYYY==2t=J5B2822.+.!4E+5+.+.'.'8*ͺ͸͹ͺν͸̸̸͹ͺͺλλνμͻͺλμνμϾμ̸˶˵͹ͺͺͺ͸͹ͺν͸̸̸͹ͺͺλλνμͻͺλμνμϾμ̸˶˵ϿooopppfffYYY===dzccc''UU==NNeessBB''''to88_HxJ|J{HwHwHwFvFtDrDpBo@j;`.N".DT]bfjjptt{88""FFFFFFFFFFFFFFFFFFu_YYeFFFFFFFFFFFFFFFFFFfZYYYY&XF";22222222222ϾϾ͸̸͹Ͼμ͸̸͹ͺμͺμμͺͺλϾμͺ̸˶͹ͻμϾϾ͸̸͹Ͼμ͸̸͹ͺμͺμμͺͺλϾμͺ̸˶͹|w{{{sssfffYYY===dzccc++iijj55DDZZ==++jY25ZHzJ}J{HxHwFtBo@j=f;c;c;`5W+H5@NZ''W\jnu|zt}FFFFFFFFFFFFFFFFFFiYYmFFFFFFFFFFFFFFFFFF|e\YYYIP^+H";222222222222#(2λͺ˷˶̸ͺϾͺ͸͸ͺμμμͻͺλλ͹̸͹ϾϿλͺ˷˶̸ͺϾͺ͸͸ͺμμμͻͺλλ͹̸͹ppp|||fffYYY===dzccc``JJ;;ZZHH|"+Y"2.=F+WHwJ}J{HwDp=g8\2U.N+J.L+J+F"=BF'=8+=BRiw}}FFFFFFFFFFFFFFFFFFiYZFFFFFFFFFFFFFFFFFF}g\YY+H";222222222222"1ͺ͹˶̸λ͹͸ͺνμͻͺͺμνλ͹͸ͺͺλͺ͹˶̸λ͹͸ͺνμͻͺͺμνλ͹͸ͺĶnnnfffYYY===dzccc''\eH.U''_'']''Y''Z..n+;v@fFv@k8\.L'B"82255.@FH""LJF'=@Pm++\\..FFFFFFFFFFFFFFFFFF_YrFFFFFFFFFFFFFFFFFFweYY@N+H";222222222222%3[^dIPXQW^ͺ͹̸ͺμ͹͹ͻλͺ͹ͺμμμλμͺͺͺͺ͹ͺͺμϿͺ͹̸ͺμ͹͹ͻλͺ͹ͺμμμλμͺͺͺͺɺmmmfffYYY===dzccc{|H.m22r;;8855}55}8828x'5"5+R".W"2+=."8=8=F""L''Z''\""RF+;De""bbHH55PP++FFFFFFFFFFFFFFFFFFuYiFFFFFFFFFFFFFFFFFF|t\Y4n4HN+H'B'@"="="="="="="="="822+.;FT2BR8DRμͺ̸ͺμͺͺλϿλ͹ͺͻλμμμλͻλμμμͺ͹͹͹λμͺ̸ͺμͺͺλϿλ͹ͺͻλμμμλͻλμμμͺjjjuuufffYYY===dzccc8888@@BB@@@@@@@@'2f'8"2='5@2B".+5"5.+22FH'']++g++c''YFFj@@22''DDPPbbFFFFFFFFFFFFFFFFFF\cFFFFFFFFFFFFFFFFFFvbY_v_5{5LP5W8_8]5Z5Z5Z5Z5Z5Z5Z5Z2T'@2+.F.;N2=NIPXν̸˶͹Ͽͺͺ͹ͺͺͺͺμμμλͺͺͺλ͹ͺν̸˶͹Ͽͺͺ͹ͺͺͺͺμμμλͺͺͺiiiuuufffYYY===dzcccppDD..P;FFFFFFDDDDDD2R+@"5B2;'+=';F'8+;'2;"2"+"'"'FF''\..j22s..k'DYu55UUZZZZFFFFFFFFFFFFFFFFFFcgFFFFFFFFFFFFFFFFFFwvcYY5w5LT@jBnBm@i@i@i@i@i@i@i@i;c5W"=+.FPZP))IFF˷˴̸ͺμλͺͺϾλ͹͹ϾϾλͺͺͺͺͻν˷˴̸ͺμλͺͺϾλ͹͹ϾϾλͺͺͺgggtttfffYYY===dzcccLLPP""LL==_;JJJJHHHHHH@B8F"8B+5D;@'BF"5D+8D+5'+=+;"+2".'@F''W..m55{22u=Fk{==iiFFFFFFFFFFFFFFFFFF''..isFFFFFFFFFFFFFFFFFF~ssiYYKqK2s2D_FtFvFuDrDrDrDrDrDrDrDrBm;`+J'2FCSC55NFFFF˶ʴ˶͹ϾλϿμͺ̸͹μμλͺͺν͹ͺλ˶ʴ˶͹ϾλϿμͺ̸͹μμλͺͺgggtttfffYYY===dzccckkuu..88PP==..'YHHJJHHHHHH+;s+BJ28B.+F+5H8D+;P.8B22H+8@+2B+.8"+;'2"'2F''W..m55|22tc.xw{''FFFFFFFFFFFFFFFFFF==eeiFFFFFFFFFFFFFFFFFFxuwiYY+\=;gHxJ|HzFvFvFvFvFuDsDrBo@j;`.N;@+FTFFFFF^^eϾ˵ʴ˶͹ͺλͺͺͺ͹̸̷̸͸μ͹͹ξ̸̸Ͼ˵ʴ˶͹ͺλͺͺͺ͹̸̷̸͸μ͹͹gggtttfffYYY===dzccc''WWWW;;JJ++8iNDDDDDBB8R;H+8B+5P+=D2D]+8N+@H.2H'BH=J.@B".;"'."+'D''W..j=5tj'H~|{FFFFFFFFFFFFFFFFFF..DDmFFFFFFFFFFFFFFFFFF;;PP88rnuiZY"N28bHzJ}J{HxHxFvDrBm@j=g=g;c5Z+J=@+=GIFFFF))I˶˴˶͸͸͸͹͹νϾͺ͸̸˶˶̷̸͹ͻϾϾͺ͸˶˴˶͸͸͸͹͹νϾͺ͸̸˶˶̷̸͹ͻϾϾgggtttfffYYY===dzccc++BB88PP==BB55JJTY..\;L.;B'FJ8DP8@J5N\8R`.DL5D\+5L.BL5JL'2;5='.".8W;;TTDDBB..~}FFFFFFFFFFFFFFFFFFDD..++FFFFFFFFFFFFFFFFFF++kkzz..""""roukZnns!*C.WHxJ}J{HxDs@j;`5Z2T.N.P.P+J'BB'B"DFFFF̸͹νͻͺ͹ͺͺͺ͹͸͹ͺ͹͸̷˶˶͹ͺνϿͺμϿ̸͹νͻͺ͹ͺͺͺ͹͸͹ͺ͹͸̷˶˶͹ͺνϿͺμgggtttfffYYY===dzcccBBDD88..ZZUY2D;H'BP'BL5DW2DRDRi8@P.HP"=L5@Y+=J'@N".@.;'.+"Jz88bbeemmFF5555FFFFFFFFFFFFFFFFFFbb@@@555FFFFFFFFFFFFFFFFFF22ZZHHZZJJumneY::^""T""P""R++g@vFtHxBo;`2R+H'@"85"8"8"5=FFHHFFFKKWϿϿμͻͺ͹̸͸͹λͺ͹̸˶˶ͺνϾϾ͹˶̷̸ͺϿϿμͻͺ͹̸͸͹λͺ͹̸˶˶ͺνϾϾ͹˶̷̸ͺgggtttfffYYY===dzccc""__efH2B2H2@D+;@5FN.@L=N`2@P8Ym=Pb'@L.FL'@='8D"55".;+8'pLL]]LL]]||..FFFFFFFFFFFFFFFFFF..@@@@@555zFFFFFFFFFFFFFFFFFF88ӏ88""\\zzbbvjk`Y**Y++g8855|55w55w8825v"2.H.U.Y";';.";;5'=F""L''W''Y""NFFͻͺ͹͸͸͹νͻ͸̷˶ϾξϾνͺ̸˶˶͹μνλͻͺ͹͸͸͹νͻ͸̷˶ϾξϾνͺ̸˶˶͹μgggtttfffYYY===dzccc;;BB""~;=BDT5=P;;T@Ri8DZ2;L+@P8FU'=J2DN"FJ"5F".@'2`{++++ggÀ@@88==FFFFFFFFFFFFFFFFFF..@@@555JFFFFFFFFFFFFFFFFFF..ȣYY88==poZYDDv22v==@@@@======+5j'8.;'.F2D""..8"2.".52FH'']++e''_""RFμλͺ͹͹ͺͻμͺ͹͹ξνϾνͻͺ̷˶͸λϾͻμͻλμμλͺ͹͹ͺͻμͺ͹͹ξνϾνͻͺ̷˶͸λgggtttfffYYY===dzccc22..~F;H8=N8BN2@L@Ue+FR;=TDUj5BR'=J'@R";D"8@8'5xz~ccDD..FFFFFFFFFFFFFFFFFF..@@@555WvFFFFFFFFFFFFFFFFFF""||ƺDD{rY====FFFFDDDDDDDD.P+@"2@5;"+82;"2+=".8"."+''FF'']..j..n++g//NϾλͺͺͺνͻ͹͹μμϾν̷̸͸͹̸͸ͺϾλͺͺͺνͻ͹͹μμϾν̷̸͸gggtttfffYYY===dzcccFF'';;gg;;z}.FW8BL5FR+LN+BY@Lb.;N58L+FJ+8L+8@.2;}55JJFFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFF..55++~kYDDBBJJJJHHFFFFBD.@5='2@8='=B'5D+8F'5+.B'5"+2"."BF''Y..m55z22s22Tͺͺ͸͸͹ͺλλϾλν̸̷̷̷̸λͺͺ͸͸͹ͺλλϾλν̸̷̷gggtttfffYYY===dzcccggDDFFss;;@@@@"8;D+@J';L"DW8JZ.;N2;R5@H;=FD@BcgWWDD""FFFFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFFpYdzBBJJJJJJHHHH.;x+FJ+2='.B"2B"8D+=N.8=+2B.8B+5H+.8+;"+"'2F""U..m55}22vII^ͺͺ̷̷̷̸ͺνϾνϾμμμμͺξϿ͹͹͸͹Ͽͺͺ̷̷̷̸ͺνϾνϾμμμμͺξϿ͹͹gggtttfffYYY===dzccc""88||À\\HH__''gU'5DDL+BU'8H'HU"DL8;F_58j@@FFTTNNFFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFFrv}R_FFFFFFFF5P"@R.;F+5R+;F2F_.8T.@L..F'@D;F+;@"2="'."+"F''W..j55x??nͺ͸̸̸˷˶̷ͺϾμͻͺͺͺλͻ͹ͺͺ͸̸̸˷˶̷ͺϾμͻͺͺͺλͻgggtttfffYYY===dzccc''NN22++22==NN..8855++++}t"'r"'U2;U;Bu+u}NNUU55''==..|{}FFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFFntgpp.5n"=L.=B'BB8DP5@F8R`2LW.BJ2;T+=N'=H.DB+.;5='+"555Ghhyͺ͹͸̸̷˷̸ͺμϿλͺͺͻμͺ͹͸̸̷˷̸ͺμϿλͺͺgggtttfffYYY===dzcccww""++55@@YYHH""++22BBRRDD++@@JJJJJJJJJJJJJJJJJJTT22@@@555JJJJJJJJJJJJJJJJJJbm~jOZg9?D.B8H'BP+DN2BU=RcBL`5@N2HP2HZ5;W.=J+DN+;.;".'"9;<ͺλμͺ͹͸̸̷̸ͺϾͺͺͺμͺλμͺ͹͸̸̷̸ͺϾͺͺͺμgggtttfffYYY===dzccc++rrxx88''++WW88''TTÀgg""''""RRRRRRRRRRRRRRRRRR䂂++++++++++++++++88@@@555""''""""""""''''RRRRRRRRRRRRRRRRRR2D5H+=B+=B8JU5FU;Nb2BT+N`;N_+BN+DL+@@'8H"55"2;".+ADG͹ͺμμͺ͹͸͹͹͸λ͸̸͹ͺͺͻμ͹ͺμμͺ͹͸͹͹͸λ͸̸͹ͺͺͻμgggtttfffYYY===dzccc""~ffYYBB55..""22""++DD]]``==LLffJJJJJJJJJJJJJJJJJJ++..@@@555JJJJJJJJJJJJJJJJJJCLV.AS2=R=;U@To8@U.8J5J].BR'BL5FR"@D"5B'2B".;>BͺͺλμϾͻͺͺͺͺλμ̸̷̸͹ϾͺμͺͺλμϾͻͺͺͺͺλμ̸̷̸͹Ͼͺμutsmmm\\\UTRdzccc++..==''ZZmmmm@@..ZZ""""@@HH]]DD==__HHHHHHHHHHHHHHHHHH..@@@555HHHHHHHHHHHHHHHHHH:CT25D8BP;HW=N_+@P8@RDRc5DT+=L+FR"8F8@!.:ijk͹ͺͺͺμμμͺͺλͺͺͺμͺ̸͸̷̸ϾϾ͹ͺͺͺμμμͺͺλͺͺͺμͺ̸͸̷̸ϾϾϦssskkk\\\dzccc""BB..BB++"";;DDjjBBPPggTT..~55``ee""FFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFF5HU5BJ2DR.TZ+HZ@H].;N.8F'FJ'8J+=D.2;;BGͺͺͺ͹ͺͺͺͺμλλμͺͺμϾͻλϾͻλͺ̷̷ξͺͺͺ͹ͺͺͺͺμλλμͺͺμϾͻλϾͻλͺ̷̷Ħusponmάdzccc""++''rrmm88''RRBBUUnnTT552288""BBBBBBBBBBBBBBBBBB..@@@555==BBBBBBBBBBBBBBBBBBuxy4EM2FN+;P.DY8HZ+8L5;U5@J.BH+BF?BNͺ͹͹͸ͺͺ͹͹ͺͺμϾͺͻ͹˶̸λμλλλλͺͺ͹͹͸ͺͺ͹͹ͺͺμϾͺͻ͹˶̸λμλλλλͺ̬dzcccFFjjBBWW__''22DDDDDDPP''""LLff''{LLL@@@555N+.8EN4O[+BT2BU+FU+DP&AJ7<@O(,μλμͺͺͺͺ͹ͺͺͺμͺν̸˶͸Ͼͻμμͺͺͺμμμλμͺͺͺͺ͹ͺͺͺμͺν̸˶͸ϾͻμμͺͺͺμμƬdzccc''xx2288PPDD""..@@"";;kkxxee++BBB888AAAraaT57DFL*>IC=CQ,/O35μμμνλλͺͺ͹ͺϾϿͺͺλͺ̸˶ͻμλϿͺμμμϿμμμμνλλͺͺ͹ͺϾϿͺͺλͺ̸˶ͻμλϿͺμμμϿμdzcccDD""""__PPTTTT..''22DD\\cc88{{++TTT\\\BBBJJJμμϾͺͺ͹̸̸̸ͺλλͺͺϾμ̸͹μϾμμϾͺͺ͹̸̸̸ͺλλͺͺϾμ̸͹μϾʬǵccc""..RR__""88@@DD~BBii55RR{{LLDDPP]]]ͺμμ͹˶˵ʴ˵˶͹λϾϿͺμμϾμμϾλͺμμ͹˶˵ʴ˵˶͹λϾϿͺμμϾμμϾλάccc55==ffmmDD"";;||HH;;||ff55ϿϾϿ͸˶˵˴˵̸ͺͺ͹λμμϿμͺͺνϿϾϿ͸˶˵˴˵̸ͺͺ͹λμμϿμͺͺνΧ|||..LL""""..iimmPP++"";;HH..iirr888oWjew\nZm`s+i{g|"cu']n2n]p"fzWi5rRb.k~Yj\oewf{Zmg`tcv\n\oRc.i{"fx2k}Wj\nZj'ewYkWi\o"`sP`"\m]p"btN]Wi"i}ZmPbͺͺ˶˶μνμμλλϾͺ̸͸͸ͺμͺ͸̸ͺͺλλͺͺͺͺͺͺ|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY"gzRc_s"ewJYRcWi.j}_rJZUgYkfzTecx]rbtYkTfWjbu\nUgZm+j|'j~"g{_sJZbu`t\o"g{\oezbucw_rex.gz_scwfz5n\nWi"j}Te͸˶˴̷μμμμμμμλͺ͸͸ͺͻϿμͺλμμμλͺ͹͸̸̸ccccv"buTc.m8o`sZk@sBv2m~buWi]pRcbubvYj`t_s\o_s2mbu`tZm]pL]"cvbu5n]oTeL]Zm]pRb"bu]pTf+evcwUg_s_s"g|Tf\nUgν˷̸ͻμϾμμμμνμͻͺͺͺͻͺμͺ͹λνλλͺ̸̸̸̸cccf=;snsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnf=;DRZk2nYj.j}cv\o"g{Ug'g{Tf.k~2m'bs\nbvZm=scvZkWibv]p2m]r"g{"ewTeTfbubt"btZm]o'g{_rTe;pewYjcwWjUgZnZm5oYk`tϾϾμμμμμμϿͺ͸̷͸ͺͺλͺμμͺ͹͸̸̸͸͸dzcccsn޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻ƒsn.j}HWbv_rZnUgTeUfUf;rYkbu\n@t2k}'i|P`+i|+i|'i}YjWjZmWj]pYkP~\YkZnbuWj"cuYkcv'j~"ewTe\n+ev'j}`tcv'fxZm2k~P`_rλλͻμμμμϾ͹̸̷̸ͺμμͺͺλ͹͸͸͸͹͹͹dz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻sncwbu`sbtbuZk.m]oYjTfRb`u"`sWi"fxfx_s\obt"ewbtewbucv_sZm+gzWjYjZmcw`t"gzUg']nZm_rexP`Wi\obtYk\nTe.i{`tBPͻ͹͹ͺͺͺͻͺͺνμͺ̸̸͹μλͺͺ͸͸͹͹ͺͺͺdz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ."""""""""""""""""""""""""""""""""""".ރ޻snUf;pbu_s'j}+evN_N]buew"]o'cvDv]o_rZn_r]r8n"ew.i{\o_r'k\n\nYj+fx"cv_sZm"fz`t'i{"cvWi]pex'bsTeZm]n8pbv\oFU`s.mλͺ͹̸͹͹ͺμϾλͺνμμμ͸ͺϾμλξ͸ͺURNNLHĬdz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ"޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲"ރ޻snP"u1}_s"ev_sYjYjbubv"_p.j}Yk5pZk\nZmbtcxR~]o]p"`s+i|]pL\bv`t_r]r;p8k}Lz_s]p`ubuexRbUfL|bu"cv"i}Te\nWj"g{fxP`+fxλͺ͹̸̸͹ͻͺͺͺμμͺͺμλͺλμμͺ\\\\\\TTT@@@dz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ"ޫtggggggggggggggggggggggggggggggggtޫ"ރ޻sn"|xtv|}wsuy]o+i{+j|cv]p]pPbTefzZkZk'j}_r=tP`"bt'fx8pZmWi=r"fzWibu]pYjZm`tWi8p\n`sYj"fzbt"i}Wj]pHWTc]p'fx_sTeRcbu2nWgλͺ͹͹͸ͺμλͺ͹͹͹ξͺλνͺͺλλμonkkkkmmmbbbTTTNLLdz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ"ޫggޫ"ރ޻sn===777IJ"zj_cYi_znuzntutsgf\bYi_znzL\'g{Zm8pPbcv'j}'`rTe'k\oYj_ri}"cvRb.k~Wj"fx\ocv5o\n"`sbu]obu2i{Rc]pbv+j}+ctg{'`r`t8ncwcvRc"_p\o\oYk2mTe=r'j}λͺͺͺͺλνμͺͺ͹͸ͺϿϾͺμνgggtttfffYYY===dz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ"ޫggޫ"ރ޻snQITREWRBYP=YP;YP;YP=YRBYPEW777μPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_zRXRl#"cvWiTf2j|bt]nYji}Wi5k}.k}WiRcZm'evYkbuZmcvTeUfYkex2m]o.m_sFwUg\o`sZmUfZmbubv"btexcv_s'cu`s"g{P`Bu+i{]p8oνͺͻνͺͺͺμμμμλͺͺ̸̸λμͻ͹̷ͺgggtttfffYYY===dz.8JZ]p`t`t`t`t`tbu`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tbu`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻snVTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=ͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{ B DFJNRUWU^`tbu]pWjUf+i|Wi_pZmZn@t'j}ZnYjbu"_r]o+i|5o.i{+i|Uf+`r`s\o"cvbucv'i|P`cvL|\n]pZn_s\o_s]r_s+j}+gx"i|Wg]p_r5k}Ugμͺͺͺξξͺ͹͸ͺλλμ̸˶̷͹λλμ̷˴˵˶͸gggtttfffYYY===dz.8JZ]p`t`t`t`t]rbu`t`t`t`t`t`t`t`t`t`t`t`t`t]rbu`t`t`t`t`t`t`t`t`t`t`t`t`t]rcccsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻sn]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=Yϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_ukFHHJFDD>6!_\oTf2k}8o_sYjYk_s"fxRcDu]pbvZm8o+mUfBs'g{.j}.gx\n'ew\ncw`uR~Yj"fx'ewRc=p'i{bvZmZmZm\n_r\o`t]r_rWiN{]p'j}]oνͺ̸͹λͺ͸͸ͺϾ͹˵˴˵̸͸Ͽλμ͸ʴʴ˴˵˶gggtttfffYYY===dz.8JZ]p`t`t`t]rUeHwbu`t`t`t`t`t`t`t`t`t`t`t]r.\jP|bu`t`t`t`t`t`t`t`t`t`t`t]r"Wgcccsn޻ނ"ޫgsn޻ލރރރރރރރރރރރރރރރރރރރރރރލ޻sngޫ"ރ޻sngTosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YPCW000ҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;s""DD22wTDB@;8BDHPfwiTg|_r=p]r;tcv_rZm\oYkTfUgcuWiYkbu\nbu'evYk]p+ewZ"`sYkWj+j|ewN_\nZmRb2i{\nBubui}]p8n'g{]r2mew\obuZmWg"cuͺ̸ͺμϿμμμλͺ͹̸˴ʴ˴˶̷ͺμϿμͺͺϿμ͹˶ʳʳ˴˶͹gggtttfffYYY===dz.8JZ]p`t`t]rUe`efbimHwbu`t`t`t`t`t`t`t`t`t]r.\jP|bu`t`t`t`t`t`t`t`t`t]r+Zjcccsn޻ނ"ޫgsn޻ނ."""""""""""""""""""".ރ޻sngޫ"ރ޻sns^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y.;;__wg5=BBDHD=#ZnZm\oWj\n5pbuP}Wj8rbuYk+fxcv_s_s\oRc"gz+j}2k}Yj"cvL{JxYk`s5o=p.i{_s_r2m]pUf]p_r]pZn_rYkew_r\o\ng|buJYͺ͹͹͸͸ͺμμμλͺνϾϿͺ̷˵˵˵˶̷͹ͺͺλμͺͺ͹͸̸̸˶ʴʲʳ˴͸gggtttfffYYY===dz.8JZ]p`t]rTcZ_`jjjkkkksuJxbu`t`t`t`t`t`t`t]r.\jP|bu`t`t`t`t`t`t`t]r.\jcccsn޻ނ"ޫgsn޻ނ"޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲"ރ޻sngޫ"ރ޻snzc`eijkkkjigfcb]|ZuUkNw`FkU=_P;YP;YP;YPCWHZe`trgkkknnnjjj```RRR:::>>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5A;;..vumB@8+`sbtRbg|"`s"_rbuFw]p\o"fz+i|Wj]o;r+i{cw`tTeUg`t]oZm_s'fz\n5o\o5ncv_s`s\oJx"`s]p_s"`rf{\oUf]p'fx`tYjTe]o5oͻͺ͹̸͹ͺϾμͻͺͺͺͺͺ͸͹̸˶̷̸͸ͺͺͺͺλλͻͺ̸˶˶˶˵ʳʴ˵͹gggtttfffYYY===dz.8JZ]p]rTcFLNbbbjjjkkkvvvu{~Jxbu`t`t`t`t`t]r.\jP}bu`t`t`t`t`t]r.\kcccsn޻ނ"ޫgsn޻ނ"ޫtggggggggggggggggtޫ"ރ޻sngޫ"ރ޻snvcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;YfZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{R_s2pWiYj'gzYkZm\oZn"ew]p_r_sN]YkYk\n"i}cwYk.m'i}\ncw]pRc\nWiWj`t+i{]o\o\n_r\n]rUf'i|cv\ncv_r+n`ucwYj;rϿͺ͸͹ͺϿλͺ͹̸͸ͺ͹ͺͺ͹ͺͺͺͺͺͻμϾͺ͹͸͹̸˵˴˵͹gggtttfffYYY===dz.8JZ\nTcFLNNNNbbbjjjkkkvvvv}Jxbu`t`t`t]r+ZjP|bu`t`t`t]r2]mcccsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻sngkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=YcH'Ӿϻ˷RnnnmmmfffZZZDDDbZ!t}~ztujg]\TYPYPNG...............D@'YPuju}8822f\n'cu2m8k}DwWi`s'i|Ufbu`t8p2m]r2n]pPb]r`tWj`t]pZm"g{cw`t"i|`t]p\oLz"g{'i{`tcw+j~bvZn\o`uPb;rN_"_o"cuWjWiUeͺ͸͹ͺν͸̸̸͹ͺͺλλνμͻͺλμνμϾμ̸˶˵͹gggtttfffYYY===dz.8HWN]FLNNNNNNNbbbjjjkkkvvv~~~|||xJxbu`t]r'YiN|bu`t]r.\kcccsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻snmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIW.ҾϼμPnnnnnngggsj8~urfbWYPYPLF......... UMwkv}~2??''88DD\Yj_pTfUg=tZmTfex.k~P`Te2oHz]r\oFx"_p\o]r"cv_pDu`tcu"g|bu\o"fx]p'fxZn]r_scw`tbv'i|_s"g|'i|P`\obucuYk"i|`t`sϾϾ͸̸͹Ͼμ͸̸͹ͺμͺμμͺͺλϾμͺ̸˶͹gggtttfffYYY===dz+5=HFJLNNNNNNNNNbbbjjjkkkuuuvvvwwww~Jx]r'YgN{]r+Zicccsn޻ނ"ޫgsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻sngޫ"ރ޻snnrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777mmmws]zwkcZYPYP=;'---GOG0G0(`(''''RRQ5ncw"`sZmZm]o`tZnfzf{FUZm]pfz]r"buHxcuTe'g{Yj2j|YkN_Wi"fz`s.mbu=rbv_s_r\oUfYj'ctYjZn`tWj"fz]pexYjWg8r`tλͺ˷˶̸ͺϾͺ͸͸ͺμμμͻͺλλ͹̸͹ϾgggtttfffYYY===dz+5FHJNNNNNNNNNNNNbbbjjjkkkppprrrsss~~~w~Jx"Wgw{}L{'Yicccsn޻ނ"ޫgsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻sngޫ"ރ޻snpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDO'|wkbWYPUL <B\A8m~]]pYk]pcvZmWiWi2k}\o+gzUgYj'fx\n]p8r"_p5j|_rcvi~]p_s_sUg]o`t]rcv5m~_s.k}.j}\oewex]rexZm_sWiWj"j~UfRc_sͺ͹˶̸λ͹͸ͺνμͻͺͺμνλ͹͸ͺͺgggtttfffYYY===dzFHJNNNNNNNNNNNNNNNbbbjjjiiikkkmmmppp}}}ppp|||w~svxxxxcccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ލރރރރރރލ޻sngޫ"ރ޻sngޫ"ރ޻snu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWSzrf\TYPA;rDFJoHHNNvRbZ+i{"cuYk'gz.k~Wi@u2k~]p'ewZnWjbt]oWi]r`t\oZnUg+j}Zm'g{_r`sYk_r\o\o"g{+kYj+cu8oZmL{2j{]p]pbu2nTe]p"j~Yj"btͺ͹̸ͺμ͹͹ͻλͺ͹ͺμμμλμͺͺͺͺ͹gggtttfffYYY===dzNNNNNNNNNNNNNNNNNNbbbgggcccfffjjjooonnnjjjvvvxxxvvvxxxcccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ."""".ރ޻sngޫ"ރ޻sngޫ"ރ޻snz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBY¯ıŲŲðug]YPQI55UFFL]iXBiim_rUf_r]rZm]pewN]Yk+bs'g{f{'j}Yj'j}5nYkDv2n"fxZn_r"fz\nZk8o'g{"fx"fz\nYkL\`u"fzP`+m_rWj=oew`tWiZmbuTe\mcu"exμͺ̸ͺμͺͺλϿλ͹ͺͻλμμμλͻλμμμͺgggtttfffYYY===dzNNNNNNNNNNNNNNNNNN___bbb]]]ccciiicccjjjjjjmmmeeepppuuuwww|||}}}uuucccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"޲ޫޫ޲"ރ޻sngޫ"ރ޻sngޫ"ރ޻snx|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777ıȴʶ˷ʶɵdzñ~uj\TWN22YYFDD5f]]WWbbvZm'gz]pZkYj2n"exf{TeTeYk"fxYj_sexZmZmbuexbu\obvcv'fx]p]pew`t=r'i{cw`sbuL\`t5ncv\n_s.m2nZnbu'gz_r@s_rν̸˶͹Ͽͺͺ͹ͺͺͺͺμμμλͺͺͺggguuufffYYY===dzNNNNNNNNNNNNNNNNNN]]]\\\ZZZbbb\\\___jjjccc```bbb___iiisssrrrrrrzzz~~~{{{~~~wwwkkkpppooossswww~~~zzzcccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"ޫttޫ"ރ޻sngޫ"ރ޻sngޫ"ރ޻snw~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777¯ɶ͹κϻϻκ˸ȵIJtcYYP++''}BB>%%++22Y'j}ZmYk;s]obuTe]pYj+k~.i{Zn;p]pbu8n_r"fzbv]p]pZm]r_s\obuHwZm_sL{Zm5nbtfz\oHxZm\o_s'fzbuZm2mew`t\oJxWj˷˴̸ͺμλͺͺϾλ͹͹ϾϾλͺͺͺgggtttfffYYY===dzNNNNNNNNNNNNNNNNNNWWWYYYYYYYYYYYY___cccYYY___\\\WWWTTT```mmmrrrrrrsss}}}~~~uuurrrvvvvvvjjjjjjeeecccZZZcccvvvvvvzzzcccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"ޫttޫ"ރ޻sngޫ"ރ޻sngޫ"ރ޻snzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;YƳ͹мҾӿ;cTκ"ȵñzj_YP;;++jj@@\@@@~""@@==%V%JZ]rTeYkP`excw"j~cv=pZ]o`sex.j|ew]p]p\ocwfzbv"fz"fz`s\o@rcvWi]rYk\n\o\oTeZm"ex]o\n"]ocwTfZn]p5n"btWiL\˶ʴ˶͹ϾλϿμͺ̸͹μμλͺͺgggtttfffYYY===dzNNNNNNNNNNNNNNNNNNTTTWWWPPPYYYYYY\\\YYYYYYYYYWWWPPPNNNRRR```mmmmmmjjjooosssrrrrrrkkkccciiieeebbbWWWNNNRRRjjjtttrrrzzz{{{cccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"޲ޫޫ޲"ރ޻sngޫ"ރ޻sngޫ"ރ޻snĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===ȵϻӾvT˸dz~ocWN55NDDNee..'ewZm"j~"g{btFUYj+ctUg\o2j|]o]p_r'ev8n8n'i|.cuTf]p]p`t]r_s'fxP`cvfz_r5m~]r`u]rewbubu]p'fw\n+k~"cvbu_r`t`tcvfzϾ˵ʴ˶͹ͺλͺͺͺ͹̸̷̸͸μ͹͹ýgggsssfffYYY===dzNNNNNNNNNNNNNNNNNNRRRNNNPPPYYYWWWTTTYYYRRRUUUPPPNNNNNNNNNRRR```gggiiibbbgggpppkkkbbbbbb\\\___WWWNNNNNNNNNYYYfffkkknnnssscccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ."""".ރ޻sngޫ"ރ޻sngޫ"ރ޻snŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBY+ɶѼvcκɵðpeVN;;ۆbbBDFo.mUgex_rcv`sWi`t\o`t`s`tWj5m]p\obu5o.i{\o'i|_s_s_s_s.m_rRc.m\oP}"btex_s]p_s'g{_sTeP`L{\n5n"cvYkZn\o"ew˶˴˶͸͸͸͹͹νϾͺ͸̸˶˶̷̸͹ͻϾϾüiiitttzzzfffYYY===dzNNNNNNNNNNNNNNNNNNNNNFLNJLLWWWNNNTTTRRRNNNNNNNNNNNNNNNNNNNNNRRR______Y]_YZ\fffbbbbbb\\\WWWPPPNNNNNNNNNNNNNNN\\\fffccc`efcccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ލނނނނނނލ޻sngޫ"ރ޻sngޫ"ރ޻snŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREWǴм8vv;ϻʶŲmbSO4rrJJgDFHUXWjFUfzex`u"ew]r`sZm]r`uHx.i|YjYkcuYkcw2k}Wi`t@s]r]p\n5o+i|Zm_sYk]p_p\o_rWjZn"`s"j~]p\n\oRcUg'm"ex`t`tUg̸͹νͻͺ͹ͺͺͺ͹͸͹ͺ͹͸̷˶˶͹ͺνϿͺμŢjjjuuutttfffYYY===dzNNNNNNNNNNNNNNNNNNFLNTc=JHJJNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPUWTe@JRTT___\\\WWWPPPNNNNNNNNNNNNNNNNNNNNNYYYW\]Tecccsn޻ނ"ޫgsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻sngޫ"ރ޻snŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITκӿϻ˷Ų}bYbFD=g{\nL\Yk"]n5ncv`s_r]p]p+fw;pBv\o]pbtP`@s]p_scw2k}\oZnYk+k'fx]p\o\o\n'i|'g{`t\oUgUgfz`s\oexPb+cubt\o]o2oϿϿμͻͺ͹̸͸͹λͺ͹̸˶˶ͺνϾϾ͹˶̷̸ͺwtojjjwwwpppfffYYY===dzNNNNNNNNNNNNNNNFLNTc]rWi=HFHJNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFLNTc]rWi=JJLLTTTPPPNNNNNNNNNNNNNNNNNNNNNNNNHNPTc]rcccsn޻ނ"ޫgsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻sngޫ"ރ޻snð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_HHHZZZZɶѽҾκʶıtJF5333==JJR@;#$#2m~`tYj]r`sbu2j|_r"cvRc'fz]pTe`u\n\n2n'cu`t]p_s_s_r"ew]pWi+fwDv`t"`sUgRb_s.j}`tbu`tUf_sJzYjYk]pHwYkcwRc2nͻͺ͹͸͸͹νͻ͸̷˶ϾξϾνͺ̸˶˶ξccckkkvvvpppfffYYY===dzNNNNNNNNNNNNFLNTc]r`t`sWi=HFHJNNNNNNNNNNNNNNNNNNNNNNNNFLNTc]r`t`sWi=HFHJNNNNNNNNNNNNNNNNNNNNNNNNFLNTc]r`tcccsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻snɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[P"u:III___mmmrrrF˷ѽӾм͹ȴ¯ib8UUULLL777???si+aWYPeZuisskkv5(cv'k~"cuUf+i{]r`s_r'j}@sWibufzU_rYk]pZn]p+i{\o_pRc2m~fz]p]pZmTe`u+kZm@sbu_s2m~"fzew\o]p@sbu_s"cu\n'j}JY]pμλͺ͹͹ͺͻμͺ͹͹ξνϾνͻͺ̷˶gggnnnssspppfffYYY===dzNNNNNNNNNFLNTc]r`t`t`t`sWi=HFHJNNNNNNNNNNNNNNNNNNFLNTc]r`t`t`t`sWi=HFHJNNNNNNNNNNNNNNNNNNFLNTc]r`t`tcccsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻snĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTV"we_=cccnnnsssrrrkkk5ɶκмѼϻ͹ɶıwnRTUOOOEEE~~~Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===λͺ͸͸ͺϾ͹˵˴˵̸͸Ͽλμ͸ʴʴ˴˵˶͸ͺͺͺͺμdzcc}oz~zsme]YYYY..ULLNNNNNNNNNNNNNNNNNNNNNNNNNZZZi{}m}sY``ޘFŻޫgޘFFޘgޫŻFޘgTosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YPCW000cfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ottlh>fe=2F5F5H8J5H2F2D,?+;#0!LLLYYYNNN&&&KKKZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===Ͽμμμλͺ͹̸˴ʴ˴˶̷ͺμϿμͺͺϿμ͹˶ʳʳ˴˶͹λνͺͺͺͺdzLL~xne\YYY""WLLNNNNNNNNNNNNNNNNNNNNNNTTTevxsxsZ`bޘFŻޫgޘFŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻFޘgޫŻFޘs^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000H'Ӿ˸|wejjjbbbRRR777............85.WNYP\Rsgznκҽȵ"LLvr@Z\@2D.B.@+='8.@.B,>7AJFJP Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===͸ͺμμμλͺνϾϿͺ̷˵˵˵˶̷͹ͺͺλμͺͺ͹͸̸̸˶ʴʲʳ˴͸ͺͺ͹͸dzNN}si_YYY""WLLNNNNNNNNNNNNNNNNNNNWWWcmnswsZbbޘFŻޫgޘFŻ޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲ŻFޘgޫŻFޘzc`eijkkkjigfcb]|ZuUkNw`FkU=_P;YP;YP;YPCW.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWPŴNм"~κ"Ǵ"'v+b\+282+;.@.B.B5H2D->(7'Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===͹ͺϾμͻͺͺͺͺͺ͸͹̸˶̷̸͸ͺͺͺͺλλͻͺ̸˶˶˶˵ʳʴ˵͹ͺͺ͸̸dzoo~vm`YYY..UNNNNNNNNNNNNNNNNNNUUUbmnnvrY`bޘFŻޫgޘFŻޫtggggggggggggggggtޫŻFޘgޫŻFޘvcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;YkkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... Ǵӿ52ѽ̸dzı{r'fc8jg@2D.@+;".Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===ͺϿλͺ͹̸͸ͺ͹ͺͺ͹ͺͺͺͺͺͻμϾͺ͹͸͹̸˵˴˵͹Ͼλ͹͹dztcYYYDDPNNNNNNNNNNNNNNNZZZbnojsrZbbޘFŻޫgޘFŻޫggޫŻFޘgޫŻFޘgkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=Yjjjiiiib8t}~ztujg]\TYPYPLF...)))ƴ"κҾԿҾм̸Ǵðκ͸ȵ¯ʷ¯\U%#Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===ͺν͸̸̸͹ͺͺλλνμͻͺλμνμϾμ̸˶˵͹ͺͺdzBB}iZYWNNNNNNNNNNNNNNN___itumwoY`bޘFŻޫgޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޡgޫŻFޘgޫŻFޘmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIWwn<~urfbWYPYPNGTTTNǴȵȴŲIJκҾҾѽ˸ðɶti0+Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===Ͼμ͸̸͹ͺμͺμμͺͺλϾμͺ̸˶͹ͻμdzogkZYBBRNNNNNNNNNNNNbbbp|}tzrZbcޘFŻޫgޘFŻޫgޘUFFFFFFFFFFUޘgޫŻFޘgޫŻFޘnrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777zwkcZYPYP=6;¯˸Ҿ'L̸¯k`Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===Ͼͺ͸͸ͺμμμͻͺλλ͹̸͹ϾϿȬdzffn`\Yb5N+Y++UNNNNNNNNNPPPgggr}~|u\ceޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDO|wkbWYP3?>>≯{tȵZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===͹͸ͺνμͻͺͺμνλ͹͸ͺͺλƬdz..r\=+"{`jNPgNNNNNNWWWnnnu|]efޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWSzrf\TYPA;BEB.@.B/@$]]]xxxмY@¯WNZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===μ͹͹ͻλͺ͹ͺμμμλμͺͺͺͺ͹ͺͺμϿȬdz"s}R+`P`UFPNNNNNNbbbrrrz_fgޘFŻޫgޘFŻޫgޘFŻŻŻŻFޘgޫŻFޘgޫŻFޘz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBY¯ıŲŲðug]YPQI'5BB2F2F->YYYYYYZZZڂƲwZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===μͺͺλϿλ͹ͺͻλμμμλͻλμμμͺ͹͹͹λʬdz2]L.st~DLxNNNUUUjjjxxx~_ggޘFŻޫgޘFŻޫgޘFŻ޲ޫޫ޲ŻFޘgޫŻFޘgޫŻFޘx|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777ıȴʶ˷ʶɵdzñ~uj\TWNIJ͹ȴ52F2F5FFLRNNN³Tκȵ{o71Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===Ͽͺͺ͹ͺͺͺͺμμμλͺͺͺλ͹ͺʬdz`'8@8.i.~=fPPPeeessu{{{`giޘFŻޫgޘFŻޫgޘFŻޫttޫŻFޘgޫŻFޘgޫŻFޘw~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777¯ɶ͹κϻϻκ˸ȵIJtcYYPƳӿfοUig=2D2D-@(ȴҾ@mɶrfZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===μλͺͺϾλ͹͹ϾϾλͺͺͺͺͻν¬dz""..nn]WF8LUp'no=T]fptx|`giޘFŻޫgޘFŻޫgޘFŻޫttޫŻFޘgޫŻFޘgޫŻFޘzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;YƳ͹мҾӿ;cTκ"ȵñzj_YPŴ5Ҿmj"JN@.B.@(9aaa¯κҾ;ȴg]Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===ϾλϿμͺ̸͹μμλͺͺν͹ͺλdz@@HH..nn8.~w+m_RRn|uxŜǜ`iiޘFŻޫgޘFŻޫgޘFŻ޲ޫޫ޲ŻFޘgޫŻFޘgޫŻFޘĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===ȵϻӾvT˸dz~ocWNʶ=Pмȴ+2==+=2D {{{:::Ǵ"ϻ5Fɶ^VZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttgggZZZ@@@ŷͺͺͺ͹̸̷̸͸μ͹͹ξ̸̸dzWW㞞==...."t'''Pm@wUc|u{̝͢bjjޘFŻޫgޘFŻޫgޘFŻŻŻŻFޘgޫŻFޘgޫŻFޘŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBY.ɶѼvcκɵðpeSK˷ӿҾ͹Ų{s+.B2D1C#2NNNYYY]]]uuuų5&hb5Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttjjj\\\DDD͹νϾͺ͸̸˶˶̷̸͹ͻϾϾͺ͸dz..PP⧧=="LtFR`5F=sF]J+w냕ȌšϦϡcjkޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREWǴм8vv;ϻʶŲmbIC!Ǵ"κѼм͹Yλ._]52D2D';HNRU'''@@@vvvZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttmmm___JJJͺͺͺ͹͸͹ͺ͹͸̷˶˶͹ͺνϿͺμϿdzff22rrHH;c2W`;BpD+mm\HLF򌘹ԫԧckkޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITñκӿϻ˷Ų}e[IJȴϼ;ʶ";FB2D2F.?Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttooobbbPPP_YTͻͺ͹̸͸͹λͺ͹̸˶˶ͺνϾϾ͹˶̷̸ͺƬdz22PPWW@H""r2@e;z"ZJ;]pڲ٩ckkޘFŻޫgޘFŻޫgޘUFFFFFFFFFFUޘgޫŻFޘgޫŻFޘð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_ǸcɶѽҾκʶıtѽT]ı28DD2D.B%4Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppfffWWW;;;̼ͺ͹͸͸͹νͻ͸̷˶ϾξϾνͺ̸˶˶͹μνλdzBBn5bLPPku2oLDfե׭ܳ٩ckkޘFŻޫgޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޠgޫŻFޘgޫŻFޘɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[5˷ѽӾм͹ȴ¯bZ!Ӿɶʶzt8.B+=%3#Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppkkk]]]HHHzλͺ͹͹ͺͻμͺ͹͹ξνϾνͻͺ̷˶͸λϾͻμͻλμdz"kUk`runBðܳ٩ckkޘFŻޫgޘFŻޫggޫŻFޘgޫŻFޘĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTVXXXkkkFɶκмѼϻ͹ɶısj8DDDʶ.ϼ+¯ɶdzUT2".-./Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppooocccTTT888ȼλͺͺͺνͻ͹͹μμϾν̷̸͸͹̸͸ͺɬdzoo"+==;5iHc߳۳ةcjkޘFŻޫgޘFŻޫtggggggggggggggggtޫŻFޘgޫŻFޘȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]UaXXXgggrrrrrrZǴɶȵƳ¯'ws]gggZZZ@@@>>>ñ5мZҿ8ðƳȴðOI"Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttppppppjjj\\\FFFxtoͺ͸͸͹ͺλλϾλν̸̷̷̷̸λͬdzPP"5P;F"ҳͳݳڳשcjkޘFŻޫgޘFŻ޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲ŻFޘgޫŻFޘ·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gToP~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZ˷Ҿ5Ѿ2ŲɶŲsZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttppppppooocccUUU;;;ͺ̷̷̷̸ͺνϾνϾμμμμͺξϿ͹͹͸͹ϿάdzPP.=8c55U߳۳ٳ֩cjkޘFŻޫgޘFŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻFޘgޫŻFޘ·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`s^|"geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWujuHƳϻѾλ"ǴǴ¯Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppppppppkkk___NNNLJF̸̸̼˷˶̷ͺϾμͻͺͺͺλͻ͹ͺѬdzoo'.eRoܳڳ׳ԩcjkޘFŻޫgޘFFޘgޫŻFޘµȹͻϼмѼлϺθ̶ʴǰí~{vrkczcIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znð͸ϻ̸ȴŲZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppppppppoooiii\\\JJJLHD̸̷̼˷̸ͺμϿλͺͺͻμ֬dzBB.tBFB³ݳܳ׳ճөcjkޘFŻޫgޘFFޘgޫŻFޘĵɷ˸̸̸˶ʵȲƯí~{vrmgvμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_z¯ʷ͹ʶǴ¯MH+Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttppppppppppppooofffZZZHHHLHD̸̷̸̼ͺϾͺͺͺμլdzff...Ffgϳﳿ糸ȳ볳߳ݳڳسֳԳѩcjkޘFŻޫgޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘgޫŻFޘ²ŲŲŲį­~|zupn˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|Ǵɶ˷ȵımcZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppppppppppppppoooeeeZZZJJJLJF͹͸λ͸̸͹ͺͺͻμӬdzdzݳݳܳڳسֳԳҳЩcjkޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠgޫŻFޘzwxϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_8ѾLƳwZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttppppppppppppppppppooofff\\\NNN;;;xpg°λμ̸̷̸͹ϾͺμϬdz۳ܳڳٳ׳ճԳҳгΩcjkޘFŻޫggޫŻFޘҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zY̸Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppppppppppppppppppppoooiii___UUUFFF888x̼μͺ̸͸̷̸ϾϾάdzسڳٳ׳ֳճӳѳгγͩcjjޘFŻޫtggggggggggggggggggggggggggggggggtޫŻFޘ.'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"~rZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttppppppppppppppppppppppppoookkkccc\\\TTTHHH;;;_YTͻλͺ̷̷ξάdz׳׳ֳճճԳҳѳϳγͳ˩cjjޘFŻ޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲ŻFޘHZe`trgmj`BPHZe`trgmj`BPvZm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5gggtttppppppppppppppppppppppppppppppooojjjccc]]]WWWPPPJJJDDD@@@===================================================NLHλλλͺ̬dzɳԳԳԳԳӳҳѳгϳγͳ˳ʩcjjޘFŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻFޘcfZ8Կκɶı"cfZ8Կκɶı"Zm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5gggtttppppppppppppppppppppppppppppppppppppoookkkfffbbb___\\\ZZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@ͺμμƬdzγѳѳѳѳѳгϳϳγͳ̳˳ʳɩcjjޘFFޘH'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"Zm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5gggtttpppppppppppppppppppppppppppppppppppppppppppppooommmjjjgggfffffffffffffffffffffffffffffffffffffffffffffffffffbbbTTTNJHμμμϿμdzƳγϳϳϳϳϳγγγͳ̳˳˳ʳɳȩcijޘFFޘ.Ҿϼͺ"μP.Ҿϼͺ"μPZm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5uspԋmmm\\\UTRʬյœcijޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘZm`t`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`uJZ+5sssttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttkkk\\\ϾλάźźźźźźźźźźźźźźźźźźźĺğcijޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠWjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=JŦutsggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggonmϿμͺͺνΧ||||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccY8YYYLLH8HYYYNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNN|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY˹ƵŴŴ˹ͺ̺°_~~ssYYH8HNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNcccޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘݘѐsrw{ʋ…zrpsrtsrssspopopsu{+"ssLLNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNcccޘUFFFFFFFFFFFFFFFD=2++.5;;;~~.++.2222222225255@rdz']zzTTPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBdzcccޘF޻޻޻޻޻޻޻޻޻޻޻޻޻׶ijHD]=T2=8mr~BLH8N2DFF.os{5sdz']zzTTYYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555dzcccޘF޻ލރރރރރރރރރރރރjNUuUvPnBZF85NPLHND_@W8N2DZ@+NRYZYUUW]_``g5udz']zzTT```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...dzcccޘF޻ނ.""""""""""'Uv]\WwJf5Hwx""F`B\@W;P5H+;|]5sdz']zzTTccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz¸cccޘF޻ނ"+=_b`Z|Nk;R\\".D]@W;P5H.B+;Ugggjpsuwx}_5wP"u1}GLQdz']zzTTccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzϸcccޘF޻ނ"tggggggggL;PcHxbZ|Nm=T85".=U=P5F+;+;+;.'==@DFHHJRx_5t"|xtv|}wsuy;@D.B2F2D$1dz']zzTTccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz׶cccޘF޻ނ"gʶepY{Lj;P|}r|~u5H+;+;+;+;+;opg{}J}_5u===777IJ"zj_cYi_znuzntutsgf\bYi_znz5s2F2F5H8J5H2F2D,?*9#0dz']zzTTccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...dz}Wkްޒk]ІʾųcccޘF޻ނ"gޠޘޘޘޘޘޘӑbi;nRpBZ2BD\]2@=+;+;+;+;+;W\_cgnpzJ}b5zQITREWRBYP=YP;YP;YP=YRBYPEW777μPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_z!EFHF2R;R@5b2D.B.@+='8+=.A,>):*dz']zzTTccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...dzگޖr8fޱޑf8pŖޭےɐԳcccޘF޻ނ"gޘUFFFFFFev`Y{Jf8L"5;++"5;+;+;+;+;=F5+++.22@vNc5xVTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=ͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{FJLz.TF@;5~.k'D+;.@.B.B5H2F-@(9*dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...dzBU޻ޠ}D_޲ސ_B}޿ޤނUHٳcccޘF޻ނ"gޘF޻޻޻޻޻szmWsJDD.@+25rr28@+B"@'.5FD2rt}8{Ri5x]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=Yϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_Z]_+;#5DHJL8ZB`NFDBBDB=5.|2m;x2D.B+;"2dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzÔޅ_8oެމRU޴ޏWR҉޷ޗo8_޺ϪԳcccޘF޻ނ"gޘF޻ލރރރރgU'Z2"L"FFFtNtN"R""T"HFD"T=+NT]co8|Uj5xgTosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YPCW000ҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;s%;z.@2D1C)9FHJHHFFDFFFD@;8HD=5'f2dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dztޱޚ|JT޸ޖcL޵ތLb̖ޭވTJ|ީޑΌųcccޘF޻ނ"gޘF޻ނ."""]n.'Y'"L"FFF8B8D'W'"T""L"FF8B'n;Yo8}s^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y.@B8~2F2F0D!/BDFFDDFHHJHD@;DD@8+dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzRPvÔޯޕo;rޤsDܷފFsŤޠr;oޮޔvPuκcccޘF޻ނ"gޘF޻ނ"@2r2'Z'"R"JFFFF'Y''Z'"T"JFFo"tŧ=Yo;zc`eijkkkjigfcb]|ZuUkNw`FkU=_P;YP;YP;YPCWHZe`trgkkknnnjjj```RRR:::>>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5ADHHD5b2F2D/@!CDFHJNHe'ND@BB@8+z7dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@'gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzre@Jv×ެލ\R޲ބDڹކDڄ޺ޏR\޴ޗvL=c޴׳cccޘF޻ނ"gޘF޻ނ"t]8'Z'"P"HFFFF"P"']''Z'"T"JFFL"fwȨ=ÆYo;vcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;YfZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{HHL|뉗"F2T2D.B FZJJ_u慕JB@B=5'odz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz|{ԉpJFvÛީރFuޖNռނL֖ޭuF޻ޛvFHo޷ީ۴cccޘF޻ނ"gޘF޻ނ"g"R""L"HFFFF"T"'Y''W'"R""L"FF~`xɩ=ÆYp¤=gkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=YcH'Ӿϻ˷RnnnmmmfffZZZDDDbZ!t}~ztujg]\TYPYPNG...............D@'YPuju}HJFe߽~H;.B.@*<%3HJ2Yf{D@B=5!fdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;+UU............555;;;=__gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzkަޔ}WBvàޤsRު_|}_ΪޚRsޠvDW޿|ޯޞގޗɺϳcccޘF޻ނ"gޘF޻ނ"g'+e+']'"P"JFFFuRuR"T""R""P""N"HFF`xͭ@ƇYsĥ=Ćųmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIW.ҾϼμPnnnnnngggsj8~urfbWYPYPLF......... UMwkv}~2HJN2YJFB2m.@2D0B'JHLتFBB;2 \dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;'............555@@@5gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzuuuJg|޲ޡދgBvçޜZ|xttx|ZާvBg޶ޣސ|gW۴糳cccޘF޻ނ"gޘF޻ނ"W]'.o.+f+"U""L"FFFu+u+HJ"N""N"JFFN8zϯBώɶ\uȨ@ȉȶnrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777mmmws]zwkcZYPYP=;'---"JHJJHFD+P=.Z2D2D.?FJ]t㰼"LB@;.Qdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;............888==='gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz\{D8D_zޱޛzJvñޑWޖmmݖޭWޱvJxީޑz`D8F֛游cccޘF޻ނ"gޘF޻ނ"5z52s2+f+"R"FFFFW`W`FFFJFFFF"{ѰBѐϼ_vɪ@ȉȶpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDO'|wkbWYPUL FHHF]sNgD52P2D2D+;BH'Rx"LB@8+Adz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzf{o_H@TvޮޏZw¿}޸jjٷމݿ}wZܳޕvU@H]n{ʳ³cccޘF޻ނ"gޘF޻ނ"@5|52s2.o.'_'JFHHFFFFFHJFFF""~ԳBҐѾ_x̬@ȉɷu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWSzrf\TYPA;5RDHPڭ+PB=5u2D2F1E#0@FH=\HB=8'vdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;+UU.........5558\\gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzvvvޞޘސކxfNNoީt|oxxo|tݛpNNex†޹޲ޫަҡȳcccޘF޻ނ"gޘF޻ނ"B5|58~82v2+`+"T""J'=88;"8@"5@5;;2D"FFFFF""~ִD֒bz̬@ʋμz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBY¯ıŲŲðug]YPQIr~JJ2YwD@=B8v2D.B#25K@FHJFB=5"mdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;'.........222+gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzkkkm޺޸޴ޯުޢޘފt]mۜ݌ټգխٌn]sĉ޶ޫޢޚޓގވރʳcccޘF޻ނ"gޘF޻ނ"T";;;;5x5+e+"L."'JHFFHFF"DB'FFFF."~ִDՒѾb"{ͭ@ЏѾx|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777ıȴʶ˷ʶɵdzñ~uj\TWNZkHJcz在JBBFF=2Z+='5"'BFHHDB=2!bdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzeeeúDPRUY]bgow޺ޯݚ̖ùÚݪޓރxoib]YURPLȳcccޘF޻ނ"gޘF޻ނ"\';;882r2"L2"F""LHFFHHFF"D=.FFF2"ـٷDהc"}ЯBѐѾw~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777¯ɶ͹κϻϻκ˸ȵIJtcYYP"JHN|5WDDFDB=2z!76LDFHHD@;2Ydz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzbbb@NRUY]bgowރޓݪõ̖ݛޯ޻wogb]YURNLijcccޘF޻ނ"gޘF޻ނ"`+88H'.@FJJJHF""N""LHFFF';2@2"ڀڸDהc"~ѰBѐѾzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;YƳ͹мҾӿ;cTκ"ȵñzj_YPHJLg;ZDDDD@;2!+Z*HDFHHD@;.Mdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccf݃ވގޓޚޢޫ޶s]nٌۨխդټm]tފޘޢުޯ޴޸޺޾cccޘF޻ނ"gޘF޻ނ".FFFFFFHHFFFF+"ڀڸDהc"~ұBѐѾĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===ȵϻӾvT˸dz~ocWNH[FH+R.TDFDB=8*x"FDFHFD@8+}dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;.DD...................DDgggtttppppppppppppppppppjjjccc]]]TTTDDD...dzjjjvuۤޫ޲޹xeNNpޛt|oxxo|tݩoNNfxކސޘޞϠcccޘF޻ނ"gޘF޻ނ"=HFFFFFJHFFFF;"ڀڸDؔc"~ճBѐѾŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBY+ɶѼvcκɵðpeVNDFJLDDB@;2(.Q@FFHFB=5's 0dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzsssWruոn]H@Uvޕ޳Zwݿ}މkj޸}wZ܏ޮuT@H_o{ōcccޘF޻ނ"gޘF޻ނ"F""L""T""PJFF""L""L""LJFFF"܁۸Dڕc"~ִBӐҿŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREWǴм8vv;ϻʶŲmbSO4"ADFHHDDB=5)pBFHJFB=5"jdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;"........................"gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzJge=ž8D`zޑީxJvޱWޭmkޖWޑuJzޛޱz_D8FֲcccޘF޻ނ"gޘF޻ނ"""@""L'']++`''Z""PH""R""T""NJHF@"ރ޻Fݗe"~ִD֒Ÿ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITκӿϻ˷Ų}bY=BFFFDB@;.BFHHDB;2 ^dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzYYY=f|ސޣ޶gBvާZ|xtsx|ZޜvBgދޡ޲|gTڠcccޘF޻ނ"gޘF޻ނ"+".@J''_++c++c''Z""N""U""R""LHFF@"ރ޻Fޘg"܂۹Dږð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_HHHZZZZɶѽҾκʶıtJF5333@DFFFD@=5'N@]RjF@;.#.[dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;.DD...................DDgggtttppppppppppppppppppjjjccc]]]TTTDDD...dznnnPkzɞޯ޿|WDvޠsRޚ_}|_ުRsޤvBW}ޕަ޴ުcccޘF޻ނ"gޘF޻ނ"`8"."2=H+"P.'P..UF@W..D2.B"='=.+B"=F;`2"ރ޻Fޘg"ރ޻FݘɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[P"u:III___mmmrrrF˷ѽӾм͹ȴ¯ib8UUULLL777???si+aWYPeZui=BDFFDB@8*;W&H5dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzUWY}soHFvޛ޻FvޭLւ޼NޖuFރީvFJpމޚښcccޘF޻ނ"gޘF'W=BF"J"2'5"8FP.DZB\H+L@2H8;F58DNBNH.@;5P;FF.DFW=B'Fޘg"ރ޻FޘĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTV"we_=cccnnnsssrrrkkk5ɶκмѼϻ͹ɶıwn:*dzcccccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccVTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=.'8`rrrtttggg\\\FFF=8+bYaYUMYP@=.;;;;;;===JJJHHHYR+t|zz..~kD;@BBHF@9*dzcccccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccc]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=YHZe`trgkkkfffYYYBBB]U"si+D@'888;;;;;;888==8ZU2tuvu1_ZZ;D##88BB|mxDB;2dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccgTosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YPCW000cfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ottz%%@DC9f2dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccs^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000H'Ӿ˸|wejjjbbbRRR777............85.WNYP\Rsgzn~FFD/dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccczc`eijkkkjigfcb]|ZuUkNw`FkU=_P;YP;YP;YPCW.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWPbFD@!!HH''z7dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzzzzeeeZZZWWW\\\eeevvvcccdzcccvcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;YkkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... ||牉""TDBFF__odzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz||gBBgicZU..PFFNNN```~~~cccdzcccgkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=Yjjjiiiib8t}~ztujg]\TYPYPLF...)))FF~~B@<322fffdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;+U+............555;;;=_=gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz__u_T22NLLYYY~~~cccdzcccmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIWwn<~urfbWYPYPNG22m@DB''\dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzJJiW""NLL```cccdzcccnrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777zwkcZYPYP=6""++ZDD?]]""Qdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzuuiT22NNNvvvcccdzcccpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDO|wkbWYP]]NNPDD;''xx""Adzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz_PFFeeecccdzcccu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWSzrf\TYPA;55++uDFE0==vdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;+U+.........5558\8gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzoouU..\\\cccdzcccz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBY¯ıŲŲðug]YPQIrr22wwvDB#K22mdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzBBZWWWcccdzcccx|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777ıȴʶ˷ʶɵdzñ~uj\TWNZZccZ=5'bdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzc\\\cccdzcccw~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777¯ɶ͹κϻϻκ˸ȵIJtcYYP""||55z766Ydzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz''..ieeecccdzccczµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;YƳ͹мҾӿ;cTκ"ȵñzj_YPLL;;Z!!**Mdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzBB==eegzzzcccdzcccĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===ȵϻӾvT˸dz~ocWNHH++..x""}dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;.D....................D.gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzoo..DDgBBcccdzcccŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBY.ɶѼvcκɵðpeSKQ((s0dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzDD||cccdzcccŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREWǴм8vv;ϻʶŲmbIC!""pjdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzwwee..__cccdzcccŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITñκӿϻ˷Ų}e[^dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzPP..==''JJcccdzcccð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_ǸcɶѽҾκʶıt''@@RR[##dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;.D....................D.gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzwwuucccdzcccɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[5˷ѽӾм͹ȴ¯bZ!;;&&dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzooBBBBoocccdzcccĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTVXXXkkkFɶκмѼϻ͹ɶısj8DDDZ$$dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;'w'......'w'gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]UaXXXgggrrrrrrZǴɶȵƳ¯'ws]gggZZZ@@@>>><<vdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccc·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gToP~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccc·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`s^|"geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWuju&&mdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccµȹͻϼмѼлϺθ̶ʴǰí~{vrkczcIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znB22dzcccccckkknnn{{{ppppppppppppppppppfffYYY@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ZZZtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccĵɷ˸̸̸˶ʵȲƯí~{vrmgvμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_zbdzcccccckkknnn{{{ppppppppppppppppppfff\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYnnnppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccc²ŲŲŲį­~|zupn˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|DD``}dzcccccckkknnn{{{ppppppppppppppppppiiiffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff~~~ppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccczwxϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_''c;;dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=z%%dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccc.'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccHZe`trgmj`BPHZe`trgmj`BPdzccceeemmmpppΨoooeee___UUUHHH222dzcccdzccccfZ8Կκɶı"cfZ8Կκɶı"dzcccbbbnnnrrrΔwwwggg```YYYJJJ888dzcccdzcccH'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"dzcccYYYnnnrrrzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pppiiibbbYYYHHHDDDdzcccdzccc.Ҿϼͺ"μP.Ҿϼͺ"μPǵcccNNNfffppprrrrrrpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmggg```UUUDDDNNNǵcccǵccccccNNNPPPfffnnnnnnmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjeee\\\NNNLLLNNNcccccc|||NNNNNNNNNYYYbbbeeecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc```YYYPPPNNNNNNNNN|||||||||Y8YYYLLH8HccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYYNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNN|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY|||cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc5ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYYn~~ssYYj_jcccNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNcccfkccc+"ssT+TcccNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNccc+vª񹹹ccc']zzTTcccPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBdzcccdz.֐\Ͳwʒf³γccc']zzTTcccYYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555dzcccdz\m\ҲBJഴwoccc']zzTTccc```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...dzcccdz㶆fw̳njſ㽽޸Poccc,,}%%f Z YVTTTE']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzf㸤f\fmĔȽȳccc..sZ;;YBBYBBY22Y@@Y@@Y""YYYU'']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzݼo粩f.BLccccLLYYYYYYYYYYYYYRRYYYYRRYFFY''YYT']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdz}w.ȶdzfnζkccc''iHHYYYYYYYYYYTTYFFYRRYYYYLLYTTY;;YYW7']zzTTcccccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...dzccc@Ϝf²绻ʳo襜ʙcccgiifeefrgRRYYYYYYYYYYNNYYY22YTTYYYYWWY22YYQ']zzTTcccccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...dzccc貲ŸԞȒw]ŧzw۳|\ͳcccR]eikkjigffintx{v''""_WWYYYYYYYYYYLLYYYY22YHHYYYYRRY''YX']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccǵB@…Œdz28ֱ㵯cccnb{i}stxbLL`{ztpnkms{voZ;;YYYYZZZ______..ZYYYY@@YYYYZZZ..ZY']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzjԯs̸jܹǶ޶cccjZ}Wvc\PJHJYzsccinspeTJNU''mTTYYYY\\\]]]YY\YYYYY''YLLYeeiUUcY']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccǺwƙfس˜fLJꓰˠ٭ϲů{꺺ccceR~YzzYTRLHFJjckw|}zt`HHU88ZYYY]]]``````@@ZYYYYYYnnszzzWWeY']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzccco貤nBǿ䬍\椸ҞFe蕸mȼn굵cccWTRWPLTUNLLLHFRtxfxz]FFHJU''mWWY___iiimmmUUcYYYYYYZxx~jjo55\X']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzzzzeeeZZZWWW\\\eeevvvcccǺ³цzZ䴩Bn]R\žԇԺnϴccctNLNPY\NLT]]PHHFFLiRRfwzkRHFHN{HHY```kkksssttt55ZYYYYYYf}}..\T']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz|}~BJP5@2;.828.;=FHJNNN```~~~cccdzǹ@ܺgBBخU.ؼeڜ϶Ԓ̤Bº¯mccc\PLJJJJJLPU\bffbWJFFHWw]Roi\PZ}''88____nnnvvvzzzWWeYYYYYZjRR{{YA"AZZqqppZZ']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;++U............555;;;==_gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz_gkBPHWJYJYFUBP8D+52;@LLLYYY~~~cccr2˲.5ضfƒڦՍij\LײkиmfwcccfRHHNZfpxvfZLFHTctp]]]mmmwww{{{bbnYYYYYYm}wwss{55`W,(//']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzJ]fN]RcUfUgUgTfRbL\BP2;"28LLL```cccٜײBó\]]w;֢Ǻ5۹ܷсқ؏ėܠ\lj\ҳcccZZRLHFPgutcWUZbimmgZNTfrY''YY]vvv""YYYYY]r@@Y=.J2``(//']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzuRcYjZn\o]p]p\oZmWiP`DR2;2;@NNNvvvcccݳԴw߬Pe.ඍ˧NԢ˛e.¡ɕϖD\ѳ\³cccYT|JHHUnznfegiif`YYnwbNNN\wwwBBbYYYYiu""\O!{']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzTeZn]p_r_s`t`t`t_s]pYjP`BN+5FHJeeecccdzȏvݧĵ˻cYju٤t~ղ־İԥtոwóRRTU|PLHFHRi}ui_]_cgjjjirjN''DD]sss==cYYY_m{mmHHeXii"v']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;++U.........55588\gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzo~Zn_s`t`t`t`t`t`t`t`t]pWiL\8D.;=\\\cccŅ2fZ׶f˼sȜͻU|ἂB˹B|˨ϑ8fޢ\㩵ϺRZULHFFHLRRPPU\]\YZcko~xo@@biiwYYYezRR~~Y))"{2ZZ']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzBgt_sbvbu`t`t`t`t`t`t`t_sZmRbBP28WWWcccDȐ.B.ff}|p蟰Ř=FҜ՛zƐžwנpfʢߊȝfԓzzzNNTWWRJFLZo}xibbec\RNfx''22iuu~ZZ\kw88Y9NNJpp']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzZmbvexew`t`t`t`t`t`t`t`t\oTfFU.8\\\cccdžՆmƺƳŘʳѐZ͌ޱ봴ݼNwͳB͞׳oڲcccTZTLLgz`ZTLLg..mnn}ZZbwY.']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz\ocx'k~.k~`t`t`t`t`t`t`t`t]pUgJY2;eeecccLBճw.ϳɳoǼoPٰ.ف~ikžտ2̏ᶄ겤˝¼ƞ.wcccWZ\WLTuweRLe''++..pmm{\bm}Y;w'']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzBk{ez=te`t`t`t`t`t`t`t`t]pUgJY5@zzzcccϒfڦڰώߎ{՘ϭ=.Nֹ@sw.ڀPoگųB.ةcccc_NHH_z|s_Ug~wvNN;;rZix88\F,']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..D....................Dgggtttppppppppppppppppppjjjccc]]]TTTDDD...dzoez.oDu`t`t`t`t`t`t_s\oUfHWBJPcccƳߵо~Ӹî֨Ξi.BnRZPócccmYLHFFHLTY_befff`Zgr''xxHHpww`t}ZZȒc5PFff))qq']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcwg}Du`t`t`t`t`t_rZnRcBP|}~cccdzᱭw촤ʱ.}ŌձѸ̯ځ_࣯ΡÛҳFbZPLHHHHHFFHLPU`onrϜPPn55`m|ffTTnfՙffNNB[[']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzwf{je.k~ewbu`t]pYjN]_imcccdz†fƸ_Bdz..w~\±޳owZ..ʹ\PmZZUTPNNNNNPNHFFFFHc|ncWvW''ҨkkwUU|x++obe/']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzPtf{g}.o=t'k~exbv_sZnRcJ]fcccdzf.ǘ|ƨ֏ͧѐcBo_ҌŊת˞ھBӧt\f\ճR\WTNNNHFFFFFY{_LՎ..tPPϤz,,TeF']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..D....................Dgggtttppppppppppppppppppjjjccc]]]TTTDDD...dzwcwezezcxbv_sZnTeucccdzΆ.βؽίfҎğ򾝭Ųvpѷ~¤ccc`ZURNNLLLJHFFFLYb{nf]TJNt''88YY{{TTx;PF+9']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzoBk{\oZmBgto~cccdz\ˌB峩fͳҳ.;זʸ\~͋~ccc\{PLJT\YLHJU`fjwxbWURLZ;;JJffȤ5']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''w......''wgggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzьﶤIJT辆ʃտ踟ޤecccZTNJHJUUJHPUZ]`erwfbnx\JJHHR''""vvZZ==']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzÒf\¾w˲oPֺwԁޒmЙDΡJ`soپccccTLLJHHFFHJNRU]fnu{t\Tu~xwgNFFFN""__\\s']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzw.w;.׳oǴPw˲՘կڤNvžNᗴ枺Pڴccct_TRPNNLJJJPY]_`bbb`]\YTJFHZvziWHFFJU''YYvv''ȅ']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzfũ.f˵m\\@BˌufwǕ{ݶccciZWWWZU\]TNLHFFFFFNfu{uj]PJHJ{''==шEE']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ZZZtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzoⱱcǫĩwdžɞڳŒ͆ɳ|׭t贴cccf]WWWZ`c]`\UTRPNLLLJJJ`sxtg]WUUe'']]FF}xss==KK']zzTTcccccckkknnn{{{ppppppppppppppppppfff\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYnnnppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzv{饺޲\ó̒޷Wǰͳcccf`\YZ_ge`]Z\ci`Rrxunc22igiTT|vvزLLcc']zzTTcccccckkknnn{{{ppppppppppppppppppiiiffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff~~~ppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzѲoڹֶѲȴȳcccnimjnun''''`ZiiȯUU..']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdz׳fȤڻj{wΨeгȒͳccc}}''']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzP.׆to.ffц˲ccc''++ѴǕBB''VV']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzw.ಮ\PٳźŲ~P䱨cccmm{{{{UU;;++PP']zzTTccceeemmmpppΨoooeee___UUUHHH222dzcccdz\̳ݪpo~\vBBccc''''&&&&&&&&&&&&&&'';;']zzTTcccbbbnnnrrrΔwwwggg```YYYJJJ888dzcccdz.ȴfkw˳fnոccc']zzTTcccYYYnnnrrrzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pppiiibbbYYYHHHDDDdzcccdz\ֳ.詳oޘccc+J"~~e8eǵcccNNNfffppprrrrrrpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmggg```UUUDDDNNNǵccc٭ؙŴŴŽǵcccnJ{cccNNNPPPfffnnnnnnmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjeee\\\NNNLLLNNNccc湹kتڄ꺤cccn++n|||NNNNNNNNNYYYbbbeeecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc```YYYPPPNNNNNNNNN|||.Ȭ||||||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYYNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNN\\\\\\\\\\\\\\\\\\\\\\\u||}ccccccccccccccccccccccf|cocscpciccjcccccccccccccccccccccm5bpcccccccccccccccccfcoc|c{cuctcocmcg{ccccccccccccccccccccccccccccccYYYecccNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNwwwwwwwwwwwwwwwwwwwwww\ʓ֓֓Гfkbͅғ㓰֓֓֓ՓǓʓcccNNxwrnZcccNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNwwwwwwwwwwwwwwwwwwwwww\õǩƩک+{vǩן]˚ȩک虽ݩȐ_唾ũũéΩթԩѩħcccrbjvLNZdzcccPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBkkkccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYYww\׳˳̳ͳγӳ.°ռ׳.ѩ璠f.ѳгϳϳ쩽Γccc]_JJ]dzcccYYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555cccww\ٳ̳ͳΤȳӳmt\oٳcwo׳ҳѳѳϳݳ擞cccUJN{TLHNUdzccc```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...cccww\ٳͳΤꆚ۳fwݳ.wPճԳҳҳѳ߳ⓞcccLHH}]RHFJWdzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccڳγΩfvfڮf\wֳճԳӳҳٳ奔ȓcccZNHFFZfUJFFJedzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccڳγϳѳҳߖo.f.iԳӳҳܳ߳ѩcccbHFHPnWJFFHu&&6;9dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc۳ϳѳҳճ.Bw.Bҳfn̲ܳӳҳѳϩ“cccvoT`]R\b\NHJUc,,Tbfc\YYYYXOdzcccccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccʺȥfӮҳҳDfPیfBworݳ򓢼cccvetzkixxgWPWcxx++oTTn~~HHe""\YWAdzcccccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccֳܺԳDծ\|2wTtow\ce|{pzzoi]]nmTTŽȾ55`YTdzcccccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccԺݮճӳճ۳Hom@uz׌f2|\fckjzs}wnzjguFF}==ϲffZZ8888RRmmss{{{..\Xdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ҺݳҳԳֳ׳\H;wنͤowcgtsn|fbwutxwEE__ȃPP@@ww55\Ydzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ҺޤwϮ׳سnTv}ۍ.w.ccjemiwxRRfxzxwKKff}RR}}jjoWWeYdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ٺo׳~Jvs8JmHYU@cccikckfR]w~usriccȢ{urmjexx~xxxUUcYdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ߩfzZBF+\ǴژІ䓡cccefnccxvf`_==Ѭ""wxki]YZYZmmsccg..ZXdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\߳ةw@\@].5'ifgDB˯mǓcccfpsuZNJR..LL''}wkb_YYYYYYYLLYZZZ''YQ""AZAqpZdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;U++............555;;;_==gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\mvLFܕD]o\kfwǓcccftfTHFJW==}xkb\YYYYYYYYY''YYYYRRYY7,,(/(dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccWL`\je@PR⪾N×H@\i\֩ǓcccizTwW\FFJUUss|sibZZYYYYYYYYYY@@YYYY22YW..JJ22`(/(dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccfP\JBfNi~PY]}R+\\שȓccfgjNnoctJFfVV''vvzwk`Z\ZZYYYYYYYYYYYHHYWWYY!!{{dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc"Wt~wٳשȐ;kZYrnTFL''}}TT|}..tUU|55`wwmm{nn}uu~iiw==cBBb""YYYYYYYY22YYYY;;YTi""vvdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;U++.........555\88gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc~k=2egUiBvB|f\\fUʼnjgYi~|YFLgͭiZZ{{bbnWWe55ZYYYYYTTYTTYY')""{{22Zdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc}rrϖH8|'oDo.wBY=fPPJ蓺_i{zjtm`jo\HNPPBBii~g''vv{{{zzztttUUc@@ZYYY22YLLY''YNJJpdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccBk2P5~xBՂN+TocfenYJRiwtmfjkx]J]""ôZiFFwwwvvvsssmmm```YY\..ZYYYYYFFYU..dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\Bٳw.=PoP{@8\HY+u_\Y.bwc]`JFFLWciijcf{`LRôǤ''`ssswwwvvvmmmnnnkkkiii```]]]___LLYYRRYRRYYww''dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\foBB`{ւϗNv@`fB.cmLHHHFHTbigZNg~ubNZrr++сkkwPPnHHp;;r..p..m22i@@bDD]NN\YY]]]]___```___]]]\\\___YYYNNYFFYYYYYFF,,dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;D....................D..gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\fBB]R2BP|gc~WLJLLFFHZgcYRLeggnbTUj;;ƐvvJJp88_HHYWWYYYYYYYZZZYYYYYYTTYRRY""YE55PPFFf)qdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ww5ckrBw.\FuTPLHFFUe_\\LLUZ`cpfbZZ;;ųYYYYێ먨xxNN++m88ZTTYYYYYYYYYYYYYYYY@@YfNB[Bdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\׳i.BewgBBws\PmYRLHJLWf]]cTR_`UHY{we]`_'']]"";;88m;;YWWYYYYYYYYYY@@YTee//dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\B@__'w.wf\RtsRPWZcn_\eZesfPFFbj`U]`&&UU22""_RRYYYYYYY22YeeFFdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;D....................D..gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccպ2tg鏵NժoسpZccc`U]bftzgUb`w|fLFFYf]R]\]m&&{{gHHYYYYBBYT;;PPFF++99dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc߳֘\Bxpfڲ]sÆ߳cccTT]fvuPbzfHFFL`ZNYYb&&{{iLLYBBYT55dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;w''......w''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc߳ՌTz.eܩfܳcccgYLTfPieFFFFUUJPUb&&mm++c;;YVdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc߳ewгPxws.Jssroڳٓccc_LbRxbFHFFJPHWg&&Zdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc޳.oPpww~RNv\|PeڳԩœccjZN\R_HNHFHHFJZt&&s Ydzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccֺݳҳԳܳf.@foP`ȕ5txfwēcezW}L~YHLHLJFJWb&& Zdzcccccckkknnn{{{ppppppppppppppppppfffYYY@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ZZZtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ݳҳӳճֳkԘoځsنϳ͓cfPxiHoTHNNJYUHL\''%%fdzcccccckkknnn{{{ppppppppppppppppppfff\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYnnnppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ܳѳҳԩس޳Pfo\=ϓciu\LpRFZLHN\UHW\''dzcccccckkknnn{{{ppppppppppppppppppiiiffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff~~~ppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\۳гfܺܳݳ߳w.BPBZB.ΓcgYJfunHFLzHHNNLTJJNWWj,,}dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\۳ϳђf۳ٳڳܳݳBfwwʨeޑ.w쩿“cerwTZgUFHFgu_FHNLJLUY''''''''''''''''''''''''''''''''''..dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ڳγϳֳݳٳPb.Pov.~f޳.ڳϳΩccc`PJNPHHLJLTHFHNNNJJLRWYdzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ڳγγ昶ڳw.;۳\oPcP.PgϳγΩcccrcwNJHFHLPLLHHLPLPWZ{e8eTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT+Tj_jccceeemmmpppΨoooeee___UUUHHH222ww\ǵcccٳͳγ\m۳ֳ׳سٳܳo5ow\~oγͩccc\sTLJHHJPUTWNLPTRPTWZZin~~zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzssYYH8HbbbnnnrrrΔwwwggg```YYYJJJ888ww\cccٳ̳ͳѤԳճֳ֩ڤ.׳kmwfnԸͳ̩ccc_uT}LLLNYZZUUT]`]+"ssLLYYYnnnrrrzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pppiiibbbYYYHHHDDDww\kkk׳˳̳ͳγҳֳܳѳҳҳԳԳ\m.~ϳسo߳ܳ˩cccWzR~TNPRRT|WW\WWZef`+J]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]"~~YYNNNfffppprrrrrrpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmggg```UUUDDDNNNww\\\\\\\\\\\\\\\\\\\\\߭陬2׵ǓcccfWZ]WUYe_YtvbnJ''''''''''''''''''''''''''''''''''''''''''Y8YNNNPPPfffnnnnnnmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjeee\\\NNNLLLNNNwwwwwwwwwwwwwwwwwwwwwwwúúúúĺĺźźźźƺƺƺǺǺغDk{Ϻݺݺݺ޺ㄗDϺßcccbi\YRRNTZn\jpn++n|||NNNNNNNNNYYYbbbeeecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc```YYYPPPNNNNNNNNNwwwwwwwwwwwwwwwwwwwwwww.~kЬЬȬǬƬ˧閧󬮺||}srjWPNP_c]i|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY\\\\\HFFFFFFFFFFFFFFFFFc|||cccccccccccccccccccccccccccccccccccccccccccccccccccccc```\\\YYYWWWUUUWWWZZZZZZ\\\ZZZWWWUUUUUUUUUUUUWWWUUUUUUTTTUUUTTTTTTTTTTTTTTTTTTTTTUUURRRcccޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡwwwwFFFFFFFFFFFFFFFFFFcFsssbbb]]]___kkkxxx~~~zzzjjj___```ccceeegggffffffeeeccceeeeeeeeegggeeeeeeiiiiiicccTTTcccޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘwwtFFFFFFFFFFFFFFFFFFcFFrrrLLLNNNNNNTTTnnneeeJJJNNNNNN\\\iiiiiinnnmmmiiifffiiikkkooopppjjjooorrrpppfffUUUdzcccޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻FޘNNNNNNNNNDDD888222.............................................................................................555BBBNNNNNNNNNFFFdzUUU""""""JJJNNN```ooo555+++LLLNNN\\\iiikkkjjjgggjjjjjjmmmrrrsssxxxwwwwwwsssiiiUUUdzcccޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻FޘNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNFFFdzzzz++++++'''"""+++NNNPPP888"""555NNNTTTcccgggccc\\\\\\```nnnooottttttsssssspppjjjUUUdzcccޘF޻ނ."""""""""""""""""""""""""""""""""""".ރ޻FޘNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNFFFdz.........+++"""FFFHHH""""""JJJNNNRRRRRRRRRWWWWWWZZZYYY```fffkkkooossssssjjjUUU?NT\ZZZTTTdzcccޘF޻ނ""ރ޻Fޘww\PPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBdz222222...+++'''DDDFFF"""@@@NNNNNNNNNRRR]]]bbbeeejjjjjjjjjjjjpppxxxvvvmmmUUUS^_`BBgffwgg|22}BB_BBY;;YYYYYYYQdzcccޘF޻ނ"tggggggggggggggggggggggggggggggggt"ރ޻Fޘww\YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555dz555555222+++'''DDDDDD;;;NNNNNNTTT```cccjjjjjjoookkkkkkooorrrrrrrrriiiUUU--YnJJubbbYYYYYYLLYZZZZ]_`YdzcccޘF޻ނ"gg"ރ޻Fޘww\```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...dz555555222...'''FFFHHH@@@NNNPPPYYYbbbiiikkkrrrtttppprrrrrrrrruuutttmmmWWWvwooвÍ]]tYYYYYYYYYHH]fe`_````YdzcccޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz222555222+++""""""NNNNNN"""JJJNNNRRR\\\eeeoootttxxxzzzrrrrrrtttwwwxxxvvvnnnWWW{nucznijtxrmiijntBBwȶ``eeoooooooooffptric`````YdzcccޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzZZZ222...'''NNNNNN'''NNNNNNWWWcccppprrrzzz~~~||||||{{{{{{}}}zzznnnWWWccnuxwr_R`c]\ZZ]`g_ZYY\]`fJJvBBffeexxxxxxxxxttw++ug``````YdzcccޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzccc+++NNNNNN+++NNNRRR```sssxxx}}}zzznnnWWWUW]gtxs`JJLLNPT\`]c`ZWW]fuBB``||HHZZpb``````YdzcccޘF޻ނ"gޘF޻ލރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdzsssBBBBBB222NNN\\\ooo{{{{{{pppYYYWJHJP]juzufNFFFFFHJLNT]]\YUWZWWWWWZiJJHH''Əg```````YdzcccޘF޻ނ"gޘF޻ނ."""""""""""""""""""".ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdzxxxHHH"""""""""ZZZrrrLLLtttYYYJFFHWizvZHFJTY\]`bbb``YPJJJLNPT_tWWȫ""kk]]wb```````YdzcccޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdzUUU555rrrfff}}}tttzzzxxxYYYNFFFNgwx~uT\t{unf]URNJHFFHHJLLPU]BB""ȇ55k````````YdzcccޘF޻ނ"gޘF޻ނ"tggggggggggggggggt"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz"""pppWWWJJJ~~~"""oooWWW{{{ZZZRHHJJ\xnbfwpe`]ZUPHJUUJHNZHH¢``c````````YdzcccޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz'''+++pppeeeWWW;;;|||ZZZZJLRUWbxwjf`UJHLY\TJJLPT\{]]Ȏkk{`````````Y""AAZqpZdzcccޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz'''+++"""]]]]]]BBB"""\\\tJT]fn{bYLFFFHJLLNU`sJJ~ȍ88p`````````Y,,((/dzcccޘF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz222+++ppp]]]]]]iii555"""\\\L_{YFFFFFHLNNNNNPTUW\ů¿++cDDƾg`````````Y..JJ22`((/dzcccޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz'''DDDDDD222BBB\\\WvWcn|cHFFFFHNPNNNPUZZBBȨgiiþc`````````Y!!{{ꊊdzcccޘF޻ނ"gޘF޻ނ"gޘF޻ލރރރރރރލ޻Fޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzooo\\\no`UPLHFFHHHHHHHLPZbeejj~mYYȫ``````````Yi""vv䊊dzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ."""".ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzjjjRRR"""NNNbbb___rgZ`fffeb_YTLHFFHYmmȢú..Ynȕʐ``````````Y)""{{22ZdzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzHHH""""""BBB___vw~gU_s|z_HHNZ_cͲ""\mȩuu``````````YNJJpdzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ"tt"ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz'''"""___eLRewuTL\ZWrrϹĶYgȚff``````````Y..dzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ"tt"ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz+++'''"""gggeee___gLLTZ`zgLLTZYTPУYbȘʻ``..``````````Yww''dzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz++++++"""]]]~~~\\\___xfNR\cebbix~oZLFJRWTNrrѶ""`\ȰzzZZ``````````YFF,,dzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ."""".ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz++++++]]]]]]___x~okcZY\]\UPPRRLHFFHLPUYZRPѲ55\YnȞ՗υ``````````Y55PPFFf)qdzcccޘF޻ނ"gޘF޻ނ"gޘF޻ލނނނނނނލ޻Fޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdzbbbggggggZZZ```Njrijjjgc_]_gu}iRHFLU|TRrrǗZZwYbTTƲ``````````YՙfNBB[dzcccޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdzDDDxxxxxxDDD~~~```NbwnYY`fiigefnznUHHJN~T|WY55]]ͤYZuvvظssc`````````Yeeឞ//dzcccޘF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz""""""'''""""""bbbYrfTNZgmmibZUWctugPFHLZZ""22]Y]LL8855k`````````YeeᙙFFdzcccޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޠg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz'''++++++ccctcTHFLZfvxpfZNHHLRfшvvYYiȚ88""x`````````Y;;PPFF++99dzcccޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz'''"""......''''''++++++"""'''""""""ccc}ZP\ioR]wWHFFJWbffb\ULJJJJL\ZZ;;RRxY\s׆`````````Y55dzcccޘF޻ނ"gޘF޻ނ"tggggggggggggggggt"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz''''''+++''''''...222..."""""""""'''"""ccc{]NHFHRkzwfRRiLFFHHP]]TLN\YTPNLLN''ӃϮ`]Ynxxױf````````YdzcccޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzYYY............222222...'''"""'''+++'''+++""""""RRRcccUJHFF]zxfxtRFHLLNUTLPmkWRW֯雛YYZo;;w````````YdzcccޘF޻ނ"gޘF޻ނ."""""""""""""""""""".ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzccc555555222222222555...+++'''''''''+++''''''+++'''""""""'''"""]]]cccULHH`tz}|wkcjJFHLPRTTYYzT}R~f..ڷˠYe\bzԃb```````YdzcccޘF޻ނ"gޘF޻ލނނނނނނނނނނނނނނނނނނނނނނލ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzuuu555555555555555555++++++...+++++++++...+++++++++'''""""""''''''pppcccUNJTepsniccszYJHJP\cpuWvZ}j88۶ڸ~~55_YY_s88u```````ZdzcccޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FHJdzDDD555555555555222+++......+++.........++++++'''''''''""""""'''''';;;cccZbov{zsmknptz{n`LLTbb{''أ̼gg{\`Y_``Äf``````ZdzcccޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FLLdzeee222222222......+++......+++......+++...+++'''+++'''"""''''''```cccw{xnfgjkeRf}ڿwwLLrYY`LLb`````\dzcccޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...HTPdzbbb222...222...............+++...'''"""'''___cccreefii..55ځǧUUr_22bƶ}b```` ]dzcccޘF޻ނ"gg"ރ޻FޘeeemmmpppΨoooeee___UUUHHH222N_Tdzbbb222.....................+++++++++""""""]]]cccrr==֖ھˍže``` ^dzcccޘF޻ނ"tggggggggggggggggggggggggggggggggt"ރ޻FޘbbbnnnrrrΔwwwggg```YYYJJJ888\gWdzccc222222...+++222......222......'''+++'''"""]]]ccc''bb֠лŖ22reb%%^dzcccޘF޻ނ""ރ޻FޘYYYnnnrrrzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pppiiibbbYYYHHHDDDjpZdzmmm555555......+++222.........+++...'''+++"""gggccc""++TTԏ΄ccŀ€rr~,,mdzcccޘF޻ނ."""""""""""""""""""""""""""""""""""".ރ޻Fޘww\NNNfffppprrrrrrpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmggg```UUUDDDNNNdz555555222...+++......+++...+++++++++..."""cccPP;;''''''''''''''&&&&&&--dzcccޘF޻ލނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނލ޻Fޘww\NNNPPPfffnnnnnnmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjeee\\\NNNLLLNNNdzDDD555555222222.........'''...222222...;;;cccdzcccޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘww\NNNNNNNNNYYYbbbeeecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc```YYYPPPNNNNNNNNNdzPPP222222222222222222222222222...LLLcccǵcccޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘww\\\\\\\\\\\\\\\\\\\\\Ǵǵccccccޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠwwwwwwwwwwwwwwwwwwwwwwwccc|||wwwwwwwwwwwwwwwwwwwwwww||||ckcpctcfcccccccccccccxcccrceccccccccccccccccccccccccccccccccccccczcgcexcmcwc~c~ctccmccccccccccccccccccYYYޙû޻ގގގގގނvvvvv@@ގގގގގ|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY|ckcpctcfcccccccccccccxcccrceccccccccccccccc```\\\YYYWWWUuWZZ\ZW~UzUxUoUZWYoUbUmTsUtTgTU`TTTTTTTTTTTTTTTUUURRR]c_PNPRWßؓؓٓȓ̓Ǔ擴哚cjޯæަގގގގގ__vvvvvooގގގގގcccßؓؓٓȓ̓Ǔswwbgi]ce_eekvx~zj_`cegfrfwe~ceeveisgkkegieiiikmikkcgT\pnj\nZNR\sibյީħȧŨĩéĩũũƩǩǩǩȩȨ֤کةששΩcm޾Öޖގގގގގ55vvvvvކގގގގގcccյީħȧŨĩéĩũşrLtwNNTneJNN\iinmifikopjorpfnU_btYZ_eZYUTW]\ZWZ}Գʳ˳ͳγϳѳҮ٧֧שڲݳٳڳ۳ܳۤڠܳ׳ϳγͳ˳ʩcfû޻ގގގގގނvvvvv@@ގގގގގޙdzcccԳʳ˳ͳγϳѳҮ٧֧שڲݳٳڭUjk"";'\"BuJN`n5+LN\ikjgjjmrsxwwsinUY}k`feZWk\WWRPTWzڳѳͳγϳѳҮҟѐ͐Ҝ٧ܲݳݳ߳ݳֳҳѳϳҳԳөcccæަގގގގގ__vvvvvooގގގގގޯdzcccڳѳͳγϳѳҮҟѐ͐Ҝ٧ܲݳz++2+='R"]+xNP8"5NTcgc\\`nottsspjnnUUU]`]TUUUUYZZWYU|NLLLLRT}_u߳׳ϳϳѳүѠʂWkƈ՜ާ۲߲v`YZn׳ֳԳӳٳڳٳکړcccÖޖގގގގގ55vvvvvކގގގގގ޾dzccc߳׳ϳϳѳүѠʂWkƈ՜ާۧ....5].Z+u"FH""JNRRRWWZY`fkossjoUUUiZWTRTLWUPJHHJT\sܳѳϳѳҲԡe;oNNkʈכԦڭvPNNNT۳ڳسֳ۳ܳ۳ccmû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccܳѳϳѳҲԡe;oNNkʈכԉ22225B._+''FF"@NNNR]bejjjjpxvm|UWbZWWPNLNPPLHHLLRPLHFHJNcwٳѳѳҳԦrL|8g;NNkψҘՠۧ\YWRJLU޳ܳڳڳcfæަގގގގގ__vvvvvooގގގގގޯìdzcccٳѳѳҳԦrL|8g;NNkψs5555==2_+'@B5'iHL];NNT`cjjokkorrri~UY~iWRLJNNNFHTJLHHPNJ`ڳ׳ԯ{_YL8z;NNkֈ՘۟UYWRF8\~cccÖޖގގގގގ55vvvvvކގގގގގ޾ìdzcccڳ׳ԯ{_YL8z;NNkp5;;5BW2g.2D;2+nF=`=_=g@NPY]bgptprrrutm|WWWYUPLHJLNNHF_ugFHFUgZJT,,m%%^ ^ ]\ZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYQ݇ge_YL8;NNkWYUNB8b蓖cccû޻ގގގގގނvvvvv@@ގގގގގޙìdzccc݇ge_YL8;NNc2F5T2z+@=5++Z@p=v8\8_JNNNRW_cjcinuxvnrsWWWjWNJJTLNHHzLFHnufJ~--~b`````````````````````````````````Yκ酫fge_YL8;NNkjYYTL=Bb|bbbæަގގގގގ__vvvvvooގގގގގޯìdzcccκ酫fge_YL8;NN82|.'@2++'UgT2x'_}NNNNTTU\_\]_eszmprUUU\ZWNHU\LNNHLZFRpL\&&e````````````````````````````````_YTۺ公fge_WJ8;NNkWYWTJ8Jbu~ǎ```Öޖގގގގގ55vvvvvކގގގގގ޾ìdzcccۺ公fge_WJ8;N5+nf"'++"tmj\j+NNNNNPPPPPNN\gmfkkTTTo\LHUYJNNToHixP{&&r````````````````````````````````]YTۺݳfgc]TH@;NN`RYWRF2NZjtvutronje`\UTi䍐```û޻ގގގގގނvvvvv@@ގގގގގޙìdzcccۺݳfgc]TH@;8Dr'U8LT""~mpm]2NNNNNNNNNNNPYZ`gkkUUUbWJFJLHLPHY}L}UW&&e```````````````````````````````ZYT޺ܳ߳兲fc]ZceT=NLPUTN@8NT_igc`ZURHB85JNTvڌ```æަގގގގގ__vvvvvooގގގގގޯìdzccc޺ܳ߳兲RDx]ZbcR"]@'`BYr}xjY}"NNNNNH+82HNNY_cjooUUUtfJFHHFHNH_R\Z''b`````````````````````````````_ZYݳݳ``s~wZBHNPNH8BNNPRNNHB825;@DHNRrȆ___Öޖގގގގގ55vvvvvކގގގގގ޾ìdzcccݳݳLep"=D]D{|i'H2'c=Zk]iDHB5+'+5=NNYZ`imnUUUgWJHPJFFHFbxRbLP_''}b```````````````````````````c`ZYZ߳߳~eN@JLH@2HNNLB825;@DFJLNPNUm돬]]bû޻ގގގގގނvvvvv@@ގގގގގޙìdzzzzeeeZZZWWW\\\eeevvvccc߳߳"""=;iw=Zep8+ePgRHH'.2~2p"""+x"r;;LNT\fgmmTTZw`PJUUFFFFeiPfTLg''rr22f````````````````````````bgieZ;;YZ}\D;==8.+B825;@DFxJ~LNPRRTTNWp׉}\\\æަގގގގގ__vvvvvooގގގގގޯìdz||BBggicZ..UFFPNNN```~~~ccc'''+++ߛR"2twU8u"P8'J;i=n=v+FbHmB@HNRgjciiTTTbYYNZ`LFFHfzbPuvf]TT''ʀžub````````````````````bgpurfLLYBBYZ""ZAAqpZt@+.p.`+Y+.5;@DFJLNtPxRRTTUUUPPZ{x|}\\\Öޖގގގގގ55vvvvvކގގގގގ޾ìdz__u_22TLLNYYY~~~ccc'''+++"""Ť;\u]F5.u2=_BjBp"2H"""DD=HR`iebggUUUm]]R]fYFFLf|w`bUiztfb]U`''ɀ¿wf````````````````ckwtHH]YYYBB`,,/((f++w.Rp5Rp;Uu@rDFJLNPRRzTvT|UUUUURJHmkpvzv{{ZZZ޻ގގގގގނvvvvv@@ގގގގގޙìdzJJi""WLLN```ccc222+++jJ''|_PNU\HN.BRFoHwH".;"""2;;ZYY_finnWWW`__U`jbFFPfseZe\_ncZWPNR\''ccſ¶LLxkc````````cgo{++ffpYYYYYY22}\..JJ22`/((ⅰB{5c;_@b}DeFfJfL{NPRRTTUUUU~UUTU_inneYWw}w|}\\cަގގގގގ__vvvvvooގގގގގޯìdzuui22TNNNvvvccc'''ӳ;H"n"iYY]gk`J'cHwHD+8+Wm`bZNTkpkppWY_i_`]ew{YHU`_RTc]]fWLJLYx''ǎ˄ZZttwoooYYYbbbgg|T!!{{䊊kBr5n;x@{DvFtJnLoNpPpRpRTTUUUUUUTYk{voeYPZf|z]e{ޖގގގގގ55vvvvvކގގގގގ޾ìdz_FFPeeecccj+Wz;u8k"b+|'gcF\Z]cjmmjbUZrZ"oFB_UPZfuupvY`uZZbfrc`ZULL\\_eUFFHLPPTу;;""5555]]xxxoooYYYffwNi""vv䊊c=\;Tu@\{DcFnJwLNPRR|TwTwUxUUUUUTT`zxpfFJTbnúȈ]oގގގގގނvvvvv@@ގގގގގޙû޻dzoou..U\\\cccc=\+5J"5FJvDuL"ZJ+~WDeossojiknpw{82"T+cJTbnu~w\kjUbnggeLRYcgZHFFLJWPPTTԖԸц8888ss厎酅ZZ..88kkxxxooo]]tBBg)""{{22Z_Y|JfpLitNkzPrRRTTUUUUUUTPJ@LNj}reRFF.is{ۆ_{ގގގގގ__vvvvvooގގގގގޯæަdzBBZWWWccc_Y|'.2;LBe"m"`D"tDBjz{xpc_isxbgJ+kF.e.is{鋸Ԃ]wZTNbu~gNZgibTHFHHHLRm++ŀԿ׸ո҄zz``ffuuÃxxxeeb?NJJp__TsRr~TsTUUUUUUTRNB8BD8;WgsHTZ\.v\`Ŏގގގގގ55vvvvvކގގގގގ޾Öޖdzc\\\ccc__'''"""22D|Bfi\P;e88fvrpk]\jt{ub="T85+pZ醠_tR`{fcjiicWLFFJ]ϻΡ22bԿ׸شռʯeeIJè_..__YzUvUwUUUTRRUURF22FNH@ux\_bcH8cގގގގގ55vvvvvކގގގގގ޾Öޖdz''..ieeeccc_Ww+++'''"+p=2iB`\WRB"uiFcfe]ZcgUreD.n55j5_]PJ]xkjfmtwiRJYnef""͠м_```Ӿ׸شռʯHHЃ^ww''׺x_Y|UwT|ZwWYUNB+5JUTHz}cceeb.gćcގގގގގ__vvvvvooގގގގގޯæަdzBB==eegzzzccc׺xZ|++++++"2@J|ePLPL=_8+=@55]R"T"U\BDP|.b_NH\oj`mtjz{ibb֍UUrY_88׷شռʯkk''``JJuSFF,,mx֦{YYTL=58JTL=Tteeeb_Rzܱcގގގގގނvvvvv@@ގގގގގޙû޻dzoo..ڮDDBBgcccm+++++52=]@885'~'52e"Y=uRzHnۨ_gLFY|~iYgkjԾ˧YYsxxΚزջʫ``ȶn55PPFFf)q\ZYTJ8_D;=;FTbpxwnfeb_Y}ʪcܖޖގގގގގ55vvvvvކގގގގގ޾ìdzהDD||cccb'+5gL""F8k+@RvĠ`LFTnrYZk''ϖLLr`_zLLvvTTƞΰ͘ʚ˩ǕYYiiDDffoofN[BBUknTH;_N8FTZ_bceeeb_Yocۦަގގގގގ__vvvvvooގގގގގޯìdzwwڔﮮee..__ccc_+DcxD@o'BZw`fLFJtconNjg==ww\Ybx--Yee랞//W`_PR]nNTZ_bceeeb_YPgc޻ގގގގގނvvvvv@@ގގގގގޙìdzPP..==''JJccc"""2"""'''""""""""u;ڧbJFF\WwTziЁֿgg{Y\o||BBwveeFFtYYTL@Pm__bceeeb_YJ;NNkcÖޖގގގގގ55vvvvvކގގގގގ޾ìdzwwuuccc'''++++++"+"+'F"L8z"D5g+vڜcWJFHTftgf55ڼ55_cZnHHì;;PPFF++99ZYWTJ8.P`ceeeb_Y]WL8;NNkcccæަގގގގގ__vvvvvooގގގގގޯìdzooBBBBooccc'''"""......''''''++++.."""'''"""""".=cccciJNZuspf..~~YYYs""BB}55|UYWRF28Uceeb_YZoj_YL8;NNk듡cpû޻ގގގގގނvvvvv@@ގގގގގޙìdzccc''''''+++''''''...222..."""""""""'''"""Hkꓡcp_`fvxccnfeԣ丸 Y]\i~""``mTWYUNB+s=zU`b_Ywfge_YL8;NNkڲғciÖޖގގގގގ55vvvvvކގގގގގ޾ìdzcccTxx............222222...'''"""'''+++'''+++"""""""buNNkڲғciisu~w]Rfkcki''ض˜`YY]uȅJJvoNFPYYTxL|=u+Pk=YPWUufge_YL8;NNkѩϨÓciæަގގގގގ__vvvvvooގގގގގޯìdzcccU555555222222222555...+++'''''''''+++''''''+++'''""""""'''"""f;NNkѩϨÓci~wx{xfRRxwimne88۷ٛRRxYYZbn~~]]۳۳ݯݓrRFTZTYWxTxJx8m{+Df;RuDpfge_YL8;NNķۧciû޻ގގގގގނvvvvv@@ގގގގގޙìdzccc۳۳ݯݓr@o555555555555555555++++++...+++++++++...+++++++++'''""""""''''''28;NNķۧciwxtuwbf|nst..گvv22]YYYZbgmmmg++cBBJJڳճֳٳۢYFTZ_]U|Y{WwRxFu2bp+Fjofge_YL8;NW˧cjÖޖގގގގގ55vvvvvކގގގގގ޾ìdzcccڳճֳٳۢYFP8DN555555555555222+++......+++.........++++++'''''''''""""""''''''+HLTL8;NW˧cjugjznw}szxjփړŤZZx55\""`YY""Z..Yjj~HHڳӳճחFvTZ_bc]WzYzUxN|BpYfge_YL8;֩coæަގގގގގ__vvvvvooގގގގގޯìdzcccڳӳճחFvTZ_]Bb~222222222......+++......+++......+++...+++'''+++'''"""''''''=|__YL8;֩com]]iozzp{|'';;ۈ͗ºȯJJٳҳԳ֙Z_bceeYY{Y{TL=z͏Գfge_YLzǓcmû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccٳҳԳ֙Z_bceeYY{Y{8H_222...222...............+++...'''"""'''_fge_YLzǓcmcWPWgxxikztev""]]rrDzҶϣIJˢeeBBسѳҳԯiceeeb]\\\W;xѤfge_cccÖޖގގގގގ55vvvvvކގގގގގ޾ìdzcccسѳҳԯiceeeb]\\;No222.....................+++++++++""""""]|fge_cccUJHN\b\R]`Tv55dd׳ϳѳҳԌeeb_Ye\\`fgԳcccæަގގގގގ__vvvvvooގގގގގޯìdzccc׳ϳѳҳԌeeb_Ye=Nv222222...+++222......222......'''+++'''"""]{fgԳcccuUHFFJWnPHFHJbֳγϳѳүj_Y~ϳѩȓcccû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccֳγϳѳүj_Y~m555555......+++222.........+++...'''+++"""gϳѩȓccceJFFJUfZFFHNֳͳγϳѳҧ~߳γͩcccÖޖގގގގގ55vvvvvކގގގގގ޾dzcccֳͳγϳѳҧ~߳555555222...+++......+++...+++++++++..."""γͩcccWJFHR]}HHLUճ˳ͳγϳѳҳԳճܳҳ˩cccæަގގގގގ__vvvvvooގގގގގޯdzcccճ˳ͳγϳѳҳԳճܳDLT555555222222.........'''...222222...;HLҳ˩cccUNHLT{NJ{ĺԳʳ˳ͳγϳѳҳӳ߳߳޳ٳʩcccû޻ގގގގގނvvvvv@@ގގގގގޙdzcccĺԳʳ˳ͳγϳѳҳӳP]i222222222222222222222222222...L]fٳʩccc]RJJ_]U亻յ“ccc޾Öޖގގގގގ55vvvvvކގގގގގǵccc亻Ǵȴȴȴʹ۴ߴߴʴյ“cccsNLvjbrĺĺúĺۺۺߺٺպպպպԺúcccޯæަގގގގގ__vvvvvooގގގގގcccĺĺúĺۺۺߺٺպպպպԺúcccZWnrwxNN󬭱쬬լǬǬĬ¬ǬȬǬ|}ޙû޻ގގގގގނvvvvv@@ގގގގގ|||󬭱쬬լǬǬĬ¬ǬȬǬ|}er@@ooTTbb""==22""``ttLL''..++ގގގގގ55vvvvvކގގގގގ޾Öޖ|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY@@ooTTbb""==22""""++bbzzWW..wwHHYYWW22DD]]''++{~ގގގގގ__vvvvvooގގގގގޯæަcccbbzzWW..wwHHzz==LLLL''++{~..'';;ZZWW""BBDD|JJee..""''@@HH..""ގގގގގނvvvvv@@ގގގގގޙû޻ccc..'';;ZZWW""BBDD܍RRZZRR""""==..==zzBB@@jjLLDDBBee55~~;;..22;;''DDWWbbRR55ޖގގގގގ55vvvvvކގގގގގ޾ìdzccc==zzBB@@jjLLڗttee55JJ====܄""88HH..FF""22++""BBnn``''22RR~~wwDD88LL''ަގގގގގ__vvvvvooގގގގގޯìdzccc""22TTBBBBbb랞RRoo@@++JJ'';;""""FF..\\JJ++LL''???222.......................................###""FFkkxx]]==\\..ggccFFcc""޻ގގގގގނvvvvv@@ގގގގގޙìdzccc""''++++..""8855}}}}++''FFcc""JJJLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***;;}22\\;;;;YY..88++~;;++mmkkBB88@@Öޖގގގގގ55vvvvvކގގގގގ޾ìdzccc;;}uu""}}ҔkkNN55DD@@;;++vvjjBB88@@TTTYYYZZZWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888***;;;;uuHH++BB==DDZZDDWWUUUU""YYHH++LLæަގގގގގ__vvvvvooގގގގގޯìdzccc;;;;uuHHYYbbTT}}ZZ__22""55LL..첲uuHH++LLGGG+++444JJJBBB(((,,,222IIIYYY```bbb___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZTTTHHH888LLLLooss88~BBjj55@@__{{ee""PPû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccLLLLooss88ccLLbb==""8888oo88JJpp쯯ȁJJ""PPPPPJJJGGGDDDDDDBBBBBB\\\;;;LLL@@@>>>CCCDDDvvv@@@]]]eee````````````````````````````````````___ZZZTTTHHH888***ccggYYjj\\~++""@@ee]]"";;PP++@@Öޖގގގގގ55vvvvvކގގގގގ޾ìdzcccccgg]]NJѐ‚''DDNN88FF..BBYYLL55""..++@@VVVBBBhhh===fffvvv```````````````````````````````````````___ZZZTTTHHH888***..nnFFeeJJ88DD""@@''++55++TTzzzz__~|æަގގގގގ__vvvvvooގގގގގޯìdzccc..nnFFBBᦦƁυNN..@@BB;;RR88~~⥥\\敕gg""BB''III999>>>bbbfffeee``````````````````````````````````````````___ZZZTTTHHH888***"""""..;;RR``''""__NN""{z55@@JJ""UU..++88}xû޻ގގގގގނvvvvv@@ގގގގގޙìdzccc""텅;;88WW....LL坝˂ZZWW""""LLnnWW__xHHHFFF999AAA;;;oooaaa]]]`````````````````````````````````````````````___ZZZTTTHHH888###z..JJFF22''__eeWW..''FF""YYkkFFÖޖގގގގގ55vvvvvކގގގގގ޾ìdzccczLLNNJJHH==""==NN==LL..==++FFZZ;;@@ێggFFF===:::IIIttt@@@888%%%777````````````````````````````````````````````````___ZZZTTTHHH888***;;;$$$""""""""''jj{{]]BB@@""++BB@@++BB;;æަގގގގގ__vvvvvooގގގގގޯìdzcccTTUUUUPP椤..;;''55LLNN᧧TT栠cc;;22mm55GGGiii<<<777```````````````````````````````````````````````````___ZZZTTTHHH888***333***999)))!!!888"""222999)))%%%888"""222999)))***ttzz;;DDkkrr++22''DD]]WWUUû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccNNttPPLL==88FFTT''55YYee88""HHooHH;;||ӃWWUUDDD,,,DDDttt:::<<<@@@888``````````````````````````````````````````````````````___ZZZTTTHHH888***GGG...###<<>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888...''UU==NNeessBB''''|~@@DD8855oo]]@@}88""û޻ގގގގގނvvvvv@@ގގގގގޙìdz__u_2T2LNLYYY~~~cccffww@@++PPJJ88jjcczzkk@@''DD;;FF""LLX`ccrm|opn~jzesZgNZFR>G;;;BBB!!!uuuBBB333<<<ggg```___NNN@@@555555555555555555555555555555555555555555555222222222222555222+++***<<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888++iijj55DDZZ==++""FF55RRjj""zÖޖގގގގގ55vvvvvކގގގގގ޾dzJJi"W"LNL```cccTT셅לLL5555NNLL""JJ++""NN==UU22""""BBٜLLNNss__ggMgnn~{}xtm|_mNZEOEEE666/3RY[)5;%*>>>;;; kvHHHDDD@@@;;;```PPPJJJFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDH;;R++WUTRJ""@55;;;222+++***BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""``JJ;;ZZHH''BBHHffccppHH++""""æަގގގގގ__vvvvvooގގގގގޯdzuui2T2NNNvvvcccBB]]LL++FFYY22""ZZ22YYLLLL쭭..NNBBWW225555vv++jjiivv^z{{tiwUbFPFFF?G`mgvgv_mT_38===c~UUUUUUUUUTTTZZZRRRRRRPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLZFFz''{pfYF'';''+++GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***''ccPP``{{ii""PPjj..55""22ee55û޻ގގގގގނvvvvv@@ގގގގގޙdz_FPFeeecccPP@@鬬ssNNLL==YYffzz锔BBTT쩩==wm|WcEO,]h~~vgvNZ7@***kg\\\]]]]]]]]]WWWWWWYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTgLLp]U5''***HHHBBB@@@999<<>>333<<<jjj]]]eeejjjjjjjjjjjjjjjjjjjjjjjj``TTFF`BBB888DDD777BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, ''WWWW;;JJ++22''''++YY22..UU....''}{޾Öޖގގގގގ55vvvvvކގގގގގdzoo..DDBgBcccJJ++NN22xxff@@++""LLNN""55vvLL==@@JJww..HNίLs-NWBi;{,LLLFFF;;;piHHHDDD@@@;;;]]]fffiiiiiiiiiiiiiiiiiiiiiiiiiii..""88;;++H@@AAA>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***++BB88PP==BB55JJ\\''55]]55PPccNNDD..~}û޻ގގގގގނvvvvv@@ގގގގގޙdzDD||ccc..ff""NN==NNJJ''BBǂss``55''LL22..@@Hv{Z.hvaef0,\fccckkkgUUUUUUUUUTTT```fffiiikkkeeeeeeeeeeeeeeeeeeeeeeeeeee\\T@@AAANNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$BBDD88..ZZss;;""88BBnnooppFF5555æަގގގގގ__vvvvvooގގގގގޯdzwwee..__cccLL55++""BBPP{{22==++++UUPPwPelTTT===5mz]v|gggnc~\\\]]]]]]]]]```fffgggfffccccccccccccccccccccccccccccccZZ22++FFiDDDDD???>>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###""__mm55DDiiWWRR``LL]]||..Öޖގގގގގ55vvvvvކގގގގގ޾dzPP..==''JJcccHHYY""55YYLLRR22""@@\\朜LLHH䗗mm~Rpx???999@dmdQQQuuuBBBv]]]]]]]]]\\\```cccfffeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{ZZDD22222222DDvZZ___WWWJJJ???BBBFFFYYYAAAFYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRY``>>>aaa...;;BB""DDoogg2255==++++ggÀ@@88==û޻ގގގގގނvvvvv@@ގގގގގޙìdzwwuuccc''BB..BB55``ii'']]DD++nnHHLLppӛ{{ۗ;;53EEE;;;CCC>>>RRR>>>XXXXXX___``````bbb```____________________________________________________________\\\TTTCCCNNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;22..~++PP..++DDBB''""ccDD..æަގގގގގ__vvvvvooގގގގގޯìdzooBBBBooccc22DDPPFFLLHH''BB''++''BB==""NN55__2222pp..&D<<<DDDkkkjjjOOO```````````````````````````````````````````````````````````````___]]]ZZZUUUJJJNNNTTTAAADDDDRRBYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BZZFYY;FFbdd]]]000rrr===FF'';;gg;;z}5588LLHHiimm22JJÖޖގގގގގ55vvvvvކގގގގގ޾ìdzcccFF'';;==``΅NNpp՗rrbbHH55JJ>>>:::BBBJJJuuuJJJ````````````````````````````````````````````````````````````___]]]ZZZTTTJJJDDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000ggDDFFss;;@@@@""ZZ``__uuWWDD""FFû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccggDDFF||YY88UUHH++``FF""NN8822``LLJJJJ;;FFKKK;;;BBBBBB`````````````````````````````````````````````````````````___]]]ZZZTTTJJJooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGG""88||À\\HH__''@@FFTTNNæަގގގގގ__vvvvvooގގގގގޯìdzccc""88||WW;;''驩DD;;;;''==ԕUUeebb└;;LL<<<888SSS@@@OOOAAA[[[TTT``````````````````````````````````````````````````````___]]]ZZZTTTJJJLLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<''NN22++22==NN..8855++++NNUU55''==..|{}Öޖގގގގގ55vvvvvކގގގގގ޾ìdzccc5555""NN====..BBڇ88..""22JJNN䩩ggFFcc|{};;;;;;DDDDDDCCC```````````````````````````````````````````````````___]]]ZZZTTTJJJNNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBBww""++55@@YYHH""++22BBRRDD++@@û޻ގގގގގނvvvvv@@ގގގގގޙìdzcccww88JJ˄PP""JJ55{{DDZZHH捍mm++jj@@===>>>GGG:::MMMIII???222````````````````````````````````````````````````___]]]ZZZTTTJJJNNNAAAGGG???AAAGGG???AAAHHH++rrxx88''++WW88''TTÀgg""''""æަގގގގގ__vvvvvooގގގގގޯìdzccc""ߌFFNNNNYY..cc__zzWWÀgg""''"";;;999lllBBB999JJJLLLJJJ`````````````````````````````````````````````___]]]ZZZTTTJJJsssQQQsssQQQsss""~ffYYBB55..""22""++DD]]``==LLffÖޖގގގގގ55vvvvvކގގގގގ޾ìdzccc""~__{{׎JJLLLL''JJ88쪪wwٝܒ@@NN88]]``==LLffBBB;;;VVVCCC;;;TTTYYYZZZWWW``````````````````````````````````````````___]]]ZZZTTTJJJ++..==''ZZmmmm@@..ZZ""""@@HH]]DD==__û޻ގގގގގނvvvvv@@ގގގގގޙìdzccc++..==``22JJ..LLBB;;8888ff""''TT==iiNN@@HH]]DD==__GGG888888;;;===@@@TTT???GGG777777888]]]EEEYYY```bbb___```````````````````````````````````````___]]]ZZZTTTJJJ""BB..BB++"";;DDjjBBPPggTT..~55``ee""æަގގގގގ__vvvvvooގގގގގޯìdzccc""BB..BB++@@㡡LL""..훛ԃ55""55==ژ;;==\\55``ee""PPPJJJJJJPPPOOOPPP^^^PPPJJJHHHNNNPPPRRR]]]eeeffffffffffffffffffffffffffffffffffff```]]]ZZZTTTJJJ""++''rrmm88''RRBBUUnnTT552288""Öޖގގގގގ55vvvvvކގގގގގ޾ìdzccc""++''rrmm88kkŃЖ++==}}BB++""NNۜ55\\BBBBfffvvvffffffffffffffffffffffffffffffffffffbbbZZZTTTJJJFFjjBBWW__''22DDDDDDPP''""LLff''{޻ގގގގގނvvvvv@@ގގގގގޙìdzcccFFjjBBLL..==WWHHNN..gg''nnee''{bbbfffeeecccccccccccccccccccccccccccccccccccc```YYYKKK''xx2288PPDD""..@@"";;kkxxee++ަގގގގގ__vvvvvooގގގގގޯìdzccc''xx222288HHLLLLNNooUU""ZZDDHH@@88++oooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTTDD""""__PPTTTT..''22DD\\cc88{{++ޖގގގގގ55vvvvvކގގގގގ޾ìdzcccDD""""]]""ccՒDD''''PP__88{{++""..RR__""88@@DD~BBii55RR{{LLDDPPގގގގގނvvvvv@@ގގގގގޙû޻ǵccc""..FF88WW++@@""''NN""BBii55RR{{LLDDPP55==ffmmDD"";;||HH;;||ff55ގގގގގ__vvvvvooގގގގގޯæަcccLL==UUHHLL"";;||HH;;||ff55..LL""""..iimmPP++"";;HH..iirr88ގގގގގ55vvvvvކގގގގގ޾Öޖ|||..LL""""PPmmPPBB;;HH..iirr88|||ccccccccccccccccccccccccccccccccccccccccccbbbbbb`````````_________________________________________________________``````bbbbbbccccccccccccYYYގގގޙޯ޾û޻ަޖޖަ޻þ޾ޯޙގގގ|||cccccccccccccccccc```___ZZZYYYUUUTTTRRRPPPNNNNNNNNNNNNNNNNNNNNNPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPNNNNNNNNNoooo@@@@ooWW~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cccގގގގގގޙޯ޾þ޾ޯޙގގގގގގ~~~tttggg```YYYPPPNNNNNNNNNNNNNNNNNNNNNPPPTTTTTTZZZZZZ\\\_______________________________________]]]ZZZUUUPPPNNNNNNNNNNNN~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cccގގގގގގގގގޙޯ޾þ޾ޯޙގގގގގގގގގmmm]]]RRRNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRWWWYYY______cccffffffffffffffffffffffffffffffffffff```ZZZRRRNNNNNNNNNNNNNNNNNN444"""dzuuuooommmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmtttcccގގގގގގގގގގގގޙޯ޾þ޾ޯޙގގގގގގގގގގގގdzeeeRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPRRRYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYUUUNNNNNNNNNNNNNNNNNNNNNNNNNNN;;;GGGDDD&&&###dzttt___RRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPUUUnnn}}}cccގގގގގގގގގގގގގގގޙޯ޾þ޾ޯޙގގގގގގގގގގގގގގގdz{{{FFF=========DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDD============DDDNNNNNNNNNNNNNNNNNNFFF>>>EEEDDD888222++++++###;;;$$$dzxxxmmmTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWWWeee}}}ccc@@ooކގގގގގގގގގގގގގގގޙޯ޾þ޾ޯޙގގގގގގގގގގގގގގގކoo@@dzrrr555222222222222'''555NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN===555222222222222'''555NNNNNNNNNNNNNNNPPeeLLL;;;UUUHHHAAABBB888...+++***333***999)))***dznnn]]]8;8+2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++.+BBBNNNNNNPPPTTTnnnccc@@ooކގގގގގގގގގގގގގގގޙޯ޾޾ޯޙގގގގގގގގގގގގގގގކoo@@dz@@@BBB@@@@@@@@@===888'''DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHH@@@BBB@@@@@@@@@===888'''DDDNNNNNNNNNNNN@@ގWWvvvvvvttގ55FFF"BH8NTDDD(((AAAH@@`i]N2''***GGG...###<<>>zzz-00BFF'22"22".."++'++-00@@@***888...dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~ccc@@ooކގގގގގގގގގގގގގގގގގގކoo@@dzFFFNNNes`urfz@@@222'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''+++FFFNNNes`urfz@@@222===NNNNNNNNNNNN@@ގގގގގWWvvvvvvvvvvvvvvvvvvvvvvvvxxގގގގގ55TTTJJJZϐjz888777777CCCJJJiDD];''+++***<<<rrrxxxMSS2BB5HH5JJ5JJ2FF.BB'88++!**000DDD888dzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}ccc@@ooކގގގގގގގގގގގގކoo@@dzFFFNNNYckT`mZnWcn@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;===NNNYckT`mZnWcn@@@222===NNNNNNNNNNNNooގގގގގޯxxvvvvvvvvvvvvvvvvvvvvvvvvvvަގގގގގ__CCC[[[JJJOOO+Zao///<<<@@@<<<%%%JJJTTTWWWFFpF''222+++***BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""dznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc@@ooކގގގގގގކoo@@dzFFFNNNHHHFFFFFFDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNކގގގގގ޾xxvvvvvvvvvvvvvvvvvvû޻ގގގގގނIIIDDDAAAuuujjj>>>{ @@@<<<888JJJUUU\\\___++Y;;;222...GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***dzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmccc@@ooކކoo@@dzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNN@@ގގގގގޙxxvvvvvvvvvvÖޖގގގގގ55MMMDDDkkkBBB[gZgR]CL*0;;;BBB666@@@;;;JJJTTTZZZ___vZZf@55555@@@888***HHHBBB@@@999<<>>JJJTTTZZZ]]]___DDpJ""222LLLHHH888***CCCfffHHH;FFBZZD__F``F``F``F``F``F``F``F``D]]@WW8LL'88'++BBBDDD***dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccdzFFFNNNes`urgzFFFFFFFFFFFFFFFFFFFFFBBB;;;555222222222222222222222222888===DDDFFFFFFFFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNކގގގގގ޾__˂û޻ގގގގގނ]u|~n}NZ38JJJTTTZZZ]]]______22{R222UUUTTTHHH888***FFFQQQFYYD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<dzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}cccdzFFFNNNYckT`mZnYcnFFFFFFFFFFFFFFFDDDPB5rLUZ\\\\\ZWwP`@;."...@@@FFFFFFFFFFFFYbkT`mZnWcn@@@222===NNNNNNNNNNNN@@ގގގގގޙû޻ގWWttގ޾Öޖގގގގގ55}gvJJJTTTZZZ]]]___```___22T222ZZZZZZTTTHHH888AAA;;;888888BZZFbbHeeJccF``F``F``F``F``F``F``F``B\\=TT2FF"..555888)))dznnnFLFJPJFLFFLFFLFFLFFLFbebbebFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnncccdzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFFFFZ+txzzzxxxxxwup`T8...DDDFFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNooގގގގގޯæަގގWWttގގޯæަގގގގގ__vT_JJJTTTZZZ]]]___``````___22FF''U222]]]___ZZZTTTHHH888***GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999dzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccdzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFiR=~āÁÀ€~}{u`;."===FFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNNކގގގގގ޾ÖޖގގގWWttގގގޙû޻ގގގގގނOOOJJJ>>>~_m)5;...;;;JJJTTTZZZ]]]___`````````___22++RRW555___```___ZZZTTTHHH888***>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttcccvvvvvvdzFFFNNNes`urgzFFFFFFFFFFFFm'ʅɄȃǂłłŁŁŁŁŁÁ€~{p`@888FFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNN@@ގގގގގޙû޻ގގގގގWWooގގގގގ޾Öޖގގގގގ55EEE;;;999:::;;;@@@BBBBBBDDDCCC@dm;k5gvRY[uuuxxxwwwtttiiitttAAA>>>===@@@JJJTTTZZZ]]]___````````````___DD;;ꁁR++555`````````___ZZZTTTHHH888***QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccvvvvvvvvvvvvdzFFFNNNesbsrgzFFFFFFFFFFFFx·ˆʅȄǃǃǃǃǃǂǂƂŁ€}uwP222FFFFFFFFFcr`upfz@@@222===NNNNNNNNNNNNooގގގގގޯæަގގގގގ__ooގގގގގޯæަގގގގގ__RRR]]]CCCBBBGGGSSS^^^iwgv/3DDDHHHhhhvvvJJJTTTZZZ]]]___```````````````___{ZZ88H;;555````````````___ZZZTTTHHH888GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@dzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFkokkokFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}cccvvvvvvvvvvvvvvvvvvdzFFFNNNYckU]gZnYcnFFFFFFFFFFFFłω͈ˆɄȄȃȃȃȃȃǃǃƂÁ~wW222DDDFFFFFFYbkT`mZk{Wcn@@@222===NNNNNNNNNNNNކގގގގގ޾Öޖގގގގގ55@@ގގގގގޙû޻ގގގގގނPPP888B˶r`mDDD222JJJTTTZZZ]]]___``````````````````___bbb22""텅z''DDD555```````````````___ZZZTTTHHH888***???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""dznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnncccvvvvvvvvvvvvvvvvvvvvvvvvdzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFȄыϊ"ˆʅɄȄȄȄȄȃȃǃǂŁxZ222DDDFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNގގގގގޙû޻ގގގގގނކގގގގގ޾ÖޖގގގގގNNN7775mz+"~BBBKKKTTTZZZ]]]___`````````````````````___bbbZZTTJJZFFDDD555``````````````````___ZZZTTTHHH888***GGG@@@TTTHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFHHH888"""dzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFbebFLFbebbebFLFFLFbebFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvdzFFFNNNU]eU]f]rYcnFFFFFFFFFFFFʄҌ"ϋ'̇ʅɄȄȄȄȄȄȃȃǂŁx\222DDDFFFFFFT\cT`k\oWcn@@@222===NNNNNNNNNNNNގގގގގޯæަގގގގގ__ooގގގގގޯæަގގގގގHHH777999===0,]hFFF666!!!>>>(((TTTYYYZZZ]]]___````````````````````````___bbbccc\\..''gLLLLLDDD555`````````````````````___ZZZTTTHHH888###DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttcccvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvdzFFFNNNescrrgzFFFFFFFFFFFFʄҍ"Ћ'̇ʅɄȄȄȄȄȄȄȃǃŁx\222DDDFFFFFFcr`uofz@@@222===NNNNNNNNNNNNގގގގގ޾Öޖގގގގގ55eeHH@@ގގގގގޙû޻ގގގގގJJJUUU;;;???TTTWEEEBBB...@@@YYY```bbb``````````````````````````````___bbbccceeeiii``HHFFvTTWWWTTTLLLDDD555````````````````````````___ZZZRRRDDD...AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))dz|~|FLFJPJFLFFLFFLFFLFFLFuxu~~FLFFLFuxuuxuuxuFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvdzFFFNNNescrrgzFFFFFFFFFFFFʄҍ"Ћ'̇ʅɄȄȄȄȄȄȄȃǃŁx\222DDDFFFFFFcr`uofz@@@222===NNNNNNNNNNNNގގގގގ޾Öޖގގގގގ55jjPP@@ގގގގގޙû޻ގގގގގPPPGGGBBB:::<<>>Oekhvsusm|`oPZEODDDDDD:::\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..dznnnFLFJPJFLFFLFFLFFLFFLFUYUUYUFLFFLF~~FLFFLF~~FLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnncccvvvvvvvvvvvvvvvvvvvvvvvvdzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFʅԏ+э.͈˅ʅɄɄȄȄȄȄȃǃłz\222FFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNގގގގގޙû޻ގގގގގނކގގގގގ޾Öޖގގގގގ>>>;;;<<GHHHIIIBBB;;;\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccvvvvvvdzFFFNNNes`urgzFFFFFFFFFFFFv'nѥߠ\ю2Ή͈̇̇̇̇ˆˆʅȃÁxrLBBBFFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNN@@ގގގގގޙû޻ގގގގގWWooގގގގގ޾Öޖގގގގގ55^^^TTTBBBt_mFR"\\\\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...GGG@@@TTTHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFHHH888"""dzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}cccdzFFFNNNYckT`mZnYcnFFFFFFFFFFFFvY=ޛFѥ]Ւ;э.Ќ'Ћ'Ћ'ϋ'ϊ"͈ˆɄātPB5FFFFFFFFFFFFYbkT`mZnWcn@@@222===NNNNNNNNNNNNކގގގގގ޾ÖޖގގގWWttގގގޙû޻ގގގގގނ@@@D{m|NZ7=VVVBBBJJJ\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...JJJB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%!!!dznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnncccdzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFFFFu+ޛFnߝRג8ԏ+ҍ'ҍ"ҍ"Ҍ"ыω·ʅ~Z+DDDFFFFFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNooގގގގގޯæަގގWWttގގޯæަގގގގގ__PPP===tZgBLBBB\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))"""dzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccdzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFFFFFFFvY=v'~ɄʅʅʄʄʄȄłxm'iR=FFFFFFFFFFFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNN@@ގގގގގޙû޻ގWWttގ޾Öޖގގގގގ55OOO;;;xesHQDDD444\\\cccffffff``````````````````````````````eeefffkkkǀbbb]]]ZZZUUUPPPFFF@@@```````````````````````````]]]UUUHHH...KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttcccdzFFFNNNes`urgzFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFcr`urfz@@@222===NNNNNNNNNPPPކގގގގގ޾__΂û޻ގގގގގނPPP888}jzJUDDD\\\cccffffff```````````````````````````bbbfffgggiiivvvccc```\\\YYYRRRJJJNNN```````````````````````````]]]UUUHHH...DDD777BYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccdzFFFNNNes`urgzFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFcr`urfz@@@222===NNNNNNPPPRRRooގގގގގޯxxvvæަގގގގގ__JJJ888.L;n~LWGGG+++\\\cccffffff``````````````````````````````cccfffffffffeeecccbbb___\\\WWWRRRPPP___```````````````````````````]]]UUUHHH...>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***dzFLFJPJFLFDJDFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUfff}}}cccނ__5555__ނdzFFFNNNYckT`mZnYcnFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFYbkT`mZnWcn@@@222===NNNNNNYYYTTT@@ގގގގގޙxxvvvvvvvvvvÖޖގގގގގ55JJJZϒv2pKVJJJ\\\cccffffff```````````````````````````````````````]]]]]]\\\ZZZYYYWWWWWWZZZ`````````````````````````````````]]]UUUHHH...NNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$dznnnFLFJPJDJDBHBW]WFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNYYYTTTnnncccގގގނ__5555__ނގގގdzFFFNNNHHHFFFFFFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFFFFDDD@@@222===NNNRRR```UUUކގގގގގ޾xxvvvvvvvvvvvvvvvvvvû޻ގގގގގނPPPGGG&{ToHRPPPGGG]]]eee___WWWJJJ222\\\]]]TTT;;;\\\]]]TTT;;;]]]eee___WWWJJJ222>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###dzuuuWWWeeeFLFJPJ@F@@F@HNHW]WFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNN]]]gggNNNnnncccގގގގގގނ__5555__ނގގގގގގdzFFFNNNU]eT`k]rWcnBBBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNNU]eT`k]rWcn@@@222===NNN___gggYYYooގގގގގޯxxvvvvvvvvvvvvvvvvvvvvvvvvvvަގގގގގ__vem|#CKfffvvvbbbZZZLLL???___]]]]]]UUU@@@___]]]]]]UUU@@@fffvvvbbbZZZLLL???BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...dz|~|FLFJPJBHB;@;@F@BHBDJDFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{|||cccގގގގގގގގގނ__5555__ނގގގގގގގގގdzFFFNNNes`urfz@@@888@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDFFFNNNes`urfz@@@222===RRRmmmtttZZZ@@ގގގގގWWvvvvvvvvvvvvvvvvvvvvvvvvxxގގގގގ55HͯYcrbbbfffeee```YYYJJJXXX]]]]]]UUUDDD<<<XXX]]]]]]UUUDDD<<<bbbfffeee```YYYJJJNNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;dz|~|FLFJPJFLFBHB@F@DJDFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~mcccގގގގގގގގގގގގނ__5555__ނގގގގގގގގގގގގdzFFFNNNes`urfz@@@222===eeeFFFNNNes`urfz@@@222===eee~~~___ކގގގWWvvvvvvvvvvvvvvvvvvttގގގނ5N_2{oooaaa]]]YYYTTTXXX]]]\\\UUUHHH333XXX]]]\\\UUUHHH333oooaaa]]]YYYTTTNNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===dzRWRosoJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJBHBBDBcccގގގގގގގގގގގގގގގނ__5555__ނގގގގގގގގގގގގގގގdzHHHgggbjsUbn\oYeo@@@222FFFHHHgggbjsUbn\oYeo@@@222FFF```ooގގWWvvvvvvvvvvvvttގގ__n~v~ii~vDDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000dzRWRFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFLRLccc޻ަޖގގގގގގގގގގގގގގގނ__5555__ނގގގގގގގގގގގގގގގޖަ޻dzHHHgggNNNNNNJJJBBB555{{{HHHgggNNNNNNJJJBBB555{{{ccc@@ގWWvvvvvvttގ55{Mgncpckooo\\\FFF>>>YYYHHH888IIIfff999888GGGdzcccû޻ަޖގގގގގގގގގގގގގގގނ__5555__ނގގގގގގގގގގގގގގގޖަ޻ìdz{{{HHHHHHFFFFFFFFF@@@rrr{{{HHHHHHFFFFFFFFF@@@rrrcccPPeeggLLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<dzcccû޻ަޖގގގގގގގގގގގގގގގގގގގގގގގގގގގގގގޖަ޻ìdzcccH"!nkNNN>>>KKKBBBdzcccû޻ަޖގގގގގގގގގގގގގގގގގގގގގގގގޖަ޻ìdzcccNNNAAAHHHǵcccû޻ަޖގގގގގގގގގގގގގގގގގގޖަ޻ìǵcccssscccû޻ަޖގގގގގގގގގގގގޖަ޻ìccc|||ޙޯ޾û޻ަޖގގގގގގޖަ޻þ޾ޯޙ|||oo__5555__WWNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNN=J+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYYjjjUUUDDD==============================;;;NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUUUDDD==============================;;;NNNjjjNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5ccc___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNZm`uTfL\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5ccccccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;PPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBZm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5dzvvUU..''JJjjcccgggooorrrmmmrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrooofffYYY===YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555Zm`ucx8p@n~ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkTeL\=J+5dzkk""TTcccgggooorrrfffiiioooooooooooooooooooooooojjj\\\UUUjjjjjjjjjfffZZbPP`FFf@@e@@cBB`JJZTT\___gggjjjjjjjjjrrruuuooooooooooooooooooooooooooorrrfffYYY===888222.......................................###```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...Zm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5dzYY==cccgggooorrrfffYYY___gggggggggggggggggggggccc___jjjffgRRk22~""i@@UZZ]iiijjjjjjgggggggggggggggggggggjjjooorrrfffYYY===GGGLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzuuWW|cccgggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjffiDDx''..55..22YWWYiiijjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===JJJTTTYYYWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888###ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzNN..cccgggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjPPv''55JJJJJJJJ55''..LLZZ5588T```jjjjjjjjjjjjjjjjjjgggooorrrfffYYY===EEE333((( GGG999666+++JJJTTTZZZ]]]___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZRRRDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz..''..22cccgggooorrrfffYYY===jjjjjjjjjjjjjjjggk55''TTeetjjjjjjjjjjjjjjjjjjjjjjjjeexTT''ZZzz22eUUYjjjjjjjjjjjjjjjgggooorrrfffYYY===RRRNNN"""&&&,,,///999[[[TTT"""''''''+++000444@@@JJJTTTZZZ]]]___```````````````````````````````````````___WWWJJJ222ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz..ffjjFFTTcccgggooorrrfffYYY===jjjjjjjjjjjjbbo""'']]~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj]]++}}oosNNWiiijjjjjjjjjgggooorrrfffYYY===CCCUUUDDDJJJTTTZZZ]]]___``````````````````````````````````````````\\\ZZZLLL111ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz....eebbcccgggooorrrfffYYY===jjjjjjjjjbbrJJjjjjjjjjjjjjjjjccfWWbHHeBBe@@cDD]NNY\\]fffjjjjjjjjjjjjJJbbߎzNNWjjjjjjjjjgggooorrrfffYYY===jjj@@@sss```JJJTTTZZZ]]]___`````````````````````````````````````````````JJJWWWGGG"""ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzPPffDDTT..cccgggooorrrfffYYY===jjjjjjggn''ZZxjjjjjjjjjjjjUUm22""gDDU```jjjjjjjjjZZRRיsUUYjjjjjjgggooorrrfffYYY===111\\\DDD|||JJJTTTZZZ]]]___````````````````````````````````````````````````222???###ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzwwjjWW|cccgggooorrrfffYYY===jjjjjj55bbtjjjjjjjjj]]o++++8888nHHTfffjjjjjjbbRR׎e```jjjgggooorrrfffYYY===)))222iiiAAADDDJJJTTTZZZ]]]___```````````````````````````````````````````````````;;;$$$""""""ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzwxz.55PRRoopjjcccjjjuuuiii\\\DDDjjjTTZZtjjjjjjjjjLL}..BBJJJJBB..22``ff22TbbbjjjjjjZZbboo88Tiiijjjuuuiii\\\DDDCCC&&&IIILLL```>>>dddhhhHHHJJJTTTZZZ]]]___``````````````````````````````````````````````````````333***999)))!!!888"""222999)))%%%888"""222999)))***ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz\\++++'''"wwwjjTT==cccjjjrrruuujjj\\\UUUggnHH}jjjjjjjjjBBJJeesjjjjjjjjjjjjjjjjjjeexJJBBԒLL++\bbbjjjjjjJJ}}22WWYjjjrrruuujjj\\\UUUSSSBBBfff:::AAA???JJJTTTZZZ]]]___`````````````````````````````````````````````````````````GGG...###<<>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz..B]pFczLevBZ=T8N5H.BTTcccjjjjjjjjjjjjjjjWW""jjjjjjjjj..55jjjjjjjjjffk==++_WWYiiijjjjjj88n```jjjjjj''ZZ@@UjjjjjjjjjjjjjjjNNNDDD666NNNCCC)58crm|opn~jzesZgNZFR>G???@@@;;;555555555222222222222555555555555555555555555555555555555555888@@@YYY___ 999<<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5Ǟwxz.25+HeHg~Un"LfD]@Y=T"+FFcccjjjjjjjjjjjjjjj==LLnjjjjjjWWccjjjjjjjbbs''FFBBwLLUiiijjjeexBBffDDUjjjjjjTTLL""igggjjjjjjjjjjjjRRR666((("37Y^a,;=%*uuu]]]IRn~{}xtm|_mNZEOCCCJJJJJJFFFH;;R++WUTRJ""@55@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@222222UUU...DDDPPPTTT\BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5\\++'''".;PLiLiHeF`'++jj22jjcccjjjjjjjjjjjjjjj``ejjjjjj==FFvjjjjjjggn..JJJJ..ZZwWWYjjjjjjJJ``""gfffjjjeex....___jjjjjjjjjjjjRRR$AI`mgvgv_mT_+;?uuuHR{{tiwUbFPEEENNN\HHj@@|""{pfWLBBLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLHHH@@@...===555TTT___```H"GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5\\=U8L2D'8"2".++'8.@"+++..JJcccjjjjjjjjjjjjbbziiijjjggnbbfjjjjjjBB]]zjjjjjjjjjjjj]]JJՎ++_gggjjjeex2288\\]jjjjjj''55TT\jjjjjjjjjjjj@@@Knw~~vgvNZ:@!&wm|WcEOGGGYHHoWJJTTTTTTTTTTTTTTTTTTTTTTTTTTTPPPFFF555...PPPҤJHHHBBB@@@999<<>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5]]""vvjj".++8L+=".++++UUcccjjjjjjjjjjjjbb~++|cccjjjggp==UUZjjjjjjBBDDPeeejjjjjjjjj\\p==jjjjjjeesccfjjjjjj''ZZbjjjjjjjjjjjjIII4)ZeHv{Z.hvaefpppaaa|ZZ""w\\eeeeeeeeeeeeeeeeeeeeeeeeeeebbbZZZLLL@@@555\\\___```N5NNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5..FFjj+;+++8L+=".++++ffvvcccjjjjjjjjjjjjjjj;;UUZjjjjjj==\\22Yiiijjjggs;;ҡn88b==i''ffkjjjjjjJJ22jjjjjjeetfffjjjjjjjjjjjjTTTJJJ8n{>_g;;;wPel___cccYYPP..22vZZcccccccccccccccccccccccccccccc```YYYLLLRRRWWWmHn>>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5Ǟ@@jjjj8L+;+++8N.=".++++cccjjjjjjjjjjjjjjj==LL;;UjjjjjjWW]]88TTYjjjjjjbb;;ҊRRbbsjjjjjjeepUUmjjjjjjTT22~jjjjjjjjjjjjjjjIIIBBB@dnu```GGG555~Rpxooo___cccfffeee{ZZDD22222222DDvZZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___WWWNNN```222\\\iiinnn5BBBFFFYYYAAAFYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRY``>>>aaa...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzNNffjjjj8N+;+++8N.@".++++""cccjjjjjjjjjjjjjjjWWRRsbbbjjjjjj22Ņe___jjjjjjggsBB..;;""BBggnjjjjjjjjj55++jjjjjjjjj''RRkjjjjjjjjjjjjjjjKKKHHHLLL:::OOOBBB>>>10___bbb```____________________________________________________________]]]YYY___```TTT^^^NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzppDDjjjj8N+;.++8N5H5H2D+@'5"...kkcccjjjjjjjjjjjjjjjggp..ZZDDPjjjjjj]]]]uu''\]]]jjjjjjjjjggrZZNNNNZZggojjjjjjjjjjjjBB]]ojjjjjj]]~ffgjjjjjjjjjjjjjjjJJJSSS;;;IIISSS"?ooo___cccsss൵ccc````````````````````````````````````````````````````````````NNNTTTAAADDDDRRBYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BZZFYY;FFbdd]]]000rrr===ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzYY""jj8N+;.++Lg8J"2+".2DF`ffcccjjjUUUDDD;;;NNNjjjJJssp]]]jjjjjjNN}}jjeTTYiiijjjjjjjjjjjjjjjjjjjjjjjjjjjccj55LL}jjjjjjjjj''DDxjjjUUUDDD;;;NNNjjjGGGCCC@@@EEE444dddgggxxx൵ccc`````````````````````````````````````````````````````````DDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzjjLLjj8N+;.++.@BNWfmt\fnfpzYYccc___\\\\\\TTT@@@NNNggs;;tt22WfffjjjjjjBB}}uu22YUUZeeejjjjjjjjjjjjjjjbbfFFvBBjjjjjjjjjJJffi___\\\\\\TTT@@@NNNIIIFFFIII^^^BBBTTT@@@qqqdddgggxxx൵ccc``````````````````````````````````````````````````````ooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGGccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dznnjj=T@Ue=R8L2D'8+ccccccjjjiiibbbTTT;;;jjjTTvvLLBBRiiijjjjjjNN]]߅88t..f;;c==f55p""NNjjjjjjjjjZZxPPvjjjcccjjjiiibbbTTT;;;\\\111666DDDLLLGGG777dddgggxxx൵ccc```````````````````````````````````````````````````LLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz{{nnjjfu+;'5'8@NY.PeuucccgggooorrrfffYYY===jjjjjj55""HHPiiijjjjjj]]22]]\\==..]]xjjjjjjjjjbbt55jjjjjjgggooorrrfffYYY===ppp???+++DDDFFFUUUDDD@@@qqqdddgggxxx൵ccc````````````````````````````````````````````````NNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBBccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dztt\\""eeNNcccgggooorrrfffYYY===jjjjjjggs88ΤBBRfffjjjjjjjjjWW==22''==WWjjjjjjjjjjjjZZt""ggkjjjjjjgggooorrrfffYYY===IIIDDDEEEBBBOOO===TTTdddgggxxx൵ccc`````````````````````````````````````````````+++...@@@NNNAAAGGG???AAAGGG???AAAHHHccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzssLLff++..cccgggooorrrfffYYY===jjjjjjjjjbb@@Ӥ""22W]]]jjjjjjjjjjjjggp]]TTNNNNTT]]ggnjjjjjjjjjjjjiiiHH}bbojjjjjjjjjgggooorrrfffYYY===<<<III;;;qqqdddgggxxx൵ccc``````````````````````````````````````````888888***GGGsssQQQsssQQQsssccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz~~LLFFvv\\..cccgggooorrrfffYYY===jjjjjjjjjjjjbb88ΜLLpDDPbbbjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjYYm""''bbrjjjjjjjjjjjjgggooorrrfffYYY===LLL===BBB@@@[[[dddgggxxx൵ccc```````````````````````````````````````NNNHHH888666ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzss\\..cccgggooorrrfffYYY===jjjjjjjjjjjjjjjggs55vvtts;;UUUZccciiijjjjjjjjjjjjjjjiii``eLLn""55ggnjjjjjjjjjjjjjjjgggooorrrfffYYY===PPP!!!,,, JJJ""""""))) qqqdddgggxxx൵ccc````````````````````````````````````ZZZRRRDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzttnnPPcccgggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjTT;;ssZZ|''n55c;;c==f;;j..xTTjjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===NNNEEEBBB999999BBBTTTIIIEEEEEE===999BBBdddgggxxx௯ffffffffffffffffffffffffffffffffffff___WWWJJJ222ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz{{nnLLwwcccgggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjggsJJ..RRLL;;JJggnjjjjjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===qqqdddgggwwwffffffffffffffffffffffffffffffffffffbbbZZZLLL???eeemmmpppΨoooeee___UUUHHH222Zm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5dzjjYYDD\\cccgggooorrrfffYYYBBB=====================;;;NNNjjjggpWW==++++""==WWggnjjjUUUDDD=====================___ooorrrfffYYY===bbbfffeeecccccccccccccccccccccccccccccccccccc```YYYJJJbbbnnnrrrΔwwwggg```YYYJJJ888Zm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5dzppNN@@..""..oocccgggooorrrfff\\\YYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjbb~ZZNNNNNNNNZZbbzjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYiiirrrfffYYY===oooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTTYYYnnnrrrzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pppiiibbbYYYHHHDDDZm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5dz]]WWRR\\cccgggooorrrgggfffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiifffffffffffffffffffffffffffmmmfffYYY===NNNfffppprrrrrrpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmggg```UUUDDDNNNZm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5ǵcccjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDNNNPPPfffnnnnnnmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjeee\\\NNNLLLNNNZm`t`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`uJZ+5cccjjjrrruuuoooooooooooooooooooooooooooooojjj\\\UUUjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjrrruuuoooooooooooooooooooooooooooooojjj\\\UUUNNNNNNNNNYYYbbbeeecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc```YYYPPPNNNNNNNNNWjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=J|||jjjjjjjjjggggggggggggggggggggggggggggggccc___jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggggggggggggggggggggggggggggggccc___jjj|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY=J+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY|||Y8YYYTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTLLH8HYYYcccZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5cccn~~zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzssYYH8HcccZm`uTfL\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5ccc+"ssLL"""dzcccZm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5dzccc+J]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]TzzTT###dzcccZm`ucx8p@n~ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkTeL\=J+5dzcccnJ''''''''''''''''''''''''''''''''''''''''2]zzTT-NWR]P\LWDM9A;;;$$$dzcccZm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5dzccc{8']zzTTOekhvsusm|`oPZEOn;J333***999)))***dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTRpxw}vkzWcFP5H8HGGG...###<<G???222...666GGG^^^nnn```TTT999]]]nnn```TTT999111222...###<<<===,,,>>>zzz-00BFF'22"22".."++'++-00@@@***888...dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTt_mFR"JJJLLLJJJDDD888***@@@TTTiii___PPPLLLccc___PPPGGGLLLJJJDDD888***<<<rrrxxxMSS2BB5HH5JJ5JJ2FF.BB'88++!**000DDD888dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT?{m|NZ7=TTTYYYZZZWWWRRRHHH888...\\\\\\FFF NNNTTTDDD ???WWWZZZWWWRRRHHH888###BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTBBBtZgBL@@@YYY```bbb___ZZZNNN888+++222WWW555......PPP555...222JJJ\\\___ZZZRRRDDD...GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT999 xesHQ444\\\cccffffff`````````````````````````````````RRR@@@222222222...++++++...===UUU___```````````````````````````]]]UUUHHH...HHHBBB@@@999<<>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTJJJ@@@HͯYcrDDDTTTGGG\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTBBB;;;TTT1N_2{```[[[\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTIII===@@@n~)59DDD|||sssUUU\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTOOODDD777{IR???hhh\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...GGG@@@TTTHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFHHH888"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTGGG@@@444HRFFFddd\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTBBBEEE>>>9!&uuuAAA999\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT999 IIIBBB555\gZgR]CL*0]]]]]].../// ]]]eeeccc````````````````````````___bbbccceeeiiiz``HHFFgTTWWWTTTLLLDDD555```````````````````````````___WWWJJJ222GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT999,,,OOOGGG;;;)Ze{~wiwPZ:@uuuuuu,,,(((fffwww൵ccc`````````````````````___bbbcccw\\..~''WJJLLLDDD555````````````````````````___]]]YYYLLL888>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTBBB!!!>_g~n}NZ+;?&&&333bbbgggxxx൵ccc``````````````````___bbbvZZoLBBDDD555___``````````````````___]]]ZZZTTTGGGQQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTEEE}gv"""qqqdddgggxxx൵ccc```````````````___bbb22W@@@555]]]```````````````___]]]ZZZTTTJJJGGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTNNNPPP===<<>>AAADDD@@@CCCNNNEEEdddgggxxx൵ccc````````````___vZZf@55555\\\````````````___]]]ZZZTTTJJJ???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTdddLLLEEEDDDDDDBBB@@@;;;:::~_m,;=CCCcccTTTfff```iii\\\jjjRRRqqqdddgggxxx൵ccc`````````___DDpJ""222ZZZ`````````___]]]ZZZTTTJJJGGG@@@TTTHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFHHH888"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT^^^WWWSSSLLL@dn;k5gvY^aNNN@@@BBBLLLdddgggxxx൵ccc``````___22{R222ZZZ``````___]]]ZZZTTTJJJJJJB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%!!!dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTiwgv"37qqqdddgggxxx൵ccc```___22T222\\\```___]]]ZZZTTTJJJAAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTB˶r`mdddgggxxx൵ccc___22FF''U222]]]___]]]ZZZTTTJJJKKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT5n{+"~(((qqqdddgggxxx൵___22++RRW555]]]]]]ZZZTTTJJJDDD777BYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTBBBJJJ4KnwRRR666666dddgggxxx___DD;;ꁁR++555\\\ZZZTTTJJJ>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTDDDHHHIIITTTrRRRDDD999222qqqdddgggsss___{ZZ88H;;555PPPTTTJJJNNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTIII+++666IIICCCJJJKKK6nzlz^k"IQNNNPPP888III111dddccc```eee..""텅|""FFF;;;BBBJJJ>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT???111FFFGGG8oNNNTTTBBB&&&)))qqq___bbbfffPPTTJJj@@JJJ@@@:::BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT\\\III^kSSSCCC___cccYY\HHJJJ???NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTZϐlzooo___ccc""NNNCCCNNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT5]'n}3bl___|ZZYHHEEEDDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTlll555"Wb8iu555pppaaat__8822\NNGGGooo\\\FFF>>>YYYHHH888IIIfff999888GGGdzcccZm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5dzcccdz']zzTTBBB222BBB999bbbeeeccc___YYYKKKLLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<dzcccZm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5dzcccdz']zzTT555<<<LLL555iiioooaaa]]]YYYTTTNNN>>>KKKBBBdzcccZm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5dzcccdz']zzTTIII555@@@@@@NNNAAAHHHǵcccZm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5ǵcccǖ8J"~~YYXXXpppssscccZm`t`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`uJZ+5ccc{JY8Y|||WjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=J|||n++n|||tworld-1.3.0/res/ting.wav0000644000175000017500000001765410125477410015453 0ustar breadboxbreadboxRIFFWAVEfmt "VDdataKSEߦנ7- { N 4wlR  : ](OG 1]P]5 06)F}u a>-X{0IE_ RRFg{ 8xgkw `lt# e4MoV\ Rg_p [W]bi N+0s R ZEUK! a g k n,X ~f3!&8,rV_qQaul>TKH5P qL< ;j7=1sexx -6P` ?s}Y>X<.W4ALIe g>8X)tTh!"}}*30i[ E% gxZ 1j= W)LnJJn@|.1_E,V}N'mzi 0!  OpF L tFLTZ~LB & Rf>.LV9kIaiGg1&o| >9H!?vH%vX3~1plpy =% i߉ C! Mphv  B G %%{ck$/+)K~. r * 7= R} Mm'wZ Y #_4 ) 0|dBv _2JU+d$?CZlZ:F[\m.w]<GV`~l"ew4Iu.^v?A~ a<`Kt `G* - vsY  `6~sR(tk.CQDebZ5C|)Q*a,;xB O]\C ~u w?} GTU  ?\C-0]/{2 /tppRRB )-$z_v0Lc _ S shz) z-cgr F1}=&8Qy*v9h)ogU` Bi3Y<iy8>I#Y9 S 6 @ F!,} x/uTAb2? W `q  P\ 86 \3 {x H  #$ gN[N X/ YUu 94 h p5W * M iAll uD /. *Y -w _ 8] t #X H5Z w KB O Eo=n E=Z)  QK Y ^b :}A }Kd qNkV# f tp D# (cs[  n? 1 Xm\ h < s`* +"- /P8 "N ;13yi y ^^W $ ~ +C Z& nxS sx[G S G /:od { V5R|e*6 ~ AF`Y [|O_ ; 'k:|1^ 7@=q  Sj&F ! $ 8@xH;+<%C6. h~9"~{Y"saN@|3/R"j  h}"]&q9QY *G#$wj}F6sa>0 m=*@j.1glUBAUk'_4[BtN=!CYC.;IWNi@?uT*(J/h]a_x <:6bZr-tY:G`kG0Vb?#q#`cKQ.u| N{L~_6}C qE1*0 T1WtG& +UR"/)3"tV69a\0R&L9TeECSaBi|:NV-T5Wd?KNaYD-oR0X.&#lL],L^pk&QbM {!S  ,j`,rY$ sc;\/J2hpU EPfm!E,U?Ab,r cqw#Xz2XW+;qd@?&.X#Ny%b#3Xd{$fenzQ9-v"&ZOzw%$O| uX UL\#dG=*\ nTdRp+a* ]"J}%?MMh-c rS\,^YpT-NagijLOtI?4x)Ou 6^{a* f*8~)D^k</ FOF-jFGwAO{B,SMm<)F084Rvm*He<rn;iDod{9fpEbw.i\qt }Rp|"=r)tvC!8#* &q2B~[@\-mWa5.}pm;Qwiv\ORc3hilF2XH2]+ k!/jx%HXo<9{nYrr:iS~ZLg jB`$=B-%Op_2?V2Q hk4w@!|= BpJ5Z eE9~y"9ls9 e dmk]s?_^vM}?2\c?MF[d6O${cl,S"{gT&Zr;<4$)mW,$P%0X%(<'V*.*4<"G *-O t"BC'b3_=7XLeGD'iurc<?hzzl>TWtoR[B~[LkK/VT^P,xZKL_-yeIJo#lcWdtW ~[F~h= ~j3 nw=Zf-Oj({JdUdWTSQAJ <O<G:76-'*%.$,(%$  tworld-1.3.0/res/traphit.wav0000644000175000017500000000412610125477410016153 0ustar breadboxbreadboxRIFFNWAVEfmt +"Vdata*xR<i*wz' p  o ! N f m x  [ X - VBY(?emY+>m|uqlhaZRKB=7.)$z'q9tpA 0{tzACg ?j )=a ]!"HRWm7iv{r KL! &'''''(?(c(Z(V(U(M(\(n(y((((()7)h))))*7*I*****Q'N!"|>1S "0AQZnn3`*[ /%d F t , { ! e%<$Q)")6CD1) 0 W0x3EAe  = l  ,  T % [Zc=>x  j+rC@  } } n ` Y ^ ^ U N E < C C 7 & (  AY '0KsL8$g&B n {  I -    \${GYeK   o ,*.@BTk%AU^kt1}_2. infG0##,, ##- _Bt#@X`<y+86/&  RL0*g'Xjr|jW8t\nfvo5C>IWPRPPSU[YPR^eb\WL\V*wRzR I!=#7:%.(!  LX=SGB Ir#(,,&*371*%(1EPRL N&8wQb}rrrmbV>!KG/D4mY_itqomhfdb_WW_]WVND]:Yktworld-1.3.0/res/unslist.txt0000644000175000017500000000416110420255040016211 0ustar breadboxbreadbox[AlexMS1.dat] 246: 01B1 87F61A80: no exit 250: 0284 67F1FA9E: no exit [BrennanG2.dat] 001: 03E7 1B214B64: not enough chips can be collected [BrianP3.dat] 052: 02E0 BD9CA0B7: no exit [Chipster3534.dat] 079: 03C5 956F6BA7: bug room is impassible 083: 0341 F2FF8970: no exit [DanM1.dat] 115: 04E6 83DB1DB4: not enough chips [DrakeW1.dat] 001: 0117 CC4F988E: no exit 009: 0299 BFF7876A: not enough chips [EvanD1.dat] 034: 03E0 21444BAE: not enough time 044: 026F 020096B2: not enough time 124: 02E3 C697D84E: not enough time [HarrisonD1.dat] 001: 02F1 FF05B44D: level ends after six seconds 003: 03D1 98E2549D: trap is impassible 004: 03AA BB6D9986: not enough chips 006: 0465 A25DFB77: fire boots are inaccessible [HarrisonD2.dat] 001: 0526 9EF0590D: bomb is impassible 002: 0496 1019B77A: cannot juggle the necessary footgear 005: 0415 F940689C: cannot open the blue door 006: 0387 778BA113: no exit 007: 03B7 2431B598: exit is unreachable without skates 010: 0321 92D9311E: exit is blocked by walkers 011: 028B 463721BB: force floors are impassible with skates 013: 026B F8E853D3: bombs are impassible 014: 0283 D9B1A5E2: force floor is impassible 015: 02F5 4586CD87: green door is impassible [HerbertH1.dat] 017: 021D EB495D97: all exits are blocked [IDD1.dat] 010: 037A 003C4C2E: not enough chips [JoeP2.dat] 002: 0380 DFD6631E: exit is blocked [JulianD4.dat] 001: 0112 D97E4663: red key is inaccessible [JulianD5.dat] 001: 04C3 8F5039DC: not enough chips [KyleW1.dat] 003: 03B1 759C695E: bugs don't stay in formation 008: 03C7 444F2FFD: cannot return to teleports 012: 0416 397AC27D: unconnected trap button 027: 01A7 08FED2B2: unconnected clone button 031: 03FC FCFD6910: fourth chip is inaccessible 034: 0463 F395198E: can't leave first room 037: 030F F1AA2CC6: top section is inaccessible 048: 0398 FB659E4B: can't leave first room 052: 0274 5DD790A9: can't reach the chips 057: 0283 84154011: can't reach the chips [MewtwoDX1.dat] 065: 01FF 0FCFC126: last chip is inaccessible 086: 04BF FF2CE3A1: fire boots are inaccessible 097: 02D5 13D49C66: not enough chips 102: 02CF 9AA22E70: no exit [TomP1.dat] 001: 0113 4358436E: not enough chips tworld-1.3.0/res/whisk.wav0000644000175000017500000001674010125477410015632 0ustar breadboxbreadboxRIFFWAVEfmt +"Vdata.@MRRQR]ju|xlcZF-xneXJMX_oHlq[B-s\;{~$V$MjsX@4% @j*Ihz[>%~I|ujZHJTq2 )9XqR@=FKI4 '=I9"j+rJNF_$=?6 xXQQj]_w|a-$-0&BDq~Y{f9)b,w{,{0|;o'/867vv8]lI>W4'dzx|FZq niS-Fc4a|\=4fAV;Qw"6Oh\Bc/$v,% "2uxh9< VW{ll" xT* Lu.EHl=<`YYa'[1ZCNS`]+O%` XC>u wqw|TB*:~Z-*&rp\n9|M{09Xlzx){ 9x|'9Q+s8e}L 2j`AJmD^){[;@8, i6#1%gI2nf&j1x0CWd;;t_`bLaU0h^~ a 5 eE]*R2Of\u}N;6+MEE?0v kJgv^3GG)% ,*-r<[`= ) | Ut<gtG-'MFg}` HmTFXJ\^p,MVys@86`pi*y%T.b|NQ7x`;!."H@|cS~tAl/M>xN1].H32 f `h03Gb:6- "]FN8z$b8jJ{*}StEd7W=Amc!hZ'13RH=D<ohgE=CKnID2h| iF.(4HA%Z834oYgUOT&0q{Vr72 ;T20qI6* r5!HxgeEc$C~BC R[ D 4FARF47%qZ9s=3} XD S@v7a\d`&R-U`i^ JA\ -`19y"!mIm7>0 !|%&jqs9@Ef`<I5ls6'+h^W:@PwO.PT~-L*6 Qa7c :gV9/00] +hI ;`J==&ZE9'|Fl_Ox/;ysv>G]!v:&6U#[x[V~rAWr!yW: Z]h_iN}V>{-}{cOyr(:T]28yr*rqhO=0wOs4d;~"` .v_lq= s$SBBq=$ZX|_3hM$Qs'f._.'a*"1io9za7dw`;hf3N7P@N)! %BR.]4mX6eB0~Nil<8'J8#jO"-sSs8E "z';oXzSf?vm-RqjB|sv$T)fjl\X9 Dh OnB)%H/]u u?6;+BRAVVXZf7XV6V Z_mlnuH)&zK"[sm_Ic4To+@0d? 89_&0 y6ZJx_o @]%l"]=Z)2S~sf?ZB3Wkr.r@V75Nju8Kqwwle -+_M0fz.0"j"]Oj+T-X[Q B\K9)Saq|uxA|OwZ;zoF9$VuZ-2H0KHX-xQZ|dB)@QFZzxQ)"FKA89M/2hmcM- V;[H ZXV8$$j"z]|7FZZHBa?=D[x"a@H+@H4@6d_4 4S\c8fch2e)"ZQ RD? 9a=4HFKj7D% )xaQ)hs?=V="- _jO|/E^`i]%)K0mBQmFoVQZ-Q@6l)jK~XHRH[T4zoFD +F $? -'7B+@ _$9FVl]excq~F FMDdq]xsvuTOc+xwVs]~ VQxTRM9VQH F9[lX \_x$' M;D&\e"4_c$oXfc2I4+R%0RcR44"')'XnQ;|xOzq\V  7.)=_|jj|m[oq?F- tworld-1.3.0/sets/0000755000175000017500000000000010420664541014144 5ustar breadboxbreadboxtworld-1.3.0/sets/CCLP2.dac0000644000175000017500000000003507453715615015431 0ustar breadboxbreadboxfile=CCLP2.dat lastlevel=144 tworld-1.3.0/sets/cc-lynx.dac0000644000175000017500000000006407422526532016177 0ustar breadboxbreadboxfile=chips.dat lastlevel=144 ruleset=lynx fixlynx=y tworld-1.3.0/sets/cc-ms.dac0000644000175000017500000000005007402640433015612 0ustar breadboxbreadboxfile=chips.dat lastlevel=144 ruleset=ms tworld-1.3.0/sets/intro-lynx.dac0000644000175000017500000000003407465634611016747 0ustar breadboxbreadboxfile=intro.dat ruleset=lynx tworld-1.3.0/sets/intro-ms.dac0000644000175000017500000000003207465634611016372 0ustar breadboxbreadboxfile=intro.dat ruleset=ms